summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-27 06:23:26 +0200
committerPaul Buetow <paul@buetow.org>2026-03-27 06:23:26 +0200
commit1a8c37f44ee42f01574346f429813925d461effd (patch)
treeba7f5c7bfb3408d01008db496e061b5cce4b76bf
parentf12114c1d9ec50f20f3df3e9c6e335e00f186c10 (diff)
Fix same-term Raft append regression b85586a4-4eb9-4686-93c7-0ab14173baa5
-rw-r--r--src/main/java/protocols/implementations/VSRaftProtocol.java9
-rw-r--r--src/test/java/protocols/implementations/VSRaftProtocolTest.java10
2 files changed, 11 insertions, 8 deletions
diff --git a/src/main/java/protocols/implementations/VSRaftProtocol.java b/src/main/java/protocols/implementations/VSRaftProtocol.java
index d0066e0..6828b34 100644
--- a/src/main/java/protocols/implementations/VSRaftProtocol.java
+++ b/src/main/java/protocols/implementations/VSRaftProtocol.java
@@ -384,18 +384,21 @@ public class VSRaftProtocol extends VSAbstractProtocol {
int messageTerm = recvMessage.getInteger("term");
int messageLeaderId = recvMessage.getInteger("leaderId");
int messageLogIndex = recvMessage.getInteger("logIndex");
+ boolean isSameTerm = messageTerm == currentTerm;
+
+ if (messageTerm < currentTerm) {
+ return;
+ }
if (messageTerm > currentTerm) {
becomeFollower(messageTerm, messageLeaderId);
- } else {
- return;
}
if (messageLogIndex != logIndex + 1) {
return;
}
- if (messageTerm == currentTerm) {
+ if (isSameTerm) {
leaderId = messageLeaderId;
isLeader = false;
isCandidate = false;
diff --git a/src/test/java/protocols/implementations/VSRaftProtocolTest.java b/src/test/java/protocols/implementations/VSRaftProtocolTest.java
index c9440b1..b249761 100644
--- a/src/test/java/protocols/implementations/VSRaftProtocolTest.java
+++ b/src/test/java/protocols/implementations/VSRaftProtocolTest.java
@@ -525,8 +525,8 @@ class VSRaftProtocolTest {
protocol.onClientRecv(appendEntry);
verify(mockProcess).sendMessage(messageCaptor.capture());
- verify(mockTaskManager, times(3)).removeAllTasks(any());
- verify(mockTaskManager, times(2)).addTask(taskCaptor.capture());
+ verify(mockTaskManager, times(2)).removeAllTasks(any());
+ verify(mockTaskManager).addTask(taskCaptor.capture());
VSMessage appendAck = messageCaptor.getValue();
assertEquals("appendAck", appendAck.getString("type"));
@@ -574,7 +574,7 @@ class VSRaftProtocolTest {
}
@Test
- void testLeaderAppendQuorumStateDrainsAndCommitsAfterFollowerRoundTrips()
+ void testLeaderAppendQuorumStateDrainsAndCommitsAfterSameTermFollowerRoundTrips()
throws Exception {
LeaderHarness leaderHarness = createLeaderHarness(11, 300L);
leaderHarness.protocol.onStart();
@@ -588,7 +588,7 @@ class VSRaftProtocolTest {
protocol.currentContextIsServer(false);
protocol.onClientInit();
- setIntField("currentTerm", -1);
+ setIntField("currentTerm", 0);
clearInvocations(mockProcess, mockTaskManager);
when(mockProcess.getProcessID()).thenReturn(2);
when(mockProcess.getTime()).thenReturn(700L, 700L);
@@ -608,7 +608,7 @@ class VSRaftProtocolTest {
protocol.onClientReset();
protocol.currentContextIsServer(false);
protocol.onClientInit();
- setIntField("currentTerm", -1);
+ setIntField("currentTerm", 0);
clearInvocations(mockProcess, mockTaskManager);
when(mockProcess.getProcessID()).thenReturn(3);
when(mockProcess.getTime()).thenReturn(800L, 800L);