From 8c94ae0ee337075a3b1d9de60cf64b088107e5a1 Mon Sep 17 00:00:00 2001 From: Yicheng Qin Date: Sat, 3 Oct 2015 20:34:47 -0700 Subject: [PATCH] etcdserver: get existing snapshot instead of requesting one This fixes the problem that proposal cannot be applied. When start the etcdserver.run loop, it expects to get the latest existing snapshot. It should not attempt to request one because the loop is the entity to create the snapshot. --- etcdserver/raft.go | 1 + etcdserver/raft_storage.go | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/etcdserver/raft.go b/etcdserver/raft.go index 5095e10c0..4532fad13 100644 --- a/etcdserver/raft.go +++ b/etcdserver/raft.go @@ -120,6 +120,7 @@ type raftNode struct { // TODO: Ideally raftNode should get rid of the passed in server structure. func (r *raftNode) start(s *EtcdServer) { r.s = s + r.raftStorage.raftStarted = true r.applyc = make(chan apply) r.stopped = make(chan struct{}) r.done = make(chan struct{}) diff --git a/etcdserver/raft_storage.go b/etcdserver/raft_storage.go index f3fc2250e..b546793df 100644 --- a/etcdserver/raft_storage.go +++ b/etcdserver/raft_storage.go @@ -24,6 +24,9 @@ type raftStorage struct { // snapStore is the place to request snapshot when v3demo is enabled. // If snapStore is nil, it uses the snapshot saved in MemoryStorage. snapStore *snapshotStore + // raftStarted indicates whether raft starts to function. If not, it cannot + // request snapshot, and should get snapshot from MemoryStorage. + raftStarted bool } func newRaftStorage() *raftStorage { @@ -46,11 +49,11 @@ func (rs *raftStorage) raftsnap() chan<- raftpb.Snapshot { return rs.snapStore.raftsnapc } -// Snapshot returns raft snapshot. If snapStore is nil, this method -// returns snapshot saved in MemoryStorage. If snapStore exists, this method +// Snapshot returns raft snapshot. If snapStore is nil or raft is not started, this method +// returns snapshot saved in MemoryStorage. Otherwise, this method // returns snapshot from snapStore. func (rs *raftStorage) Snapshot() (raftpb.Snapshot, error) { - if rs.snapStore == nil { + if rs.snapStore == nil || !rs.raftStarted { return rs.MemoryStorage.Snapshot() } snap, err := rs.snapStore.getSnap()