From b3c1bd5616310e19efaf101bc5234c41e5b9d53b Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Mon, 29 Sep 2014 14:14:16 -0700 Subject: [PATCH 1/2] raft: commitIndex=min(leaderCommit, index of last new entry) --- raft/log.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/raft/log.go b/raft/log.go index 562afae9f..89be6f0fc 100644 --- a/raft/log.go +++ b/raft/log.go @@ -47,6 +47,7 @@ func (l *raftLog) String() string { } func (l *raftLog) maybeAppend(index, logTerm, committed int64, ents ...pb.Entry) bool { + lastnewi := index + int64(len(ents)) if l.matchTerm(index, logTerm) { from := index + 1 ci := l.findConflict(from, ents) @@ -57,8 +58,10 @@ func (l *raftLog) maybeAppend(index, logTerm, committed int64, ents ...pb.Entry) default: l.append(ci-1, ents[ci-from:]...) } - if l.committed < committed { - l.committed = min(committed, l.lastIndex()) + tocommit := min(committed, lastnewi) + // if toCommit > commitIndex, set commitIndex = toCommit + if l.committed < tocommit { + l.committed = tocommit } return true } From 172bd7d096d779d0eea6cc48f533b80f3eb3ba54 Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Fri, 3 Oct 2014 22:21:35 +0800 Subject: [PATCH 2/2] raft: add test for maybeappend change --- raft/raft_test.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/raft/raft_test.go b/raft/raft_test.go index b9744c24e..c87044c11 100644 --- a/raft/raft_test.go +++ b/raft/raft_test.go @@ -498,8 +498,10 @@ func TestHandleMsgApp(t *testing.T) { {pb.Message{Type: msgApp, Term: 2, LogTerm: 1, Index: 1, Commit: 4, Entries: []pb.Entry{{Term: 2}}}, 2, 2, false}, // Ensure 3 - {pb.Message{Type: msgApp, Term: 2, LogTerm: 2, Index: 2, Commit: 2}, 2, 2, false}, - {pb.Message{Type: msgApp, Term: 2, LogTerm: 2, Index: 2, Commit: 4}, 2, 2, false}, // commit upto min(commit, last) + {pb.Message{Type: msgApp, Term: 1, LogTerm: 1, Index: 1, Commit: 3}, 2, 1, false}, // match entry 1, commit upto last new entry 1 + {pb.Message{Type: msgApp, Term: 1, LogTerm: 1, Index: 1, Commit: 3, Entries: []pb.Entry{{Term: 2}}}, 2, 2, false}, // match entry 1, commit upto last new entry 2 + {pb.Message{Type: msgApp, Term: 2, LogTerm: 2, Index: 2, Commit: 3}, 2, 2, false}, // match entry 2, commit upto last new entry 2 + {pb.Message{Type: msgApp, Term: 2, LogTerm: 2, Index: 2, Commit: 4}, 2, 2, false}, // commit upto log.last() } for i, tt := range tests {