From 910781ef5bb735515d7ba567b70d2cab191e0d6b Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Mon, 16 May 2016 09:58:57 -0700 Subject: [PATCH] raft: do not panic when removing all the nodes from cluster --- raft/raft.go | 6 ++++++ raft/raft_test.go | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/raft/raft.go b/raft/raft.go index 8ecc84b87..f8d727d6f 100644 --- a/raft/raft.go +++ b/raft/raft.go @@ -893,6 +893,12 @@ func (r *raft) addNode(id uint64) { func (r *raft) removeNode(id uint64) { r.delProgress(id) r.pendingConf = false + + // do not try to commit or abort transferring if there is no nodes in the cluster. + if len(r.prs) == 0 { + return + } + // The quorum size is now smaller, so see if any pending entries can // be committed. if r.maybeCommit() { diff --git a/raft/raft_test.go b/raft/raft_test.go index 4e83850af..1a58f957d 100644 --- a/raft/raft_test.go +++ b/raft/raft_test.go @@ -1782,6 +1782,13 @@ func TestRemoveNode(t *testing.T) { if g := r.nodes(); !reflect.DeepEqual(g, w) { t.Errorf("nodes = %v, want %v", g, w) } + + // remove all nodes from cluster + r.removeNode(1) + w = []uint64{} + if g := r.nodes(); !reflect.DeepEqual(g, w) { + t.Errorf("nodes = %v, want %v", g, w) + } } func TestPromotable(t *testing.T) {