From: Robert Varga Date: Sat, 13 Feb 2016 23:19:41 +0000 (+0100) Subject: Turn ElectionTimeout into a proper singleton X-Git-Tag: release/boron~372 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=3d4e718d0fe598b33e50b8d3bbcca3ff3bbb8b3a Turn ElectionTimeout into a proper singleton There is no need to instantiate this object multiple times. Turn it into a singleton. Also add a bit of javadocs. Change-Id: Ied90a43ec297409b8074875d305d7f74e1b37ce4 Signed-off-by: Robert Varga --- diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/base/messages/ElectionTimeout.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/base/messages/ElectionTimeout.java index 84fa8b7590..0fdf43659a 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/base/messages/ElectionTimeout.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/base/messages/ElectionTimeout.java @@ -10,6 +10,19 @@ package org.opendaylight.controller.cluster.raft.base.messages; 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; + } } diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractRaftActorBehavior.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractRaftActorBehavior.java index d17fba03d4..4e2eafcef0 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractRaftActorBehavior.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractRaftActorBehavior.java @@ -38,9 +38,6 @@ import scala.concurrent.duration.FiniteDuration; * 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 */ @@ -267,7 +264,7 @@ public abstract class AbstractRaftActorBehavior implements RaftActorBehavior { 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()); } } diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Candidate.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Candidate.java index 7f73d0cfb0..612c327aeb 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Candidate.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Candidate.java @@ -66,7 +66,7 @@ public class Candidate extends AbstractRaftActorBehavior { startNewTerm(); if(votingPeers.isEmpty()){ - actor().tell(ELECTION_TIMEOUT, actor()); + actor().tell(ElectionTimeout.INSTANCE, actor()); } else { scheduleElection(electionDuration()); } diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Follower.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Follower.java index bcc2480f45..0a9f3ebd07 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Follower.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Follower.java @@ -56,7 +56,7 @@ public class Follower extends AbstractRaftActorBehavior { if(canStartElection()) { if (context.getPeerIds().isEmpty() && getLeaderId() == null) { - actor().tell(ELECTION_TIMEOUT, actor()); + actor().tell(ElectionTimeout.INSTANCE, actor()); } else { scheduleElection(electionDuration()); } diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Leader.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Leader.java index c76798f3b2..924c30f657 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Leader.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Leader.java @@ -143,7 +143,7 @@ public class Leader extends AbstractLeader { // 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()); diff --git a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/CandidateTest.java b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/CandidateTest.java index 8dd81dab8c..73e0a16515 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/CandidateTest.java +++ b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/CandidateTest.java @@ -93,7 +93,7 @@ public class CandidateTest extends AbstractRaftActorBehaviorTest { candidate = new Candidate(raftActorContext); RaftActorBehavior newBehavior = - candidate.handleMessage(candidateActor, new ElectionTimeout()); + candidate.handleMessage(candidateActor, ElectionTimeout.INSTANCE); assertEquals("Behavior", RaftState.Leader, newBehavior.state()); } @@ -104,7 +104,7 @@ public class CandidateTest extends AbstractRaftActorBehaviorTest { 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()); } diff --git a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/DelayedMessagesElectionScenarioTest.java b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/DelayedMessagesElectionScenarioTest.java index 47bd459857..000456bd57 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/DelayedMessagesElectionScenarioTest.java +++ b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/DelayedMessagesElectionScenarioTest.java @@ -76,7 +76,7 @@ public class DelayedMessagesElectionScenarioTest extends AbstractLeaderElectionS 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); @@ -154,7 +154,7 @@ public class DelayedMessagesElectionScenarioTest extends AbstractLeaderElectionS member3Actor.dropMessagesToBehavior(RequestVote.class); - member2ActorRef.tell(new ElectionTimeout(), ActorRef.noSender()); + member2ActorRef.tell(ElectionTimeout.INSTANCE, ActorRef.noSender()); member1Actor.waitForExpectedMessages(RequestVote.class); member3Actor.waitForExpectedMessages(RequestVote.class); diff --git a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/FollowerTest.java b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/FollowerTest.java index 537101e8dc..63bf14922a 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/FollowerTest.java +++ b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/FollowerTest.java @@ -109,7 +109,7 @@ public class FollowerTest extends AbstractRaftActorBehaviorTest { follower = new Follower(createActorContext()); - RaftActorBehavior raftBehavior = follower.handleMessage(followerActor, new ElectionTimeout()); + RaftActorBehavior raftBehavior = follower.handleMessage(followerActor, ElectionTimeout.INSTANCE); assertTrue(raftBehavior instanceof Candidate); } @@ -967,6 +967,8 @@ public class FollowerTest extends AbstractRaftActorBehaviorTest { MockRaftActorContext context = createActorContext(); follower = createBehavior(context); follower.handleMessage(leaderActor, new RaftRPC() { + private static final long serialVersionUID = 1L; + @Override public long getTerm() { return 100; diff --git a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/PartitionedCandidateOnStartupElectionScenarioTest.java b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/PartitionedCandidateOnStartupElectionScenarioTest.java index 119816c68f..376c01e500 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/PartitionedCandidateOnStartupElectionScenarioTest.java +++ b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/PartitionedCandidateOnStartupElectionScenarioTest.java @@ -61,7 +61,7 @@ public class PartitionedCandidateOnStartupElectionScenarioTest extends AbstractL 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); @@ -118,7 +118,7 @@ public class PartitionedCandidateOnStartupElectionScenarioTest extends AbstractL 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); @@ -187,7 +187,7 @@ public class PartitionedCandidateOnStartupElectionScenarioTest extends AbstractL // 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); diff --git a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/PartitionedLeadersElectionScenarioTest.java b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/PartitionedLeadersElectionScenarioTest.java index d29a707350..83f7a75c9c 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/PartitionedLeadersElectionScenarioTest.java +++ b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/PartitionedLeadersElectionScenarioTest.java @@ -159,7 +159,7 @@ public class PartitionedLeadersElectionScenarioTest extends AbstractLeaderElecti member3Actor.dropMessagesToBehavior(AppendEntries.class); member3Actor.dropMessagesToBehavior(RequestVote.class); - member2ActorRef.tell(new ElectionTimeout(), ActorRef.noSender()); + member2ActorRef.tell(ElectionTimeout.INSTANCE, ActorRef.noSender()); member2Actor.waitForExpectedMessages(RequestVoteReply.class); @@ -207,7 +207,7 @@ public class PartitionedLeadersElectionScenarioTest extends AbstractLeaderElecti 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); @@ -251,7 +251,7 @@ public class PartitionedLeadersElectionScenarioTest extends AbstractLeaderElecti member3Actor.dropMessagesToBehavior(RequestVote.class); - member2ActorRef.tell(new ElectionTimeout(), ActorRef.noSender()); + member2ActorRef.tell(ElectionTimeout.INSTANCE, ActorRef.noSender()); member1Actor.waitForExpectedMessages(RequestVote.class); member3Actor.waitForExpectedMessages(RequestVote.class); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java index 51063c8d2c..c5cd4635c3 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java @@ -2338,7 +2338,7 @@ public class ShardTest extends AbstractShardTest { "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); @@ -2414,7 +2414,7 @@ public class ShardTest extends AbstractShardTest { "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); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShardTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShardTest.java index fc9b5298e1..762f5f6692 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShardTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShardTest.java @@ -417,7 +417,7 @@ public class EntityOwnershipShardTest extends AbstractEntityOwnershipTest { ImmutableMap.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); @@ -565,7 +565,7 @@ public class EntityOwnershipShardTest extends AbstractEntityOwnershipTest { 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); @@ -591,7 +591,7 @@ public class EntityOwnershipShardTest extends AbstractEntityOwnershipTest { TestActorRef leader = actorFactory.createTestActor(newShardProps(leaderId, ImmutableMap.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);