}
}
+ protected boolean canStartElection() {
+ return context.getRaftPolicy().automaticElectionsEnabled() && context.isVotingMember();
+ }
+
/**
* schedule a new election
*
protected void scheduleElection(FiniteDuration interval) {
stopElection();
- // Schedule an election. When the scheduler triggers an ElectionTimeout
- // message is sent to itself
- electionCancel =
- context.getActorSystem().scheduler().scheduleOnce(interval,
- context.getActor(), ELECTION_TIMEOUT,
- context.getActorSystem().dispatcher(), context.getActor());
+ if(canStartElection()) {
+ // Schedule an election. When the scheduler triggers an ElectionTimeout message is sent to itself
+ electionCancel = context.getActorSystem().scheduler().scheduleOnce(interval, context.getActor(),
+ ELECTION_TIMEOUT,context.getActorSystem().dispatcher(), context.getActor());
+ }
}
/**
@Override
public RaftActorBehavior switchBehavior(RaftActorBehavior behavior) {
- LOG.info("{} :- Switching from behavior {} to {}", logName(), this.state(), behavior.state());
+ return internalSwitchBehavior(behavior);
+ }
+
+ protected RaftActorBehavior internalSwitchBehavior(RaftState newState) {
+ if(context.getRaftPolicy().automaticElectionsEnabled()){
+ return internalSwitchBehavior(newState.createBehavior(context));
+ }
+ return this;
+ }
+
+ private RaftActorBehavior internalSwitchBehavior(RaftActorBehavior newBehavior) {
+ LOG.info("{} :- Switching from behavior {} to {}", logName(), this.state(), newBehavior.state());
try {
close();
} catch (Exception e) {
LOG.error("{}: Failed to close behavior : {}", logName(), this.state(), e);
}
-
- return behavior;
+ return newBehavior;
}
+
protected int getMajorityVoteCount(int numPeers) {
// Votes are required from a majority of the peers including self.
// The numMajority field therefore stores a calculated value
protected String getId(){
return context.getId();
}
-
}