BUG 2185: Expand the scope of sync status to cover a slow follower
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / jmx / mbeans / shardmanager / ShardManagerInfo.java
index 0c609b459e19cee48bca50fea2a04db88101838f..5de46cb87b928ba53a85ad6fb8a2d5ec2bda2d37 100644 (file)
@@ -8,44 +8,88 @@
 
 package org.opendaylight.controller.cluster.datastore.jmx.mbeans.shardmanager;
 
-import org.opendaylight.controller.cluster.datastore.jmx.mbeans.AbstractBaseMBean;
-
+import akka.actor.ActorRef;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
 import java.util.List;
+import org.opendaylight.controller.cluster.datastore.ShardManager;
+import org.opendaylight.controller.cluster.datastore.messages.SwitchShardBehavior;
+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;
+
+public class ShardManagerInfo extends AbstractMXBean implements ShardManagerInfoMBean {
+
+    public static String JMX_CATEGORY_SHARD_MANAGER = "ShardManager";
 
-public class ShardManagerInfo extends AbstractBaseMBean implements
-    ShardManagerInfoMBean {
+    // The only states that you can switch to from outside. You cannot switch to Candidate/IsolatedLeader for example
+    private static final List<String> ACCEPTABLE_STATES
+            = Lists.newArrayList(RaftState.Leader.name(), RaftState.Follower.name());
 
-    private final String name;
+    private static final Logger LOG = LoggerFactory.getLogger(ShardManagerInfo.class);
+
+    private final String memberName;
     private final List<String> localShards;
 
-    public ShardManagerInfo(String name, List<String> localShards) {
-        this.name = name;
+    private boolean syncStatus = false;
+
+    private ShardManager shardManager;
+
+    public ShardManagerInfo(String memberName, String name, String mxBeanType, List<String> localShards) {
+        super(name, mxBeanType, JMX_CATEGORY_SHARD_MANAGER);
+        this.memberName = memberName;
         this.localShards = localShards;
     }
 
+    public static ShardManagerInfo createShardManagerMBean(String memberName, String name, String mxBeanType,
+            List<String> localShards){
+        ShardManagerInfo shardManagerInfo = new ShardManagerInfo(memberName, name, mxBeanType, localShards);
+
+        shardManagerInfo.registerMBean();
+
+        return shardManagerInfo;
+    }
+
+    @Override
+    public List<String> getLocalShards() {
+        return localShards;
+    }
 
-    @Override protected String getMBeanName() {
-        return name;
+    @Override
+    public boolean getSyncStatus() {
+        return this.syncStatus;
     }
 
-    @Override protected String getMBeanType() {
-        return JMX_TYPE_DISTRIBUTED_DATASTORE;
+    @Override
+    public String getMemberName() {
+        return memberName;
     }
 
-    @Override protected String getMBeanCategory() {
-        return JMX_CATEGORY_SHARD_MANAGER;
+    @Override
+    public void switchAllLocalShardsState(String newState, long term) {
+        LOG.info("switchAllLocalShardsState called newState = {}, term = {}", newState, term);
+
+        for(String shardName : localShards){
+            switchShardState(shardName, newState, term);
+        }
     }
 
-    public static ShardManagerInfo createShardManagerMBean(String name, List<String> localShards){
-        ShardManagerInfo shardManagerInfo = new ShardManagerInfo(name,
-            localShards);
+    @Override
+    public void switchShardState(String shardName, String newState, long term) {
+        LOG.info("switchShardState called shardName = {}, newState = {}, term = {}", shardName, newState, term);
 
-        shardManagerInfo.registerMBean();
+        Preconditions.checkArgument(localShards.contains(shardName), shardName + " is not local");
+        Preconditions.checkArgument(ACCEPTABLE_STATES.contains(newState));
 
-        return shardManagerInfo;
+        shardManager.getSelf().tell(new SwitchShardBehavior(shardName, newState, term), ActorRef.noSender());
     }
 
-    @Override public List<String> getLocalShards() {
-        return localShards;
+    public void setSyncStatus(boolean syncStatus){
+        this.syncStatus = syncStatus;
+    }
+
+    public void setShardManager(ShardManager shardManager){
+        this.shardManager = shardManager;
     }
 }