diff --git a/etcdserver/server.go b/etcdserver/server.go index c185d16b3..c0fc2ffcc 100644 --- a/etcdserver/server.go +++ b/etcdserver/server.go @@ -144,7 +144,6 @@ func NewServer(cfg *ServerConfig) (*EtcdServer, error) { var n raft.Node var s *raft.MemoryStorage var id types.ID - var ss *snap.Snapshotter walVersion, err := wal.DetectVersion(cfg.DataDir) if err != nil { @@ -154,6 +153,7 @@ func NewServer(cfg *ServerConfig) (*EtcdServer, error) { return nil, fmt.Errorf("unknown wal version in data dir %s", cfg.DataDir) } haveWAL := walVersion != wal.WALNotExist + ss := snap.New(cfg.SnapDir()) switch { case !haveWAL && !cfg.NewCluster: @@ -206,7 +206,6 @@ func NewServer(cfg *ServerConfig) (*EtcdServer, error) { if cfg.ShouldDiscover() { log.Printf("etcdserver: discovery token ignored since a cluster has already been initialized. Valid log found at %q", cfg.WALDir()) } - ss = snap.New(cfg.SnapDir()) snapshot, err := ss.Load() if err != nil && err != snap.ErrNoSnapshot { return nil, err diff --git a/integration/member_test.go b/integration/member_test.go index 6509843ef..fa7d27832 100644 --- a/integration/member_test.go +++ b/integration/member_test.go @@ -15,9 +15,13 @@ package integration import ( + "fmt" "io/ioutil" "os" - "testing" + "reflect" + + "github.com/coreos/etcd/Godeps/_workspace/src/golang.org/x/net/context" + "github.com/coreos/etcd/client" ) func TestPauseMember(t *testing.T) { @@ -74,3 +78,43 @@ func TestLaunchDuplicateMemberShouldFail(t *testing.T) { t.Errorf("unexpect successful launch") } } + +func TestSnapshotAndRestartMember(t *testing.T) { + defer afterTest(t) + m := mustNewMember(t, "snapAndRestartTest") + m.SnapCount = 100 + m.Launch() + defer m.Terminate(t) + + resps := make([]*client.Response, 120) + var err error + for i := 0; i < 120; i++ { + cc := mustNewHTTPClient(t, []string{m.URL()}) + kapi := client.NewKeysAPI(cc) + ctx, cancel := context.WithTimeout(context.Background(), requestTimeout) + key := fmt.Sprintf("foo%d", i) + resps[i], err = kapi.Create(ctx, "/"+key, "bar", -1) + if err != nil { + t.Fatalf("create on %s error: %v", m.URL(), err) + } + cancel() + } + m.Stop(t) + m.Restart(t) + + for i := 0; i < 120; i++ { + cc := mustNewHTTPClient(t, []string{m.URL()}) + kapi := client.NewKeysAPI(cc) + ctx, cancel := context.WithTimeout(context.Background(), requestTimeout) + key := fmt.Sprintf("foo%d", i) + resp, err := kapi.Get(ctx, "/"+key) + if err != nil { + t.Fatalf("get on %s error: %v", m.URL(), err) + } + cancel() + + if !reflect.DeepEqual(resp.Node, resps[i].Node) { + t.Errorf("#%d: node = %v, want %v", resp.Node, resps[i].Node) + } + } +}