Browse Source

etcdserver: fix snapshot

Xiang Li 11 years ago
parent
commit
fbc4c8efb5
2 changed files with 46 additions and 3 deletions
  1. 1 2
      etcdserver/server.go
  2. 45 1
      integration/member_test.go

+ 1 - 2
etcdserver/server.go

@@ -144,7 +144,6 @@ func NewServer(cfg *ServerConfig) (*EtcdServer, error) {
 	var n raft.Node
 	var n raft.Node
 	var s *raft.MemoryStorage
 	var s *raft.MemoryStorage
 	var id types.ID
 	var id types.ID
-	var ss *snap.Snapshotter
 
 
 	walVersion, err := wal.DetectVersion(cfg.DataDir)
 	walVersion, err := wal.DetectVersion(cfg.DataDir)
 	if err != nil {
 	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)
 		return nil, fmt.Errorf("unknown wal version in data dir %s", cfg.DataDir)
 	}
 	}
 	haveWAL := walVersion != wal.WALNotExist
 	haveWAL := walVersion != wal.WALNotExist
+	ss := snap.New(cfg.SnapDir())
 
 
 	switch {
 	switch {
 	case !haveWAL && !cfg.NewCluster:
 	case !haveWAL && !cfg.NewCluster:
@@ -206,7 +206,6 @@ func NewServer(cfg *ServerConfig) (*EtcdServer, error) {
 		if cfg.ShouldDiscover() {
 		if cfg.ShouldDiscover() {
 			log.Printf("etcdserver: discovery token ignored since a cluster has already been initialized. Valid log found at %q", cfg.WALDir())
 			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()
 		snapshot, err := ss.Load()
 		if err != nil && err != snap.ErrNoSnapshot {
 		if err != nil && err != snap.ErrNoSnapshot {
 			return nil, err
 			return nil, err

+ 45 - 1
integration/member_test.go

@@ -15,9 +15,13 @@
 package integration
 package integration
 
 
 import (
 import (
+	"fmt"
 	"io/ioutil"
 	"io/ioutil"
 	"os"
 	"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) {
 func TestPauseMember(t *testing.T) {
@@ -74,3 +78,43 @@ func TestLaunchDuplicateMemberShouldFail(t *testing.T) {
 		t.Errorf("unexpect successful launch")
 		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)
+		}
+	}
+}