diff --git a/etcd/etcd_test.go b/etcd/etcd_test.go index 8bc0bea63..7694ad8fb 100644 --- a/etcd/etcd_test.go +++ b/etcd/etcd_test.go @@ -311,6 +311,60 @@ func TestVersionCheck(t *testing.T) { } } +func TestSingleNodeRecovery(t *testing.T) { + id := genId() + dataDir, err := ioutil.TempDir(os.TempDir(), "etcd") + if err != nil { + panic(err) + } + c := config.New() + c.DataDir = dataDir + e, h, _ := buildServer(t, c, id) + key := "/foo" + + ev, err := e.p.Set(key, false, "bar", time.Now().Add(time.Second*100)) + if err != nil { + t.Fatal(err) + } + + w, err := e.p.Watch(key, false, false, ev.Index()) + if err != nil { + t.Fatal(err) + } + select { + case v := <-w.EventChan: + if v.Node.TTL < 95 { + t.Errorf("ttl = %d, want >= 95", v.Node.TTL) + } + case <-time.After(8 * defaultHeartbeat * e.tickDuration): + t.Fatal("watch timeout") + } + + e.Stop() + h.Close() + + time.Sleep(2 * time.Second) + + c = config.New() + c.DataDir = dataDir + e, h, _ = buildServer(t, c, id) + + w, err = e.p.Watch(key, false, false, ev.Index()) + if err != nil { + t.Fatal(err) + } + select { + case v := <-w.EventChan: + if v.Node.TTL > 99 { + t.Errorf("ttl = %d, want <= 99", v.Node.TTL) + } + case <-time.After(8 * defaultHeartbeat * e.tickDuration): + t.Fatal("2nd watch timeout") + } + + destroyServer(t, e, h) +} + func buildCluster(number int, tls bool) ([]*Server, []*httptest.Server) { bootstrapper := 0 es := make([]*Server, number) @@ -342,23 +396,26 @@ func buildCluster(number int, tls bool) ([]*Server, []*httptest.Server) { } func initTestServer(c *config.Config, id int64, tls bool) (e *Server, h *httptest.Server) { - n, err := ioutil.TempDir(os.TempDir(), "etcd") - if err != nil { - panic(err) + if c.DataDir == "" { + n, err := ioutil.TempDir(os.TempDir(), "etcd") + if err != nil { + panic(err) + } + c.DataDir = n } - c.DataDir = n - e, err = New(c) + srv, err := New(c) if err != nil { panic(err) } + e = srv e.setId(id) e.SetTick(time.Millisecond * 5) + m := http.NewServeMux() m.Handle("/", e) m.Handle("/raft", e.RaftHandler()) m.Handle("/raft/", e.RaftHandler()) - if tls { h = httptest.NewTLSServer(m) } else { diff --git a/tests/functional/single_node_recovery_test.go b/tests/functional/single_node_recovery_test.go deleted file mode 100644 index 5f341ba93..000000000 --- a/tests/functional/single_node_recovery_test.go +++ /dev/null @@ -1,68 +0,0 @@ -package test - -import ( - "os" - "testing" - "time" - - "github.com/coreos/etcd/third_party/github.com/coreos/go-etcd/etcd" -) - -// This test creates a single node and then set a value to it. -// Then this test kills the node and restart it and tries to get the value again. -func TestSingleNodeRecovery(t *testing.T) { - procAttr := new(os.ProcAttr) - procAttr.Files = []*os.File{nil, os.Stdout, os.Stderr} - args := []string{"etcd", "-name=node1", "-data-dir=/tmp/node1"} - - process, err := os.StartProcess(EtcdBinPath, append(args, "-f"), procAttr) - if err != nil { - t.Fatal("start process failed:" + err.Error()) - return - } - - time.Sleep(time.Second) - - c := etcd.NewClient(nil) - - c.SyncCluster() - // Test Set - result, err := c.Set("foo", "bar", 100) - node := result.Node - - if err != nil || node.Key != "/foo" || node.Value != "bar" || node.TTL < 95 { - if err != nil { - t.Fatal(err) - } - - t.Fatalf("Set 1 failed with %s %s %v", node.Key, node.Value, node.TTL) - } - - time.Sleep(time.Second) - - process.Kill() - - process, err = os.StartProcess(EtcdBinPath, args, procAttr) - defer process.Kill() - if err != nil { - t.Fatal("start process failed:" + err.Error()) - return - } - - time.Sleep(time.Second) - - result, err = c.Get("foo", false, false) - node = result.Node - - if err != nil { - t.Fatal("get fail: " + err.Error()) - return - } - - if err != nil || node.Key != "/foo" || node.Value != "bar" || node.TTL > 99 { - if err != nil { - t.Fatal(err) - } - t.Fatalf("Recovery Get failed with %s %s %v", node.Key, node.Value, node.TTL) - } -}