github.com/vieux/docker@v0.6.3-0.20161004191708-e097c2a938c7/daemon/graphdriver/graphtest/graphbench_unix.go (about) 1 // +build linux freebsd 2 3 package graphtest 4 5 import ( 6 "bytes" 7 "io" 8 "io/ioutil" 9 "path/filepath" 10 "testing" 11 12 "github.com/docker/docker/pkg/stringid" 13 ) 14 15 // DriverBenchExists benchmarks calls to exist 16 func DriverBenchExists(b *testing.B, drivername string, driveroptions ...string) { 17 driver := GetDriver(b, drivername, driveroptions...) 18 defer PutDriver(b) 19 20 base := stringid.GenerateRandomID() 21 22 if err := driver.Create(base, "", "", nil); err != nil { 23 b.Fatal(err) 24 } 25 26 b.ResetTimer() 27 for i := 0; i < b.N; i++ { 28 if !driver.Exists(base) { 29 b.Fatal("Newly created image doesn't exist") 30 } 31 } 32 } 33 34 // DriverBenchGetEmpty benchmarks calls to get on an empty layer 35 func DriverBenchGetEmpty(b *testing.B, drivername string, driveroptions ...string) { 36 driver := GetDriver(b, drivername, driveroptions...) 37 defer PutDriver(b) 38 39 base := stringid.GenerateRandomID() 40 41 if err := driver.Create(base, "", "", nil); err != nil { 42 b.Fatal(err) 43 } 44 45 b.ResetTimer() 46 for i := 0; i < b.N; i++ { 47 _, err := driver.Get(base, "") 48 b.StopTimer() 49 if err != nil { 50 b.Fatalf("Error getting mount: %s", err) 51 } 52 if err := driver.Put(base); err != nil { 53 b.Fatalf("Error putting mount: %s", err) 54 } 55 b.StartTimer() 56 } 57 } 58 59 // DriverBenchDiffBase benchmarks calls to diff on a root layer 60 func DriverBenchDiffBase(b *testing.B, drivername string, driveroptions ...string) { 61 driver := GetDriver(b, drivername, driveroptions...) 62 defer PutDriver(b) 63 64 base := stringid.GenerateRandomID() 65 66 if err := driver.Create(base, "", "", nil); err != nil { 67 b.Fatal(err) 68 } 69 70 if err := addFiles(driver, base, 3); err != nil { 71 b.Fatal(err) 72 } 73 74 b.ResetTimer() 75 for i := 0; i < b.N; i++ { 76 arch, err := driver.Diff(base, "") 77 if err != nil { 78 b.Fatal(err) 79 } 80 _, err = io.Copy(ioutil.Discard, arch) 81 if err != nil { 82 b.Fatalf("Error copying archive: %s", err) 83 } 84 arch.Close() 85 } 86 } 87 88 // DriverBenchDiffN benchmarks calls to diff on two layers with 89 // a provided number of files on the lower and upper layers. 90 func DriverBenchDiffN(b *testing.B, bottom, top int, drivername string, driveroptions ...string) { 91 driver := GetDriver(b, drivername, driveroptions...) 92 defer PutDriver(b) 93 base := stringid.GenerateRandomID() 94 upper := stringid.GenerateRandomID() 95 96 if err := driver.Create(base, "", "", nil); err != nil { 97 b.Fatal(err) 98 } 99 100 if err := addManyFiles(driver, base, bottom, 3); err != nil { 101 b.Fatal(err) 102 } 103 104 if err := driver.Create(upper, base, "", nil); err != nil { 105 b.Fatal(err) 106 } 107 108 if err := addManyFiles(driver, upper, top, 6); err != nil { 109 b.Fatal(err) 110 } 111 b.ResetTimer() 112 for i := 0; i < b.N; i++ { 113 arch, err := driver.Diff(upper, "") 114 if err != nil { 115 b.Fatal(err) 116 } 117 _, err = io.Copy(ioutil.Discard, arch) 118 if err != nil { 119 b.Fatalf("Error copying archive: %s", err) 120 } 121 arch.Close() 122 } 123 } 124 125 // DriverBenchDiffApplyN benchmarks calls to diff and apply together 126 func DriverBenchDiffApplyN(b *testing.B, fileCount int, drivername string, driveroptions ...string) { 127 driver := GetDriver(b, drivername, driveroptions...) 128 defer PutDriver(b) 129 base := stringid.GenerateRandomID() 130 upper := stringid.GenerateRandomID() 131 132 if err := driver.Create(base, "", "", nil); err != nil { 133 b.Fatal(err) 134 } 135 136 if err := addManyFiles(driver, base, fileCount, 3); err != nil { 137 b.Fatal(err) 138 } 139 140 if err := driver.Create(upper, base, "", nil); err != nil { 141 b.Fatal(err) 142 } 143 144 if err := addManyFiles(driver, upper, fileCount, 6); err != nil { 145 b.Fatal(err) 146 } 147 diffSize, err := driver.DiffSize(upper, "") 148 if err != nil { 149 b.Fatal(err) 150 } 151 b.ResetTimer() 152 b.StopTimer() 153 for i := 0; i < b.N; i++ { 154 diff := stringid.GenerateRandomID() 155 if err := driver.Create(diff, base, "", nil); err != nil { 156 b.Fatal(err) 157 } 158 159 if err := checkManyFiles(driver, diff, fileCount, 3); err != nil { 160 b.Fatal(err) 161 } 162 163 b.StartTimer() 164 165 arch, err := driver.Diff(upper, "") 166 if err != nil { 167 b.Fatal(err) 168 } 169 170 applyDiffSize, err := driver.ApplyDiff(diff, "", arch) 171 if err != nil { 172 b.Fatal(err) 173 } 174 175 b.StopTimer() 176 arch.Close() 177 178 if applyDiffSize != diffSize { 179 // TODO: enforce this 180 //b.Fatalf("Apply diff size different, got %d, expected %s", applyDiffSize, diffSize) 181 } 182 if err := checkManyFiles(driver, diff, fileCount, 6); err != nil { 183 b.Fatal(err) 184 } 185 } 186 } 187 188 // DriverBenchDeepLayerDiff benchmarks calls to diff on top of a given number of layers. 189 func DriverBenchDeepLayerDiff(b *testing.B, layerCount int, drivername string, driveroptions ...string) { 190 driver := GetDriver(b, drivername, driveroptions...) 191 defer PutDriver(b) 192 193 base := stringid.GenerateRandomID() 194 195 if err := driver.Create(base, "", "", nil); err != nil { 196 b.Fatal(err) 197 } 198 199 if err := addFiles(driver, base, 50); err != nil { 200 b.Fatal(err) 201 } 202 203 topLayer, err := addManyLayers(driver, base, layerCount) 204 if err != nil { 205 b.Fatal(err) 206 } 207 208 b.ResetTimer() 209 for i := 0; i < b.N; i++ { 210 arch, err := driver.Diff(topLayer, "") 211 if err != nil { 212 b.Fatal(err) 213 } 214 _, err = io.Copy(ioutil.Discard, arch) 215 if err != nil { 216 b.Fatalf("Error copying archive: %s", err) 217 } 218 arch.Close() 219 } 220 } 221 222 // DriverBenchDeepLayerRead benchmarks calls to read a file under a given number of layers. 223 func DriverBenchDeepLayerRead(b *testing.B, layerCount int, drivername string, driveroptions ...string) { 224 driver := GetDriver(b, drivername, driveroptions...) 225 defer PutDriver(b) 226 227 base := stringid.GenerateRandomID() 228 229 if err := driver.Create(base, "", "", nil); err != nil { 230 b.Fatal(err) 231 } 232 233 content := []byte("test content") 234 if err := addFile(driver, base, "testfile.txt", content); err != nil { 235 b.Fatal(err) 236 } 237 238 topLayer, err := addManyLayers(driver, base, layerCount) 239 if err != nil { 240 b.Fatal(err) 241 } 242 243 root, err := driver.Get(topLayer, "") 244 if err != nil { 245 b.Fatal(err) 246 } 247 defer driver.Put(topLayer) 248 249 b.ResetTimer() 250 for i := 0; i < b.N; i++ { 251 252 // Read content 253 c, err := ioutil.ReadFile(filepath.Join(root, "testfile.txt")) 254 if err != nil { 255 b.Fatal(err) 256 } 257 258 b.StopTimer() 259 if bytes.Compare(c, content) != 0 { 260 b.Fatalf("Wrong content in file %v, expected %v", c, content) 261 } 262 b.StartTimer() 263 } 264 }