From: Robert Varga Date: Tue, 22 Mar 2016 17:04:56 +0000 (+0100) Subject: Decouple RaftState and RaftActorBehaviors X-Git-Tag: release/boron~296 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=aefcae318b4329d41ff486d33ba1c7fc27626971 Decouple RaftState and RaftActorBehaviors 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 --- diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActor.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActor.java index e0858b0368..304d58beb5 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActor.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActor.java @@ -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); } diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftState.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftState.java index 4c40ab6154..32c0c18423 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftState.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftState.java @@ -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; } 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 4e2eafcef0..79b3a82fd8 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 @@ -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; }