transfer-bench_test.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. // Copyright (C) 2014 The Syncthing Authors.
  2. //
  3. // This Source Code Form is subject to the terms of the Mozilla Public
  4. // License, v. 2.0. If a copy of the MPL was not distributed with this file,
  5. // You can obtain one at https://mozilla.org/MPL/2.0/.
  6. // +build integration,benchmark
  7. package integration
  8. import (
  9. "log"
  10. "os"
  11. "testing"
  12. "time"
  13. )
  14. func TestBenchmarkTransferManyFiles(t *testing.T) {
  15. benchmarkTransfer(t, 10000, 15)
  16. }
  17. func TestBenchmarkTransferLargeFile1G(t *testing.T) {
  18. benchmarkTransfer(t, 1, 30)
  19. }
  20. func TestBenchmarkTransferLargeFile2G(t *testing.T) {
  21. benchmarkTransfer(t, 1, 31)
  22. }
  23. func TestBenchmarkTransferLargeFile4G(t *testing.T) {
  24. benchmarkTransfer(t, 1, 32)
  25. }
  26. func TestBenchmarkTransferLargeFile8G(t *testing.T) {
  27. benchmarkTransfer(t, 1, 33)
  28. }
  29. func TestBenchmarkTransferLargeFile16G(t *testing.T) {
  30. benchmarkTransfer(t, 1, 34)
  31. }
  32. func TestBenchmarkTransferLargeFile32G(t *testing.T) {
  33. benchmarkTransfer(t, 1, 35)
  34. }
  35. func benchmarkTransfer(t *testing.T, files, sizeExp int) {
  36. log.Println("Cleaning...")
  37. err := removeAll("s1", "s2", "h1/index*", "h2/index*")
  38. if err != nil {
  39. t.Fatal(err)
  40. }
  41. log.Println("Generating files...")
  42. if files == 1 {
  43. // Special case. Generate one file with the specified size exactly.
  44. var fd *os.File
  45. fd, err = os.Open("../LICENSE")
  46. if err != nil {
  47. t.Fatal(err)
  48. }
  49. err = os.MkdirAll("s1", 0755)
  50. if err != nil {
  51. t.Fatal(err)
  52. }
  53. err = generateOneFile(fd, "s1/onefile", 1<<uint(sizeExp))
  54. } else {
  55. err = generateFiles("s1", files, sizeExp, "../LICENSE")
  56. }
  57. if err != nil {
  58. t.Fatal(err)
  59. }
  60. expected, err := directoryContents("s1")
  61. if err != nil {
  62. t.Fatal(err)
  63. }
  64. var total int64
  65. var nfiles int
  66. for _, f := range expected {
  67. total += f.size
  68. if f.mode.IsRegular() {
  69. nfiles++
  70. }
  71. }
  72. log.Printf("Total %.01f MiB in %d files", float64(total)/1024/1024, nfiles)
  73. sender := startInstance(t, 1)
  74. defer checkedStop(t, sender)
  75. receiver := startInstance(t, 2)
  76. defer checkedStop(t, receiver)
  77. sender.ResumeAll()
  78. receiver.ResumeAll()
  79. var t0, t1 time.Time
  80. lastEvent := 0
  81. oneItemFinished := false
  82. loop:
  83. for {
  84. evs, err := receiver.Events(lastEvent)
  85. if err != nil {
  86. if isTimeout(err) {
  87. continue
  88. }
  89. t.Fatal(err)
  90. }
  91. for _, ev := range evs {
  92. lastEvent = ev.ID
  93. switch ev.Type {
  94. case "ItemFinished":
  95. oneItemFinished = true
  96. continue
  97. case "StateChanged":
  98. data := ev.Data.(map[string]interface{})
  99. if data["folder"].(string) != "default" {
  100. continue
  101. }
  102. switch data["to"].(string) {
  103. case "syncing":
  104. t0 = ev.Time
  105. continue
  106. case "idle":
  107. if !oneItemFinished {
  108. continue
  109. }
  110. if !t0.IsZero() {
  111. t1 = ev.Time
  112. break loop
  113. }
  114. }
  115. }
  116. }
  117. time.Sleep(250 * time.Millisecond)
  118. }
  119. sendProc, err := sender.Stop()
  120. if err != nil {
  121. t.Fatal(err)
  122. }
  123. recvProc, err := receiver.Stop()
  124. if err != nil {
  125. t.Fatal(err)
  126. }
  127. log.Println("Verifying...")
  128. actual, err := directoryContents("s2")
  129. if err != nil {
  130. t.Fatal(err)
  131. }
  132. err = compareDirectoryContents(actual, expected)
  133. if err != nil {
  134. t.Fatal(err)
  135. }
  136. log.Printf("Result: Wall time: %v / MiB", t1.Sub(t0)/time.Duration(total/1024/1024))
  137. log.Printf("Result: %.3g KiB/s synced", float64(total)/1024/t1.Sub(t0).Seconds())
  138. printUsage("Receiver", recvProc, total)
  139. printUsage("Sender", sendProc, total)
  140. }