summaryrefslogtreecommitdiff
path: root/src/main/java/protocols
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/protocols')
-rw-r--r--src/main/java/protocols/VSAbstractProtocol.java9
-rw-r--r--src/main/java/protocols/implementations/VSRaftProtocol.java16
2 files changed, 25 insertions, 0 deletions
diff --git a/src/main/java/protocols/VSAbstractProtocol.java b/src/main/java/protocols/VSAbstractProtocol.java
index 505a6aa..1695c25 100644
--- a/src/main/java/protocols/VSAbstractProtocol.java
+++ b/src/main/java/protocols/VSAbstractProtocol.java
@@ -247,6 +247,15 @@ abstract public class VSAbstractProtocol extends VSAbstractEvent {
}
/**
+ * Checks whether the protocol currently runs in server context.
+ *
+ * @return true if the current context is server, otherwise false
+ */
+ public final boolean currentContextIsServer() {
+ return currentContextIsServer;
+ }
+
+ /**
* Checks how the protocol will start
*
* @return true, if this protocol uses onServerStart instead of
diff --git a/src/main/java/protocols/implementations/VSRaftProtocol.java b/src/main/java/protocols/implementations/VSRaftProtocol.java
index 4a310ee..eaf63a7 100644
--- a/src/main/java/protocols/implementations/VSRaftProtocol.java
+++ b/src/main/java/protocols/implementations/VSRaftProtocol.java
@@ -166,6 +166,7 @@ public class VSRaftProtocol extends VSAbstractProtocol {
* @param newLeaderId the known leader in that term, or -1 if unknown
*/
private void becomeFollower(int term, int newLeaderId) {
+ clearServerSchedules();
isLeader = false;
isCandidate = false;
currentTerm = term;
@@ -181,9 +182,24 @@ public class VSRaftProtocol extends VSAbstractProtocol {
private void resetElectionTimeout() {
long jitterPercentage = Math.abs(process.getRandomPercentage());
long jitter = (getLong("electionJitter") * jitterPercentage) / 100L;
+ boolean previousContextIsServer = currentContextIsServer();
+ currentContextIsServer(false);
removeSchedules();
scheduleAt(process.getTime() + getLong("electionTimeout") + jitter);
+ currentContextIsServer(previousContextIsServer);
+ }
+
+ /**
+ * Clears any active server-side schedules while preserving the caller
+ * context.
+ */
+ private void clearServerSchedules() {
+ boolean previousContextIsServer = currentContextIsServer();
+
+ currentContextIsServer(true);
+ removeSchedules();
+ currentContextIsServer(previousContextIsServer);
}
/**