github.com/Heebron/moby@v0.0.0-20221111184709-6eab4f55faf7/daemon/graphdriver/graphtest/graphbench_unix.go (about) 1 //go:build linux || freebsd 2 // +build linux freebsd 3 4 package graphtest // import "github.com/docker/docker/daemon/graphdriver/graphtest" 5 6 import ( 7 "io" 8 "os" 9 "path/filepath" 10 "testing" 11 12 "github.com/docker/docker/pkg/stringid" 13 "gotest.tools/v3/assert" 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, "") 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, "") 77 if err != nil { 78 b.Fatal(err) 79 } 80 _, err = io.Copy(io.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, "") 113 if err != nil { 114 b.Fatal(err) 115 } 116 _, err = io.Copy(io.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, "") 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, "") 164 if err != nil { 165 b.Fatal(err) 166 } 167 168 applyDiffSize, err := driver.ApplyDiff(diff, "", arch) 169 if err != nil { 170 b.Fatal(err) 171 } 172 173 b.StopTimer() 174 arch.Close() 175 176 // suppressing "SA9003: empty branch (staticcheck)" instead of commenting-out/removing 177 // these lines because removing/commenting these lines causes a ripple effect 178 // of changes, and there's still a to-do below 179 //nolint:staticcheck,revive 180 if applyDiffSize != diffSize { 181 // TODO: enforce this 182 // b.Fatalf("Apply diff size different, got %d, expected %s", applyDiffSize, diffSize) 183 } 184 if err := checkManyFiles(driver, diff, fileCount, 6); err != nil { 185 b.Fatal(err) 186 } 187 } 188 } 189 190 // DriverBenchDeepLayerDiff benchmarks calls to diff on top of a given number of layers. 191 func DriverBenchDeepLayerDiff(b *testing.B, layerCount int, drivername string, driveroptions ...string) { 192 driver := GetDriver(b, drivername, driveroptions...) 193 defer PutDriver(b) 194 195 base := stringid.GenerateRandomID() 196 if err := driver.Create(base, "", nil); err != nil { 197 b.Fatal(err) 198 } 199 200 if err := addFiles(driver, base, 50); err != nil { 201 b.Fatal(err) 202 } 203 204 topLayer, err := addManyLayers(driver, base, layerCount) 205 if err != nil { 206 b.Fatal(err) 207 } 208 209 b.ResetTimer() 210 for i := 0; i < b.N; i++ { 211 arch, err := driver.Diff(topLayer, "") 212 if err != nil { 213 b.Fatal(err) 214 } 215 _, err = io.Copy(io.Discard, arch) 216 if err != nil { 217 b.Fatalf("Error copying archive: %s", err) 218 } 219 arch.Close() 220 } 221 } 222 223 // DriverBenchDeepLayerRead benchmarks calls to read a file under a given number of layers. 224 func DriverBenchDeepLayerRead(b *testing.B, layerCount int, drivername string, driveroptions ...string) { 225 driver := GetDriver(b, drivername, driveroptions...) 226 defer PutDriver(b) 227 228 base := stringid.GenerateRandomID() 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 // Read content 252 c, err := os.ReadFile(filepath.Join(root, "testfile.txt")) 253 if err != nil { 254 b.Fatal(err) 255 } 256 257 b.StopTimer() 258 assert.DeepEqual(b, content, c) 259 b.StartTimer() 260 } 261 }