requestVote(sender, requestVote);
}
- return internalSwitchBehavior(RaftState.Follower);
+ return switchBehavior(new Follower(context));
}
if (message instanceof SendHeartBeat) {
final var lastApplied = context.getLastApplied();
final var lastIndex = context.getReplicatedLog().lastIndex();
if (lastApplied >= lastIndex) {
- return internalSwitchBehavior(RaftState.Leader);
+ return switchBehavior(new Leader(context));
}
LOG.info("{}: LastApplied index {} is behind last index {} - switching to PreLeader", logName, lastApplied,
lastIndex);
- return internalSwitchBehavior(RaftState.PreLeader);
+ return switchBehavior(new PreLeader(context));
}
@Override
// who we do not know about (as a peer)
// to send a message to the candidate
- return internalSwitchBehavior(RaftState.Leader);
+ return switchBehavior(new Leader(context));
}
startNewTerm();
super.handleMessage(sender, message);
}
- return internalSwitchBehavior(RaftState.Follower);
+ return switchBehavior(new Follower(context));
}
}
if (canStartElection()) {
if (message instanceof TimeoutNow) {
LOG.debug("{}: Received TimeoutNow - switching to Candidate", logName);
- return internalSwitchBehavior(RaftState.Candidate);
+ return switchBehavior(new Candidate(context));
} else if (noLeaderMessageReceived) {
// Check the cluster state to see if the leader is known to be up before we go to Candidate.
// However if we haven't heard from the leader in a long time even though the cluster state
scheduleElection(electionDuration());
} else {
LOG.debug("{}: Received ElectionTimeout - switching to Candidate", logName);
- return internalSwitchBehavior(RaftState.Candidate);
+ return switchBehavior(new Candidate(context));
}
} else {
LOG.debug("{}: Received ElectionTimeout but lastLeaderMessageInterval {} < election timeout {}",
// changes its state to Follower, hence we only need to switch to Leader if the state is still Isolated
if (ret.state() == RaftState.IsolatedLeader && !isLeaderIsolated()) {
LOG.info("{}: IsolatedLeader {} switching from IsolatedLeader to Leader", getId(), getLeaderId());
- return internalSwitchBehavior(new Leader(context, this));
+ return switchBehavior(new Leader(context, this));
}
return ret;
}
if (isLeaderIsolated()) {
LOG.warn("{}: At least {} followers need to be active, Switching {} from Leader to IsolatedLeader",
logName, getMinIsolatedLeaderPeerCount(), getLeaderId());
- return internalSwitchBehavior(new IsolatedLeader(context, this));
+ return switchBehavior(new IsolatedLeader(context, this));
} else {
return this;
}
LOG.debug("{}: Received {} - lastApplied: {}, lastIndex: {}", logName, message, lastApplied, lastIndex);
return lastApplied < lastIndex ? this
// We've applied all entries - we can switch to Leader.
- : internalSwitchBehavior(new Leader(context, this));
+ : switchBehavior(new Leader(context, this));
} else {
return super.handleMessage(sender, message);
}
};
}
+ @Override
+ public abstract void close();
+
/**
* Closes the current behavior and switches to the specified behavior, if possible.
*
* @param behavior the new behavior to switch to
* @return the new behavior
*/
- public RaftActorBehavior switchBehavior(final RaftActorBehavior behavior) {
- return internalSwitchBehavior(behavior);
- }
-
- @Override
- public abstract void close();
-
- final RaftActorBehavior internalSwitchBehavior(final RaftState newState) {
- return internalSwitchBehavior(createBehavior(context, newState));
- }
-
@SuppressWarnings("checkstyle:IllegalCatch")
- final RaftActorBehavior internalSwitchBehavior(final RaftActorBehavior newBehavior) {
+ final RaftActorBehavior switchBehavior(final RaftActorBehavior newBehavior) {
if (!context.getRaftPolicy().automaticElectionsEnabled()) {
return this;
}
- LOG.info("{} :- Switching from behavior {} to {}, election term: {}", logName, state(),
- newBehavior.state(), context.currentTerm());
+ LOG.info("{} :- Switching from behavior {} to {}, election term: {}", logName, state(), newBehavior.state(),
+ context.currentTerm());
try {
close();
} catch (RuntimeException e) {