From 0bebec08cd89039c32bd9b9e73d80d573b6bf0b3 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Fri, 27 Mar 2026 13:30:14 +0200 Subject: sr: fix Raft replay leader election --- src/main/java/protocols/VSAbstractProtocol.java | 31 ++++++++++++++++++++-- .../protocols/implementations/VSRaftProtocol.java | 14 ++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) (limited to 'src/main/java/protocols') diff --git a/src/main/java/protocols/VSAbstractProtocol.java b/src/main/java/protocols/VSAbstractProtocol.java index da12d31..ee0d6c2 100644 --- a/src/main/java/protocols/VSAbstractProtocol.java +++ b/src/main/java/protocols/VSAbstractProtocol.java @@ -180,8 +180,8 @@ abstract public class VSAbstractProtocol extends VSAbstractEvent { * This method: * * * @param message the received message @@ -192,6 +192,21 @@ abstract public class VSAbstractProtocol extends VSAbstractEvent { if (isIncorrectProtocol(message)) return; + if (isServer && isClient) { + if (message.isServerMessage()) { + currentContextIsServer(false); + if (!isClientInitialized) + onInit(); + onClientRecv(message); + } else { + currentContextIsServer(true); + if (!isServerInitialized) + onInit(); + onServerRecv(message); + } + return; + } + if (isServer) { currentContextIsServer(true); if (!isServerInitialized) @@ -226,6 +241,18 @@ abstract public class VSAbstractProtocol extends VSAbstractEvent { if (isIncorrectProtocol(message)) return false; + return isRelevantMessageForContext(message); + } + + /** + * Checks whether a message is relevant for this protocol instance. + * Subclasses can relax or specialize the default server/client routing + * rules while keeping the protocol-name filter intact. + * + * @param message the message to check + * @return true if the message should be processed by this protocol instance + */ + protected boolean isRelevantMessageForContext(VSMessage message) { if (message.isServerMessage()) { if (!isClient) return false; diff --git a/src/main/java/protocols/implementations/VSRaftProtocol.java b/src/main/java/protocols/implementations/VSRaftProtocol.java index c75628d..bad893c 100644 --- a/src/main/java/protocols/implementations/VSRaftProtocol.java +++ b/src/main/java/protocols/implementations/VSRaftProtocol.java @@ -103,6 +103,11 @@ public class VSRaftProtocol extends VSAbstractProtocol { handleMessage(recvMessage); } + @Override + protected boolean isRelevantMessageForContext(VSMessage message) { + return isServer() || isClient(); + } + /* (non-Javadoc) * @see protocols.VSAbstractProtocol#onServerSchedule() */ @@ -366,7 +371,10 @@ public class VSRaftProtocol extends VSAbstractProtocol { heartbeatAck.setInteger("term", currentTerm); heartbeatAck.setInteger("pid", process.getProcessID()); heartbeatAck.setInteger("targetPid", messageLeaderId); + boolean previousContextIsServer = currentContextIsServer(); + currentContextIsServer(true); sendMessage(heartbeatAck); + currentContextIsServer(previousContextIsServer); } /** @@ -417,7 +425,10 @@ public class VSRaftProtocol extends VSAbstractProtocol { voteResponse.setInteger("pid", process.getProcessID()); voteResponse.setBoolean("voteGranted", voteGranted); voteResponse.setInteger("targetPid", candidateId); + boolean previousContextIsServer = currentContextIsServer(); + currentContextIsServer(true); sendMessage(voteResponse); + currentContextIsServer(previousContextIsServer); } /** @@ -487,7 +498,10 @@ public class VSRaftProtocol extends VSAbstractProtocol { appendAck.setInteger("pid", process.getProcessID()); appendAck.setInteger("logIndex", messageLogIndex); appendAck.setInteger("targetPid", messageLeaderId); + boolean previousContextIsServer = currentContextIsServer(); + currentContextIsServer(true); sendMessage(appendAck); + currentContextIsServer(previousContextIsServer); } /** -- cgit v1.2.3