import java.io.Serializable;
-public class ElectionTimeout implements Serializable {
+/**
+ * Message sent to indicate the current election term has timed out.
+ */
+public final class ElectionTimeout implements Serializable {
private static final long serialVersionUID = 1L;
+ public static final ElectionTimeout INSTANCE = new ElectionTimeout();
+
+ private ElectionTimeout() {
+ // Hidden on purpose
+ }
+
+ @SuppressWarnings({ "static-method", "unused" })
+ private ElectionTimeout readResolve() {
+ return INSTANCE;
+ }
}
* set currentTerm = T, convert to follower (ยง5.1)
*/
public abstract class AbstractRaftActorBehavior implements RaftActorBehavior {
-
- protected static final ElectionTimeout ELECTION_TIMEOUT = new ElectionTimeout();
-
/**
* Information about the RaftActor whose behavior this class represents
*/
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());
+ ElectionTimeout.INSTANCE, context.getActorSystem().dispatcher(), context.getActor());
}
}
startNewTerm();
if(votingPeers.isEmpty()){
- actor().tell(ELECTION_TIMEOUT, actor());
+ actor().tell(ElectionTimeout.INSTANCE, actor());
} else {
scheduleElection(electionDuration());
}
if(canStartElection()) {
if (context.getPeerIds().isEmpty() && getLeaderId() == null) {
- actor().tell(ELECTION_TIMEOUT, actor());
+ actor().tell(ElectionTimeout.INSTANCE, actor());
} else {
scheduleElection(electionDuration());
}
// Now send an ElectionTimeout to the matching follower to immediately start an election.
ActorSelection followerActor = context.getPeerActorSelection(followerId);
- followerActor.tell(new ElectionTimeout(), context.getActor());
+ followerActor.tell(ElectionTimeout.INSTANCE, context.getActor());
LOG.debug("{}: Leader transfer complete", logName());
candidate = new Candidate(raftActorContext);
RaftActorBehavior newBehavior =
- candidate.handleMessage(candidateActor, new ElectionTimeout());
+ candidate.handleMessage(candidateActor, ElectionTimeout.INSTANCE);
assertEquals("Behavior", RaftState.Leader, newBehavior.state());
}
raftActorContext.setPeerAddresses(setupPeers(1));
candidate = new Candidate(raftActorContext);
- candidate = candidate.handleMessage(candidateActor, new ElectionTimeout());
+ candidate = candidate.handleMessage(candidateActor, ElectionTimeout.INSTANCE);
assertEquals("Behavior", RaftState.Candidate, candidate.state());
}
member3Actor.expectMessageClass(RequestVoteReply.class, 1);
member3Actor.expectMessageClass(AppendEntriesReply.class, 2);
- member3ActorRef.tell(new ElectionTimeout(), ActorRef.noSender());
+ member3ActorRef.tell(ElectionTimeout.INSTANCE, ActorRef.noSender());
member3Actor.waitForExpectedMessages(RequestVoteReply.class);
member3Actor.dropMessagesToBehavior(RequestVote.class);
- member2ActorRef.tell(new ElectionTimeout(), ActorRef.noSender());
+ member2ActorRef.tell(ElectionTimeout.INSTANCE, ActorRef.noSender());
member1Actor.waitForExpectedMessages(RequestVote.class);
member3Actor.waitForExpectedMessages(RequestVote.class);
follower = new Follower(createActorContext());
- RaftActorBehavior raftBehavior = follower.handleMessage(followerActor, new ElectionTimeout());
+ RaftActorBehavior raftBehavior = follower.handleMessage(followerActor, ElectionTimeout.INSTANCE);
assertTrue(raftBehavior instanceof Candidate);
}
MockRaftActorContext context = createActorContext();
follower = createBehavior(context);
follower.handleMessage(leaderActor, new RaftRPC() {
+ private static final long serialVersionUID = 1L;
+
@Override
public long getTerm() {
return 100;
member3Actor.expectMessageClass(RequestVote.class, 1);
member3Actor.expectBehaviorStateChange();
- member1ActorRef.tell(new ElectionTimeout(), ActorRef.noSender());
+ member1ActorRef.tell(ElectionTimeout.INSTANCE, ActorRef.noSender());
member2Actor.waitForExpectedMessages(RequestVote.class);
member3Actor.waitForExpectedMessages(RequestVote.class);
member3Actor.clear();
member3Actor.expectMessageClass(RequestVoteReply.class, 1);
- member3ActorRef.tell(new ElectionTimeout(), ActorRef.noSender());
+ member3ActorRef.tell(ElectionTimeout.INSTANCE, ActorRef.noSender());
member1Actor.waitForExpectedMessages(RequestVote.class);
member2Actor.waitForExpectedMessages(RequestVote.class);
// current term.
for(int i = 0; i < numCandidateElections - 1; i++) {
- member3ActorRef.tell(new ElectionTimeout(), ActorRef.noSender());
+ member3ActorRef.tell(ElectionTimeout.INSTANCE, ActorRef.noSender());
}
member1Actor.waitForExpectedMessages(RequestVote.class);
member3Actor.dropMessagesToBehavior(AppendEntries.class);
member3Actor.dropMessagesToBehavior(RequestVote.class);
- member2ActorRef.tell(new ElectionTimeout(), ActorRef.noSender());
+ member2ActorRef.tell(ElectionTimeout.INSTANCE, ActorRef.noSender());
member2Actor.waitForExpectedMessages(RequestVoteReply.class);
member3Actor.expectMessageClass(RequestVoteReply.class, 1);
member3Actor.expectMessageClass(AppendEntriesReply.class, 1);
- member3ActorRef.tell(new ElectionTimeout(), ActorRef.noSender());
+ member3ActorRef.tell(ElectionTimeout.INSTANCE, ActorRef.noSender());
member1Actor.waitForExpectedMessages(RequestVote.class);
member2Actor.waitForExpectedMessages(RequestVote.class);
member3Actor.dropMessagesToBehavior(RequestVote.class);
- member2ActorRef.tell(new ElectionTimeout(), ActorRef.noSender());
+ member2ActorRef.tell(ElectionTimeout.INSTANCE, ActorRef.noSender());
member1Actor.waitForExpectedMessages(RequestVote.class);
member3Actor.waitForExpectedMessages(RequestVote.class);
"akka://test/user/" + followerShardID.toString())).schemaContext(SCHEMA_CONTEXT).props().
withDispatcher(Dispatchers.DefaultDispatcherId()), leaderShardID.toString());
- leaderShard.tell(new ElectionTimeout(), ActorRef.noSender());
+ leaderShard.tell(ElectionTimeout.INSTANCE, ActorRef.noSender());
String leaderPath = waitUntilLeader(followerShard);
assertEquals("Shard leader path", leaderShard.path().toString(), leaderPath);
"akka://test/user/" + followerShardID.toString())).schemaContext(SCHEMA_CONTEXT).props().
withDispatcher(Dispatchers.DefaultDispatcherId()), leaderShardID.toString());
- leaderShard.tell(new ElectionTimeout(), ActorRef.noSender());
+ leaderShard.tell(ElectionTimeout.INSTANCE, ActorRef.noSender());
String leaderPath = waitUntilLeader(followerShard);
assertEquals("Shard leader path", leaderShard.path().toString(), leaderPath);
ImmutableMap.<String, String>builder().put(peerId1.toString(), peer1.path().toString()).
put(peerId2.toString(), peer2.path().toString()).build(), LOCAL_MEMBER_NAME, EntityOwnerSelectionStrategyConfig.newBuilder().build()).
withDispatcher(Dispatchers.DefaultDispatcherId()), leaderId.toString());
- leader.tell(new ElectionTimeout(), leader);
+ leader.tell(ElectionTimeout.INSTANCE, leader);
ShardTestKit.waitUntilLeader(leader);
leader.tell(PoisonPill.getInstance(), ActorRef.noSender());
peer2.tell(new PeerDown(LOCAL_MEMBER_NAME, leaderId.toString()), ActorRef.noSender());
- peer2.tell(new ElectionTimeout(), peer2);
+ peer2.tell(ElectionTimeout.INSTANCE, peer2);
ShardTestKit.waitUntilLeader(peer2);
TestActorRef<EntityOwnershipShard> leader = actorFactory.createTestActor(newShardProps(leaderId,
ImmutableMap.<String, String>builder().put(localId.toString(), shard.path().toString()).build(),
LOCAL_MEMBER_NAME, EntityOwnerSelectionStrategyConfig.newBuilder().build()).withDispatcher(Dispatchers.DefaultDispatcherId()), leaderId.toString());
- leader.tell(new ElectionTimeout(), leader);
+ leader.tell(ElectionTimeout.INSTANCE, leader);
ShardTestKit.waitUntilLeader(leader);