kill_leader_test.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package test
  2. import (
  3. "fmt"
  4. "os"
  5. "strconv"
  6. "strings"
  7. "testing"
  8. "time"
  9. )
  10. // This test will kill the current leader and wait for the etcd cluster to elect a new leader for 200 times.
  11. // It will print out the election time and the average election time.
  12. func TestKillLeader(t *testing.T) {
  13. procAttr := new(os.ProcAttr)
  14. procAttr.Files = []*os.File{nil, os.Stdout, os.Stderr}
  15. clusterSize := 5
  16. argGroup, etcds, err := CreateCluster(clusterSize, procAttr, false)
  17. if err != nil {
  18. t.Fatal("cannot create cluster")
  19. }
  20. defer DestroyCluster(etcds)
  21. stop := make(chan bool)
  22. leaderChan := make(chan string, 1)
  23. all := make(chan bool, 1)
  24. time.Sleep(time.Second)
  25. go Monitor(clusterSize, 1, leaderChan, all, stop)
  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("Total time:", totalTime, "; Avg time:", avgTime)
  47. etcds[num], err = os.StartProcess(EtcdBinPath, argGroup[num], procAttr)
  48. }
  49. stop <- true
  50. }