Decouple RaftState and RaftActorBehaviors 65/36565/1
authorRobert Varga <rovarga@cisco.com>
Tue, 22 Mar 2016 17:04:56 +0000 (18:04 +0100)
committerRobert Varga <rovarga@cisco.com>
Tue, 22 Mar 2016 17:04:56 +0000 (18:04 +0100)
This patch makes RaftState (which is a RAFT concept) independent of
behaviors (which are an implementation detail). This will allow us to
freeze RaftState and make it more widely available.

Change-Id: I70b4e7f762e3cb20a6c7b865f1a0c1f46f9a3d33
Signed-off-by: Robert Varga <rovarga@cisco.com>
opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActor.java
opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftState.java
opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractRaftActorBehavior.java

index e0858b0368b7cae0ff79f71d705fd80de0c31c01..304d58beb526f9ebedaf4ca37119013793a4100b 100644 (file)
@@ -40,6 +40,7 @@ import org.opendaylight.controller.cluster.raft.base.messages.LeaderTransitionin
 import org.opendaylight.controller.cluster.raft.base.messages.Replicate;
 import org.opendaylight.controller.cluster.raft.base.messages.SwitchBehavior;
 import org.opendaylight.controller.cluster.raft.behaviors.AbstractLeader;
+import org.opendaylight.controller.cluster.raft.behaviors.AbstractRaftActorBehavior;
 import org.opendaylight.controller.cluster.raft.behaviors.DelegatingRaftActorBehavior;
 import org.opendaylight.controller.cluster.raft.behaviors.Follower;
 import org.opendaylight.controller.cluster.raft.behaviors.RaftActorBehavior;
@@ -866,7 +867,7 @@ public abstract class RaftActor extends AbstractUntypedPersistentActor {
         @Override
         public RaftActorBehavior get() {
             if(this.message instanceof SwitchBehavior){
-                return ((SwitchBehavior) message).getNewState().createBehavior(getRaftActorContext());
+                return AbstractRaftActorBehavior.createBehavior(context, ((SwitchBehavior) message).getNewState());
             }
             return currentBehavior.handleMessage(sender, message);
         }
index 4c40ab61547b934f25ff793bbf12de47ec6155d2..32c0c18423102a419294070d3b58732a0c22ce4e 100644 (file)
@@ -8,37 +8,9 @@
 
 package org.opendaylight.controller.cluster.raft;
 
-import org.opendaylight.controller.cluster.raft.behaviors.Candidate;
-import org.opendaylight.controller.cluster.raft.behaviors.Follower;
-import org.opendaylight.controller.cluster.raft.behaviors.IsolatedLeader;
-import org.opendaylight.controller.cluster.raft.behaviors.Leader;
-import org.opendaylight.controller.cluster.raft.behaviors.RaftActorBehavior;
-
 public enum RaftState {
-    Candidate {
-        @Override
-        public RaftActorBehavior createBehavior(RaftActorContext context) {
-            return new Candidate(context);
-        }
-    },
-    Follower {
-        @Override
-        public RaftActorBehavior createBehavior(RaftActorContext context) {
-            return new Follower(context);
-        }
-    },
-    Leader {
-        @Override
-        public RaftActorBehavior createBehavior(RaftActorContext context) {
-            return new Leader(context);
-        }
-    },
-    IsolatedLeader {
-        @Override
-        public RaftActorBehavior createBehavior(RaftActorContext context) {
-            return new IsolatedLeader(context);
-        }
-    };
-
-    public abstract RaftActorBehavior createBehavior(RaftActorContext context);
+    Candidate,
+    Follower,
+    Leader,
+    IsolatedLeader;
 }
index 4e2eafcef04343f2c20aa174a23053daacd3b1af..79b3a82fd820c74b1067e3e2c3cc0c9b9c230eb0 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.controller.cluster.raft.behaviors;
 
 import akka.actor.ActorRef;
 import akka.actor.Cancellable;
+import com.google.common.base.Preconditions;
 import java.util.Random;
 import java.util.concurrent.TimeUnit;
 import org.opendaylight.controller.cluster.raft.ClientRequestTracker;
@@ -66,14 +67,29 @@ public abstract class AbstractRaftActorBehavior implements RaftActorBehavior {
 
     private final RaftState state;
 
-    protected AbstractRaftActorBehavior(RaftActorContext context, RaftState state) {
-        this.context = context;
-        this.state = state;
+    AbstractRaftActorBehavior(final RaftActorContext context, final RaftState state) {
+        this.context = Preconditions.checkNotNull(context);
+        this.state = Preconditions.checkNotNull(state);
         this.LOG = context.getLogger();
 
         logName = String.format("%s (%s)", context.getId(), state);
     }
 
+    public static RaftActorBehavior createBehavior(final RaftActorContext context, final RaftState state) {
+        switch (state) {
+            case Candidate:
+                return new Candidate(context);
+            case Follower:
+                return new Follower(context);
+            case IsolatedLeader:
+                return new IsolatedLeader(context);
+            case Leader:
+                return new Leader(context);
+            default:
+                throw new IllegalArgumentException("Unhandled state " + state);
+        }
+    }
+
     @Override
     public RaftState state() {
         return state;
@@ -432,7 +448,7 @@ public abstract class AbstractRaftActorBehavior implements RaftActorBehavior {
 
     protected RaftActorBehavior internalSwitchBehavior(RaftState newState) {
         if(context.getRaftPolicy().automaticElectionsEnabled()){
-            return internalSwitchBehavior(newState.createBehavior(context));
+            return internalSwitchBehavior(createBehavior(context, newState));
         }
         return this;
     }