Turn ElectionTimeout into a proper singleton 12/34612/4
authorRobert Varga <rovarga@cisco.com>
Sat, 13 Feb 2016 23:19:41 +0000 (00:19 +0100)
committerGerrit Code Review <gerrit@opendaylight.org>
Mon, 15 Feb 2016 14:08:09 +0000 (14:08 +0000)
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 <rovarga@cisco.com>
12 files changed:
opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/base/messages/ElectionTimeout.java
opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractRaftActorBehavior.java
opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Candidate.java
opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Follower.java
opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Leader.java
opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/CandidateTest.java
opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/DelayedMessagesElectionScenarioTest.java
opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/FollowerTest.java
opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/PartitionedCandidateOnStartupElectionScenarioTest.java
opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/PartitionedLeadersElectionScenarioTest.java
opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java
opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipShardTest.java

index 84fa8b759014427f471b9353931eaa82e969ada1..0fdf43659ac46453f920fea6f3d9f77c75d9be0e 100644 (file)
@@ -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;
+    }
 }
index d17fba03d4ba58e77168602ffe388431b0a64a1a..4e2eafcef04343f2c20aa174a23053daacd3b1af 100644 (file)
@@ -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());
         }
     }
 
index 7f73d0cfb0a24a8b85960c2b1fdb031c3131cfdd..612c327aeb054dd1cacb8a74a82861ede3f3ef0d 100644 (file)
@@ -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());
         }
index bcc2480f459318f35ce3aa30e2d818404626d99b..0a9f3ebd078680ff12a3641ca6960dc831586b48 100644 (file)
@@ -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());
             }
index c76798f3b276c602c3a0190f8749f3e1aca4de89..924c30f657b927528a81ac9997564418c8ec2fe5 100644 (file)
@@ -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());
 
index 8dd81dab8cf2c79d225bcff4dd0d77b649292150..73e0a165156082787f998259d054c26a07b49222 100644 (file)
@@ -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());
     }
index 47bd4598578dfe1c8025121585d35e7af841aad2..000456bd57937e8c813e64f603d58f3b75379ce5 100644 (file)
@@ -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);
index 537101e8dc013ac4bc5e5254f1908995b19433e1..63bf14922a1b1c10acab2f0f37543c004f52d99d 100644 (file)
@@ -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;
index 119816c68f699ef75977ef17c9c4a0f2a1ff3dc7..376c01e500930b7a5ada41591116cad9460d19ae 100644 (file)
@@ -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);
index d29a70735082f19b6fc66f898d561c55f2e7be65..83f7a75c9cc368157d018429892df5467a3dca51 100644 (file)
@@ -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);
index 51063c8d2cc5fe6b2f9e2eb8b4a16d7ed62e30b3..c5cd4635c320908b0650384b5e91407fc5a73269 100644 (file)
@@ -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);
 
index fc9b5298e150eb6ff895c3eb263852a9eaaff051..762f5f66923798319866ffa8471e7b8916e84878 100644 (file)
@@ -417,7 +417,7 @@ public class EntityOwnershipShardTest extends AbstractEntityOwnershipTest {
                 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);
 
@@ -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<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);