X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2Fshardmanager%2FShardManagerInfo.java;h=41a2afe19313964aedf75832d5e56ac8b0164e1b;hb=24c074a4b32ac97980a652b78824b7c2f97ffb78;hp=e3fba5d24e1a36519a17e597d0d9600e4d7704c4;hpb=7baa214169a0f3565aa7797305c2696d0be338a6;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManagerInfo.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManagerInfo.java index e3fba5d24e..41a2afe193 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManagerInfo.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManagerInfo.java @@ -9,92 +9,96 @@ package org.opendaylight.controller.cluster.datastore.shardmanager; import akka.actor.ActorRef; +import akka.pattern.Patterns; import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableList; -import java.util.Collection; +import com.google.common.base.Throwables; import java.util.List; -import org.opendaylight.controller.cluster.datastore.jmx.mbeans.shardmanager.ShardManagerInfoMBean; +import org.opendaylight.controller.cluster.access.concepts.MemberName; +import org.opendaylight.controller.cluster.datastore.identifiers.ShardIdentifier; import org.opendaylight.controller.cluster.raft.RaftState; import org.opendaylight.controller.md.sal.common.util.jmx.AbstractMXBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import scala.concurrent.Await; +import scala.concurrent.duration.Duration; final class ShardManagerInfo extends AbstractMXBean implements ShardManagerInfoMBean { public static final String JMX_CATEGORY_SHARD_MANAGER = "ShardManager"; - // The only states that you can switch to from outside. You cannot switch to Candidate/IsolatedLeader for example - private static final Collection ACCEPTABLE_STATES - = ImmutableList.of(RaftState.Leader.name(), RaftState.Follower.name()); - private static final Logger LOG = LoggerFactory.getLogger(ShardManagerInfo.class); + private static final long ASK_TIMEOUT_MILLIS = 5000; - private final String memberName; - private final List localShards; + private final ActorRef shardManager; + private final MemberName memberName; - private boolean syncStatus = false; + private volatile boolean syncStatus = false; - private ShardManager shardManager; - private ShardManagerInfo(String memberName, String name, String mxBeanType, List localShards) { + ShardManagerInfo(final ActorRef shardManager, final MemberName memberName, final String name, + final String mxBeanType) { super(name, mxBeanType, JMX_CATEGORY_SHARD_MANAGER); - this.memberName = memberName; - this.localShards = localShards; - } - - static ShardManagerInfo createShardManagerMBean(String memberName, String name, String mxBeanType, - List localShards){ - ShardManagerInfo shardManagerInfo = new ShardManagerInfo(memberName, name, mxBeanType, localShards); - - shardManagerInfo.registerMBean(); - - return shardManagerInfo; - } - - public void addLocalShard(String shardName) { - localShards.add(shardName); + this.shardManager = Preconditions.checkNotNull(shardManager); + this.memberName = Preconditions.checkNotNull(memberName); } + @SuppressWarnings("unchecked") @Override public List getLocalShards() { - return localShards; + try { + return (List) Await.result( + Patterns.ask(shardManager, GetLocalShardIds.INSTANCE, ASK_TIMEOUT_MILLIS), Duration.Inf()); + } catch (Exception e) { + throw Throwables.propagate(e); + } } @Override public boolean getSyncStatus() { - return this.syncStatus; + return syncStatus; } - @Override - public String getMemberName() { - return memberName; + void setSyncStatus(boolean syncStatus) { + this.syncStatus = syncStatus; } @Override - public void switchAllLocalShardsState(String newState, long term) { - LOG.info("switchAllLocalShardsState called newState = {}, term = {}", newState, term); + public String getMemberName() { + return memberName.getName(); + } - for(String shardName : localShards){ - switchShardState(shardName, newState, term); + private void requestSwitchShardState(final ShardIdentifier shardId, final String newState, final long term) { + // Validates strings argument + final RaftState state = RaftState.valueOf(newState); + + // Leader and Follower are the only states to which we can switch externally + switch (state) { + case Follower: + case Leader: + try { + Await.result(Patterns.ask(shardManager, new SwitchShardBehavior(shardId, state, term), + ASK_TIMEOUT_MILLIS), Duration.Inf()); + } catch (Exception e) { + throw Throwables.propagate(e); + } + break; + case Candidate: + case IsolatedLeader: + default: + throw new IllegalArgumentException("Illegal target state " + state); } } @Override - public void switchShardState(String shardName, String newState, long term) { - LOG.info("switchShardState called shardName = {}, newState = {}, term = {}", shardName, newState, term); - - Preconditions.checkArgument(localShards.contains(shardName), shardName + " is not local"); - Preconditions.checkArgument(ACCEPTABLE_STATES.contains(newState)); - - shardManager.getSelf().tell(new SwitchShardBehavior(shardName, RaftState.valueOf(newState), term), - ActorRef.noSender()); - } - - public void setSyncStatus(boolean syncStatus){ - this.syncStatus = syncStatus; + public void switchAllLocalShardsState(String newState, long term) { + LOG.info("switchAllLocalShardsState called newState = {}, term = {}", newState, term); + requestSwitchShardState(null, newState, term); } - public void setShardManager(ShardManager shardManager){ - this.shardManager = shardManager; + @Override + public void switchShardState(String shardId, String newState, long term) { + final ShardIdentifier identifier = ShardIdentifier.fromShardIdString(shardId); + LOG.info("switchShardState called shardName = {}, newState = {}, term = {}", shardId, newState, term); + requestSwitchShardState(identifier, newState, term); } }