etcd_long_test.go 2.8 KB

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