graphbench_unix.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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. if applyDiffSize != diffSize {
  147. // TODO: enforce this
  148. //b.Fatalf("Apply diff size different, got %d, expected %s", applyDiffSize, diffSize)
  149. }
  150. if err := checkManyFiles(driver, diff, fileCount, 6); err != nil {
  151. b.Fatal(err)
  152. }
  153. }
  154. }
  155. // DriverBenchDeepLayerDiff benchmarks calls to diff on top of a given number of layers.
  156. func DriverBenchDeepLayerDiff(b *testing.B, layerCount int, drivername string, driveroptions ...string) {
  157. driver := GetDriver(b, drivername, driveroptions...)
  158. defer PutDriver(b)
  159. base := stringid.GenerateRandomID()
  160. if err := driver.Create(base, "", nil); err != nil {
  161. b.Fatal(err)
  162. }
  163. if err := addFiles(driver, base, 50); err != nil {
  164. b.Fatal(err)
  165. }
  166. topLayer, err := addManyLayers(driver, base, layerCount)
  167. if err != nil {
  168. b.Fatal(err)
  169. }
  170. b.ResetTimer()
  171. for i := 0; i < b.N; i++ {
  172. arch, err := driver.Diff(topLayer, "")
  173. if err != nil {
  174. b.Fatal(err)
  175. }
  176. _, err = io.Copy(ioutil.Discard, arch)
  177. if err != nil {
  178. b.Fatalf("Error copying archive: %s", err)
  179. }
  180. arch.Close()
  181. }
  182. }
  183. // DriverBenchDeepLayerRead benchmarks calls to read a file under a given number of layers.
  184. func DriverBenchDeepLayerRead(b *testing.B, layerCount int, drivername string, driveroptions ...string) {
  185. driver := GetDriver(b, drivername, driveroptions...)
  186. defer PutDriver(b)
  187. base := stringid.GenerateRandomID()
  188. if err := driver.Create(base, "", nil); err != nil {
  189. b.Fatal(err)
  190. }
  191. content := []byte("test content")
  192. if err := addFile(driver, base, "testfile.txt", content); err != nil {
  193. b.Fatal(err)
  194. }
  195. topLayer, err := addManyLayers(driver, base, layerCount)
  196. if err != nil {
  197. b.Fatal(err)
  198. }
  199. root, err := driver.Get(topLayer, "")
  200. if err != nil {
  201. b.Fatal(err)
  202. }
  203. defer driver.Put(topLayer)
  204. b.ResetTimer()
  205. for i := 0; i < b.N; i++ {
  206. // Read content
  207. c, err := contdriver.ReadFile(root, root.Join(root.Path(), "testfile.txt"))
  208. if err != nil {
  209. b.Fatal(err)
  210. }
  211. b.StopTimer()
  212. assert.DeepEqual(b, content, c)
  213. b.StartTimer()
  214. }
  215. }