Skip to content

Commit 92b126f

Browse files
committed
Raft core fixes
* Pre-vote task should use the correct term * Schedule append request reset on any append request or install snapshot RPC
1 parent e7a869b commit 92b126f

File tree

4 files changed

+18
-12
lines changed

4 files changed

+18
-12
lines changed

hazelcast/src/main/java/com/hazelcast/cp/internal/raft/impl/RaftNodeImpl.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ public void run() {
203203
logger.fine("Starting raft node: " + localMember + " for " + groupId
204204
+ " with " + state.memberCount() + " members: " + state.members());
205205
}
206-
raftIntegration.execute(new PreVoteTask(this));
206+
raftIntegration.execute(new PreVoteTask(this, 0));
207207

208208
scheduleLeaderFailureDetection();
209209
}
@@ -411,11 +411,7 @@ public void send(AppendFailureResponse response, Endpoint target) {
411411
*/
412412
public void broadcastAppendRequest() {
413413
for (Endpoint follower : state.remoteMembers()) {
414-
try {
415-
sendAppendRequest(follower);
416-
} catch (Throwable e) {
417-
logger.severe(e);
418-
}
414+
sendAppendRequest(follower);
419415
}
420416
updateLastAppendEntriesTimestamp();
421417
}
@@ -462,6 +458,7 @@ public void sendAppendRequest(Endpoint follower) {
462458
+ " <= snapshot index: " + raftLog.snapshotIndex());
463459
}
464460
followerState.setMaxAppendRequestBackoff();
461+
scheduleAppendAckResetTask();
465462
raftIntegration.send(installSnapshot, follower);
466463
return;
467464
}
@@ -514,6 +511,7 @@ public void sendAppendRequest(Endpoint follower) {
514511

515512
if (setAppendRequestBackoff) {
516513
followerState.setAppendRequestBackoff();
514+
scheduleAppendAckResetTask();
517515
}
518516

519517
send(request, follower);
@@ -922,7 +920,7 @@ final void resetLeaderAndStartElection() {
922920

923921
private void runPreVoteTask() {
924922
if (state.preCandidateState() == null) {
925-
new PreVoteTask(RaftNodeImpl.this).run();
923+
new PreVoteTask(RaftNodeImpl.this, state.term()).run();
926924
}
927925
}
928926
}

hazelcast/src/main/java/com/hazelcast/cp/internal/raft/impl/task/PreVoteTask.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,11 @@
3535
*/
3636
public class PreVoteTask extends RaftNodeStatusAwareTask implements Runnable {
3737

38-
public PreVoteTask(RaftNodeImpl raftNode) {
38+
private int term;
39+
40+
public PreVoteTask(RaftNodeImpl raftNode, int term) {
3941
super(raftNode);
42+
this.term = term;
4043
}
4144

4245
@Override
@@ -46,6 +49,9 @@ protected void innerRun() {
4649
if (state.leader() != null) {
4750
logger.fine("No new pre-vote phase, we already have a LEADER: " + state.leader());
4851
return;
52+
} else if (state.term() != term) {
53+
logger.fine("No new pre-vote phase for term= " + term + " because of new term: " + state.term());
54+
return;
4955
}
5056

5157
Collection<Endpoint> remoteMembers = state.remoteMembers();
@@ -73,6 +79,6 @@ protected void innerRun() {
7379
}
7480

7581
private void schedulePreVoteTimeout() {
76-
raftNode.schedule(new PreVoteTimeoutTask(raftNode), raftNode.getLeaderElectionTimeoutInMillis());
82+
raftNode.schedule(new PreVoteTimeoutTask(raftNode, term), raftNode.getLeaderElectionTimeoutInMillis());
7783
}
7884
}

hazelcast/src/main/java/com/hazelcast/cp/internal/raft/impl/task/PreVoteTimeoutTask.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,11 @@
2727
*/
2828
public class PreVoteTimeoutTask extends RaftNodeStatusAwareTask implements Runnable {
2929

30-
PreVoteTimeoutTask(RaftNodeImpl raftNode) {
30+
private int term;
31+
32+
PreVoteTimeoutTask(RaftNodeImpl raftNode, int term) {
3133
super(raftNode);
34+
this.term = term;
3235
}
3336

3437
@Override
@@ -37,6 +40,6 @@ protected void innerRun() {
3740
return;
3841
}
3942
logger.fine("Pre-vote for term: " + raftNode.state().term() + " has timed out!");
40-
new PreVoteTask(raftNode).run();
43+
new PreVoteTask(raftNode, term).run();
4144
}
4245
}

hazelcast/src/main/java/com/hazelcast/cp/internal/raft/impl/task/ReplicateTask.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ public void run() {
8585
handleRaftGroupCmd(newEntryLogIndex, operation);
8686

8787
raftNode.broadcastAppendRequest();
88-
raftNode.scheduleAppendAckResetTask();
8988
}
9089

9190
private boolean verifyRaftNodeStatus() {

0 commit comments

Comments
 (0)