etcd_long_test.go 2.4 KB

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