graphbench_unix.go 6.2 KB

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