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