Skip to content

Commit 128a159

Browse files
committed
bugfix: pesist commitIndex into raft meta log
1 parent bd706cf commit 128a159

6 files changed

Lines changed: 154 additions & 58 deletions

File tree

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<modelVersion>4.0.0</modelVersion>
44

55
<groupId>com.github.wenweihu86.raft</groupId>
6-
<artifactId>raft-java-all</artifactId>
6+
<artifactId>raft-java-parent</artifactId>
77
<version>1.9.0</version>
88
<packaging>pom</packaging>
99

raft-java-core/src/main/java/com/github/wenweihu86/raft/RaftNode.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public RaftNode(RaftOptions raftOptions,
8787

8888
currentTerm = raftLog.getMetaData().getCurrentTerm();
8989
votedFor = raftLog.getMetaData().getVotedFor();
90-
commitIndex = Math.max(snapshot.getMetaData().getLastIncludedIndex(), commitIndex);
90+
commitIndex = Math.max(snapshot.getMetaData().getLastIncludedIndex(), raftLog.getMetaData().getCommitIndex());
9191
// discard old log entries
9292
if (snapshot.getMetaData().getLastIncludedIndex() > 0
9393
&& raftLog.getFirstLogIndex() <= snapshot.getMetaData().getLastIncludedIndex()) {
@@ -156,7 +156,7 @@ public boolean replicate(byte[] data, RaftProto.EntryType entryType) {
156156
List<RaftProto.LogEntry> entries = new ArrayList<>();
157157
entries.add(logEntry);
158158
newLastLogIndex = raftLog.append(entries);
159-
raftLog.updateMetaData(currentTerm, null, raftLog.getFirstLogIndex());
159+
// raftLog.updateMetaData(currentTerm, null, raftLog.getFirstLogIndex());
160160

161161
for (RaftProto.Server server : configuration.getServersList()) {
162162
final Peer peer = peerMap.get(server.getServerId());
@@ -304,7 +304,7 @@ public void stepDown(long newTerm) {
304304
currentTerm = newTerm;
305305
leaderId = 0;
306306
votedFor = 0;
307-
raftLog.updateMetaData(currentTerm, votedFor, null);
307+
raftLog.updateMetaData(currentTerm, votedFor, null, null);
308308
}
309309
state = NodeState.STATE_FOLLOWER;
310310
// stop heartbeat
@@ -760,6 +760,7 @@ private void advanceCommitIndex() {
760760
}
761761
long oldCommitIndex = commitIndex;
762762
commitIndex = newCommitIndex;
763+
raftLog.updateMetaData(currentTerm, null, raftLog.getFirstLogIndex(), commitIndex);
763764
// 同步到状态机
764765
for (long index = oldCommitIndex + 1; index <= newCommitIndex; index++) {
765766
RaftProto.LogEntry entry = raftLog.getEntry(index);

raft-java-core/src/main/java/com/github/wenweihu86/raft/proto/RaftProto.java

Lines changed: 131 additions & 49 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

raft-java-core/src/main/java/com/github/wenweihu86/raft/proto/raft.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ message LogMetaData {
3333
optional uint64 current_term = 1;
3434
optional uint32 voted_for = 2;
3535
optional uint64 first_log_index = 3;
36+
optional uint64 commit_index = 4;
3637
}
3738

3839
message SnapshotMetaData {

raft-java-core/src/main/java/com/github/wenweihu86/raft/service/impl/RaftConsensusServiceImpl.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public RaftProto.VoteResponse requestVote(RaftProto.VoteRequest request) {
8484
if (raftNode.getVotedFor() == 0 && logIsOk) {
8585
raftNode.stepDown(request.getTerm());
8686
raftNode.setVotedFor(request.getServerId());
87-
raftNode.getRaftLog().updateMetaData(raftNode.getCurrentTerm(), raftNode.getVotedFor(), null);
87+
raftNode.getRaftLog().updateMetaData(raftNode.getCurrentTerm(), raftNode.getVotedFor(), null, null);
8888
responseBuilder.setGranted(true);
8989
responseBuilder.setTerm(raftNode.getCurrentTerm());
9090
}
@@ -174,8 +174,8 @@ public RaftProto.AppendEntriesResponse appendEntries(RaftProto.AppendEntriesRequ
174174
entries.add(entry);
175175
}
176176
raftNode.getRaftLog().append(entries);
177-
raftNode.getRaftLog().updateMetaData(raftNode.getCurrentTerm(),
178-
null, raftNode.getRaftLog().getFirstLogIndex());
177+
// raftNode.getRaftLog().updateMetaData(raftNode.getCurrentTerm(),
178+
// null, raftNode.getRaftLog().getFirstLogIndex());
179179
responseBuilder.setLastLogIndex(raftNode.getRaftLog().getLastLogIndex());
180180

181181
advanceCommitIndex(request);
@@ -313,6 +313,7 @@ private void advanceCommitIndex(RaftProto.AppendEntriesRequest request) {
313313
long newCommitIndex = Math.min(request.getCommitIndex(),
314314
request.getPrevLogIndex() + request.getEntriesCount());
315315
raftNode.setCommitIndex(newCommitIndex);
316+
raftNode.getRaftLog().updateMetaData(null,null, null, newCommitIndex);
316317
if (raftNode.getLastAppliedIndex() < raftNode.getCommitIndex()) {
317318
// apply state machine
318319
for (long index = raftNode.getLastAppliedIndex() + 1;

raft-java-core/src/main/java/com/github/wenweihu86/raft/storage/SegmentedLog.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ public void truncatePrefix(long newFirstIndex) {
191191
} else {
192192
newActualFirstIndex = startLogIndexSegmentMap.firstKey();
193193
}
194-
updateMetaData(null, null, newActualFirstIndex);
194+
updateMetaData(null, null, newActualFirstIndex, null);
195195
LOG.info("Truncating log from old first index {} to new first index {}",
196196
oldFirstIndex, newActualFirstIndex);
197197
}
@@ -316,7 +316,15 @@ public RaftProto.LogMetaData readMetaData() {
316316
}
317317
}
318318

319-
public void updateMetaData(Long currentTerm, Integer votedFor, Long firstLogIndex) {
319+
/**
320+
* 更新raft log meta data,
321+
* 包括commitIndex, fix bug: https://github.com/wenweihu86/raft-java/issues/19
322+
* @param currentTerm
323+
* @param votedFor
324+
* @param firstLogIndex
325+
* @param commitIndex
326+
*/
327+
public void updateMetaData(Long currentTerm, Integer votedFor, Long firstLogIndex, Long commitIndex) {
320328
RaftProto.LogMetaData.Builder builder = RaftProto.LogMetaData.newBuilder(this.metaData);
321329
if (currentTerm != null) {
322330
builder.setCurrentTerm(currentTerm);
@@ -327,6 +335,9 @@ public void updateMetaData(Long currentTerm, Integer votedFor, Long firstLogInde
327335
if (firstLogIndex != null) {
328336
builder.setFirstLogIndex(firstLogIndex);
329337
}
338+
if (commitIndex != null) {
339+
builder.setCommitIndex(commitIndex);
340+
}
330341
this.metaData = builder.build();
331342

332343
String fileName = logDir + File.separator + "metadata";

0 commit comments

Comments
 (0)