Browse Source

etcdserver: recover cluster when receiving newer snapshot

Yicheng Qin 11 years ago
parent
commit
77433ff6da
3 changed files with 14 additions and 0 deletions
  1. 4 0
      etcdserver/cluster.go
  2. 1 0
      etcdserver/server.go
  3. 9 0
      etcdserver/server_test.go

+ 4 - 0
etcdserver/cluster.go

@@ -267,6 +267,10 @@ func (c *Cluster) SetID(id types.ID) { c.id = id }
 
 
 func (c *Cluster) SetStore(st store.Store) { c.store = st }
 func (c *Cluster) SetStore(st store.Store) { c.store = st }
 
 
+func (c *Cluster) Recover() {
+	c.members, c.removed = membersFromStore(c.store)
+}
+
 // ValidateConfigurationChange takes a proposed ConfChange and
 // ValidateConfigurationChange takes a proposed ConfChange and
 // ensures that it is still valid.
 // ensures that it is still valid.
 func (c *Cluster) ValidateConfigurationChange(cc raftpb.ConfChange) error {
 func (c *Cluster) ValidateConfigurationChange(cc raftpb.ConfChange) error {

+ 1 - 0
etcdserver/server.go

@@ -354,6 +354,7 @@ func (s *EtcdServer) run() {
 				if err := s.store.Recovery(rd.Snapshot.Data); err != nil {
 				if err := s.store.Recovery(rd.Snapshot.Data); err != nil {
 					log.Panicf("recovery store error: %v", err)
 					log.Panicf("recovery store error: %v", err)
 				}
 				}
+				s.Cluster.Recover()
 				appliedi = rd.Snapshot.Index
 				appliedi = rd.Snapshot.Index
 			}
 			}
 			// TODO(bmizerany): do this in the background, but take
 			// TODO(bmizerany): do this in the background, but take

+ 9 - 0
etcdserver/server_test.go

@@ -901,11 +901,14 @@ func TestRecvSnapshot(t *testing.T) {
 	n := newReadyNode()
 	n := newReadyNode()
 	st := &storeRecorder{}
 	st := &storeRecorder{}
 	p := &storageRecorder{}
 	p := &storageRecorder{}
+	cl := newCluster("abc")
+	cl.SetStore(store.New())
 	s := &EtcdServer{
 	s := &EtcdServer{
 		store:   st,
 		store:   st,
 		sender:  &nopSender{},
 		sender:  &nopSender{},
 		storage: p,
 		storage: p,
 		node:    n,
 		node:    n,
+		Cluster: cl,
 	}
 	}
 
 
 	s.start()
 	s.start()
@@ -930,11 +933,14 @@ func TestRecvSnapshot(t *testing.T) {
 func TestRecvSlowSnapshot(t *testing.T) {
 func TestRecvSlowSnapshot(t *testing.T) {
 	n := newReadyNode()
 	n := newReadyNode()
 	st := &storeRecorder{}
 	st := &storeRecorder{}
+	cl := newCluster("abc")
+	cl.SetStore(store.New())
 	s := &EtcdServer{
 	s := &EtcdServer{
 		store:   st,
 		store:   st,
 		sender:  &nopSender{},
 		sender:  &nopSender{},
 		storage: &storageRecorder{},
 		storage: &storageRecorder{},
 		node:    n,
 		node:    n,
+		Cluster: cl,
 	}
 	}
 
 
 	s.start()
 	s.start()
@@ -958,11 +964,14 @@ func TestRecvSlowSnapshot(t *testing.T) {
 func TestApplySnapshotAndCommittedEntries(t *testing.T) {
 func TestApplySnapshotAndCommittedEntries(t *testing.T) {
 	n := newReadyNode()
 	n := newReadyNode()
 	st := &storeRecorder{}
 	st := &storeRecorder{}
+	cl := newCluster("abc")
+	cl.SetStore(store.New())
 	s := &EtcdServer{
 	s := &EtcdServer{
 		store:   st,
 		store:   st,
 		sender:  &nopSender{},
 		sender:  &nopSender{},
 		storage: &storageRecorder{},
 		storage: &storageRecorder{},
 		node:    n,
 		node:    n,
+		Cluster: cl,
 	}
 	}
 
 
 	s.start()
 	s.start()