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