Browse Source

raft: set ready.st to empty state, if current state is equal to previous state

Xiang Li 11 years ago
parent
commit
c28fef5fc4
2 changed files with 16 additions and 9 deletions
  1. 15 8
      raft/node.go
  2. 1 1
      raft/node_test.go

+ 15 - 8
raft/node.go

@@ -38,8 +38,8 @@ func isStateEqual(a, b pb.State) bool {
 	return a.Term == b.Term && a.Vote == b.Vote && a.LastIndex == b.LastIndex
 }
 
-func (rd Ready) containsUpdates(prevSt pb.State) bool {
-	return !isStateEqual(prevSt, rd.State) || len(rd.Entries) > 0 || len(rd.CommittedEntries) > 0 || len(rd.Messages) > 0
+func (rd Ready) containsUpdates() bool {
+	return !isStateEqual(EmptyState, rd.State) || len(rd.Entries) > 0 || len(rd.CommittedEntries) > 0 || len(rd.Messages) > 0
 }
 
 type Node struct {
@@ -100,13 +100,18 @@ func (n *Node) run(r *raft) {
 		}
 
 		rd := Ready{
-			r.State,
-			r.raftLog.unstableEnts(),
-			r.raftLog.nextEnts(),
-			r.msgs,
+			Entries:          r.raftLog.unstableEnts(),
+			CommittedEntries: r.raftLog.nextEnts(),
+			Messages:         r.msgs,
 		}
 
-		if rd.containsUpdates(prevSt) {
+		if isStateEqual(r.State, prevSt) {
+			rd.State = EmptyState
+		} else {
+			rd.State = r.State
+		}
+
+		if rd.containsUpdates() {
 			readyc = n.readyc
 		} else {
 			readyc = nil
@@ -123,7 +128,9 @@ func (n *Node) run(r *raft) {
 		case readyc <- rd:
 			r.raftLog.resetNextEnts()
 			r.raftLog.resetUnstable()
-			prevSt = rd.State
+			if !isStateEqual(rd.State, EmptyState) {
+				prevSt = rd.State
+			}
 			r.msgs = nil
 		case <-n.done:
 			return

+ 1 - 1
raft/node_test.go

@@ -51,7 +51,7 @@ func TestNodeRestart(t *testing.T) {
 	st := raftpb.State{Term: 1, Vote: -1, Commit: 1, LastIndex: 2}
 
 	want := Ready{
-		State: st,
+		State: EmptyState,
 		// commit upto index commit index in st
 		CommittedEntries: entries[:st.Commit],
 	}