mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
server: move TestSingleNodeRecovery under etcd/
This commit is contained in:
parent
ffa5eb08c3
commit
efaef49734
@ -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) {
|
func buildCluster(number int, tls bool) ([]*Server, []*httptest.Server) {
|
||||||
bootstrapper := 0
|
bootstrapper := 0
|
||||||
es := make([]*Server, number)
|
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) {
|
func initTestServer(c *config.Config, id int64, tls bool) (e *Server, h *httptest.Server) {
|
||||||
|
if c.DataDir == "" {
|
||||||
n, err := ioutil.TempDir(os.TempDir(), "etcd")
|
n, err := ioutil.TempDir(os.TempDir(), "etcd")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
c.DataDir = n
|
c.DataDir = n
|
||||||
|
}
|
||||||
|
|
||||||
e, err = New(c)
|
srv, err := New(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
e = srv
|
||||||
e.setId(id)
|
e.setId(id)
|
||||||
e.SetTick(time.Millisecond * 5)
|
e.SetTick(time.Millisecond * 5)
|
||||||
|
|
||||||
m := http.NewServeMux()
|
m := http.NewServeMux()
|
||||||
m.Handle("/", e)
|
m.Handle("/", e)
|
||||||
m.Handle("/raft", e.RaftHandler())
|
m.Handle("/raft", e.RaftHandler())
|
||||||
m.Handle("/raft/", e.RaftHandler())
|
m.Handle("/raft/", e.RaftHandler())
|
||||||
|
|
||||||
if tls {
|
if tls {
|
||||||
h = httptest.NewTLSServer(m)
|
h = httptest.NewTLSServer(m)
|
||||||
} else {
|
} else {
|
||||||
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user