etcd: add recover

This commit is contained in:
Yicheng Qin 2014-07-31 10:25:48 -07:00
parent 15029381e1
commit 7c3e202c94
2 changed files with 58 additions and 0 deletions

View File

@ -25,6 +25,7 @@ import (
"net/http/httptest" "net/http/httptest"
"net/url" "net/url"
"os" "os"
"reflect"
"strings" "strings"
"testing" "testing"
"time" "time"
@ -386,6 +387,57 @@ func TestTakingSnapshot(t *testing.T) {
} }
} }
func TestRestoreSnapshotFromLeader(t *testing.T) {
es, hs := buildCluster(1, false)
// let leader do snapshot
for i := 0; i < defaultCompact; i++ {
es[0].p.Set(fmt.Sprint("/foo", i), false, fmt.Sprint("bar", i), store.Permanent)
}
// create one to join the cluster
c := config.New()
c.Peers = []string{hs[0].URL}
e, h := initTestServer(c, 1, false)
go e.Run()
waitMode(participantMode, e)
// check new proposal could be submitted
if _, err := es[0].p.Set("/foo", false, "bar", store.Permanent); err != nil {
t.Fatal(err)
}
// check store is recovered
for i := 0; i < defaultCompact; i++ {
ev, err := e.p.Get(fmt.Sprint("/foo", i), false, false)
if err != nil {
t.Errorf("get err = %v", err)
continue
}
w := fmt.Sprint("bar", i)
if g := *ev.Node.Value; g != w {
t.Errorf("value = %v, want %v", g, w)
}
}
// check new proposal could be committed in the new machine
wch, err := e.p.Watch("/foo", false, false, defaultCompact)
if err != nil {
t.Errorf("watch err = %v", err)
}
<-wch.EventChan
g := e.p.node.Nodes()
w := es[0].p.node.Nodes()
if !reflect.DeepEqual(g, w) {
t.Errorf("nodes = %v, want %v", g, w)
}
e.Stop()
es[0].Stop()
h.Close()
hs[0].Close()
}
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)

View File

@ -205,6 +205,12 @@ func (p *participant) run() int64 {
log.Printf("id=%x participant.stop\n", p.id) log.Printf("id=%x participant.stop\n", p.id)
return stopMode return stopMode
} }
if s := node.UnstableSnapshot(); !s.IsEmpty() {
if err := p.Recovery(s.Data); err != nil {
panic(err)
}
log.Printf("id=%x recovered index=%d\n", p.id, s.Index)
}
p.apply(node.Next()) p.apply(node.Next())
ents := node.UnstableEnts() ents := node.UnstableEnts()
p.save(ents, node.UnstableState()) p.save(ents, node.UnstableState())