rejoin_test.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package test
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "os"
  6. "strconv"
  7. "strings"
  8. "testing"
  9. "time"
  10. "github.com/coreos/etcd/third_party/github.com/coreos/go-etcd/etcd"
  11. )
  12. func increasePeerAddressPort(args []string, delta int) []string {
  13. for i, arg := range args {
  14. if !strings.Contains(arg, "peer-addr") {
  15. continue
  16. }
  17. splitArg := strings.Split(arg, ":")
  18. port, _ := strconv.Atoi(splitArg[len(splitArg)-1])
  19. args[i] = "-peer-addr=127.0.0.1:" + strconv.Itoa(port+delta)
  20. return args
  21. }
  22. return append(args, "-peer-addr=127.0.0.1:"+strconv.Itoa(7001+delta))
  23. }
  24. // Create a five-node cluster
  25. // Random kill one of the nodes and restart it with different peer address
  26. func TestRejoinWithDifferentPeerAddress(t *testing.T) {
  27. procAttr := new(os.ProcAttr)
  28. procAttr.Files = []*os.File{nil, os.Stdout, os.Stderr}
  29. clusterSize := 5
  30. argGroup, etcds, err := CreateCluster(clusterSize, procAttr, false)
  31. if err != nil {
  32. t.Fatal("cannot create cluster")
  33. }
  34. defer DestroyCluster(etcds)
  35. time.Sleep(2 * time.Second)
  36. for i := 0; i < 10; i++ {
  37. num := rand.Int() % clusterSize
  38. fmt.Println("kill node", num+1)
  39. // kill
  40. etcds[num].Kill()
  41. etcds[num].Release()
  42. time.Sleep(time.Second)
  43. argGroup[num] = increasePeerAddressPort(argGroup[num], clusterSize)
  44. // restart
  45. etcds[num], err = os.StartProcess(EtcdBinPath, argGroup[num], procAttr)
  46. if err != nil {
  47. panic(err)
  48. }
  49. time.Sleep(time.Second)
  50. }
  51. c := etcd.NewClient(nil)
  52. c.SyncCluster()
  53. result, err := c.Set("foo", "bar", 0)
  54. if err != nil || result.Node.Key != "/foo" || result.Node.Value != "bar" {
  55. t.Fatal("Failed to set value in etcd cluster")
  56. }
  57. }