etcd_long_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package main
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "net/http"
  6. "os"
  7. "strconv"
  8. "strings"
  9. "testing"
  10. "time"
  11. )
  12. // This test will kill the current leader and wait for the etcd cluster to elect a new leader for 200 times.
  13. // It will print out the election time and the average election time.
  14. func TestKillLeader(t *testing.T) {
  15. procAttr := new(os.ProcAttr)
  16. procAttr.Files = []*os.File{nil, os.Stdout, os.Stderr}
  17. clusterSize := 5
  18. argGroup, etcds, err := createCluster(clusterSize, procAttr)
  19. if err != nil {
  20. t.Fatal("cannot create cluster")
  21. }
  22. defer destroyCluster(etcds)
  23. leaderChan := make(chan string, 1)
  24. time.Sleep(time.Second)
  25. go leaderMonitor(clusterSize, 1, leaderChan)
  26. var totalTime time.Duration
  27. leader := "http://127.0.0.1:7001"
  28. for i := 0; i < clusterSize; i++ {
  29. fmt.Println("leader is ", leader)
  30. port, _ := strconv.Atoi(strings.Split(leader, ":")[2])
  31. num := port - 7001
  32. fmt.Println("kill server ", num)
  33. etcds[num].Kill()
  34. etcds[num].Release()
  35. start := time.Now()
  36. for {
  37. newLeader := <-leaderChan
  38. if newLeader != leader {
  39. leader = newLeader
  40. break
  41. }
  42. }
  43. take := time.Now().Sub(start)
  44. totalTime += take
  45. avgTime := totalTime / (time.Duration)(i+1)
  46. fmt.Println("Leader election time is ", take, "with election timeout", ELECTIONTIMEOUT)
  47. fmt.Println("Leader election time average is", avgTime, "with election timeout", ELECTIONTIMEOUT)
  48. etcds[num], err = os.StartProcess("etcd", argGroup[num], procAttr)
  49. }
  50. }
  51. // TestKillRandom kills random machines in the cluster and
  52. // restart them after all other machines agree on the same leader
  53. func TestKillRandom(t *testing.T) {
  54. procAttr := new(os.ProcAttr)
  55. procAttr.Files = []*os.File{nil, os.Stdout, os.Stderr}
  56. clusterSize := 9
  57. argGroup, etcds, err := createCluster(clusterSize, procAttr)
  58. if err != nil {
  59. t.Fatal("cannot create cluster")
  60. }
  61. defer destroyCluster(etcds)
  62. leaderChan := make(chan string, 1)
  63. time.Sleep(3 * time.Second)
  64. go leaderMonitor(clusterSize, 4, leaderChan)
  65. toKill := make(map[int]bool)
  66. for i := 0; i < 20; i++ {
  67. fmt.Printf("TestKillRandom Round[%d/20]\n", i)
  68. j := 0
  69. for {
  70. r := rand.Int31n(9)
  71. if _, ok := toKill[int(r)]; !ok {
  72. j++
  73. toKill[int(r)] = true
  74. }
  75. if j > 3 {
  76. break
  77. }
  78. }
  79. for num, _ := range toKill {
  80. etcds[num].Kill()
  81. etcds[num].Release()
  82. }
  83. <-leaderChan
  84. for num, _ := range toKill {
  85. etcds[num], err = os.StartProcess("etcd", argGroup[num], procAttr)
  86. }
  87. toKill = make(map[int]bool)
  88. }
  89. <-leaderChan
  90. }
  91. func BenchmarkEtcdDirectCall(b *testing.B) {
  92. procAttr := new(os.ProcAttr)
  93. procAttr.Files = []*os.File{nil, os.Stdout, os.Stderr}
  94. clusterSize := 3
  95. _, etcds, _ := createCluster(clusterSize, procAttr)
  96. defer destroyCluster(etcds)
  97. time.Sleep(time.Second)
  98. b.ResetTimer()
  99. for i := 0; i < b.N; i++ {
  100. resp, _ := http.Get("http://127.0.0.1:4001/test/speed")
  101. resp.Body.Close()
  102. }
  103. }