graphbench_unix.go 6.2 KB

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