multi_node_kill_all_and_recovery_test.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package test
  2. import (
  3. "os"
  4. "testing"
  5. "time"
  6. "github.com/coreos/go-etcd/etcd"
  7. )
  8. // Create a five nodes
  9. // Kill all the nodes and restart
  10. func TestMultiNodeKillAllAndRecovery(t *testing.T) {
  11. procAttr := new(os.ProcAttr)
  12. procAttr.Files = []*os.File{nil, os.Stdout, os.Stderr}
  13. clusterSize := 5
  14. argGroup, etcds, err := CreateCluster(clusterSize, procAttr, false)
  15. defer DestroyCluster(etcds)
  16. if err != nil {
  17. t.Fatal("cannot create cluster")
  18. }
  19. c := etcd.NewClient(nil)
  20. c.SyncCluster()
  21. time.Sleep(time.Second)
  22. // send 10 commands
  23. for i := 0; i < 10; i++ {
  24. // Test Set
  25. _, err := c.Set("foo", "bar", 0)
  26. if err != nil {
  27. panic(err)
  28. }
  29. }
  30. time.Sleep(time.Second)
  31. // kill all
  32. DestroyCluster(etcds)
  33. time.Sleep(time.Second)
  34. stop := make(chan bool)
  35. leaderChan := make(chan string, 1)
  36. all := make(chan bool, 1)
  37. time.Sleep(time.Second)
  38. for i := 0; i < clusterSize; i++ {
  39. etcds[i], err = os.StartProcess(EtcdBinPath, argGroup[i], procAttr)
  40. }
  41. go Monitor(clusterSize, 1, leaderChan, all, stop)
  42. <-all
  43. <-leaderChan
  44. result, err := c.Set("foo", "bar", 0)
  45. if err != nil {
  46. t.Fatalf("Recovery error: %s", err)
  47. }
  48. if result.ModifiedIndex != 16 {
  49. t.Fatalf("recovery failed! [%d/16]", result.ModifiedIndex)
  50. }
  51. }