Repository: helix
Updated Branches:
  refs/heads/helix-0.6.x 923e714ec -> 0474ee0ee


[HELIX-461] Add partitions without top state metric


Project: http://git-wip-us.apache.org/repos/asf/helix/repo
Commit: http://git-wip-us.apache.org/repos/asf/helix/commit/0474ee0e
Tree: http://git-wip-us.apache.org/repos/asf/helix/tree/0474ee0e
Diff: http://git-wip-us.apache.org/repos/asf/helix/diff/0474ee0e

Branch: refs/heads/helix-0.6.x
Commit: 0474ee0eee238383b916d4031973d9c1d3dacd05
Parents: 923e714
Author: Kanak Biscuitwala <[email protected]>
Authored: Wed Jun 25 10:00:13 2014 -0700
Committer: Kanak Biscuitwala <[email protected]>
Committed: Wed Jun 25 10:00:13 2014 -0700

----------------------------------------------------------------------
 .gitignore                                         |  2 ++
 .../stages/ExternalViewComputeStage.java           |  5 ++++-
 .../monitoring/mbeans/ClusterStatusMonitor.java    | 15 ++++++++++++---
 .../helix/monitoring/mbeans/ResourceMonitor.java   | 17 ++++++++++++++++-
 .../monitoring/mbeans/ResourceMonitorMBean.java    |  2 ++
 .../monitoring/mbeans/TestResourceMonitor.java     |  7 +++----
 6 files changed, 39 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/helix/blob/0474ee0e/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index 9097189..27c2cdf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,8 @@ target/
 /recipes/rabbitmq-consumer-group/target/
 .idea
 *.iml
+*.ipr
+*.iws
 .settings/
 out/
 .DS_Store

http://git-wip-us.apache.org/repos/asf/helix/blob/0474ee0e/helix-core/src/main/java/org/apache/helix/controller/stages/ExternalViewComputeStage.java
----------------------------------------------------------------------
diff --git 
a/helix-core/src/main/java/org/apache/helix/controller/stages/ExternalViewComputeStage.java
 
b/helix-core/src/main/java/org/apache/helix/controller/stages/ExternalViewComputeStage.java
index f427f3d..ba1f2b5 100644
--- 
a/helix-core/src/main/java/org/apache/helix/controller/stages/ExternalViewComputeStage.java
+++ 
b/helix-core/src/main/java/org/apache/helix/controller/stages/ExternalViewComputeStage.java
@@ -43,6 +43,7 @@ import org.apache.helix.model.Message;
 import org.apache.helix.model.Message.MessageType;
 import org.apache.helix.model.Partition;
 import org.apache.helix.model.Resource;
+import org.apache.helix.model.StateModelDefinition;
 import org.apache.helix.model.StatusUpdate;
 import org.apache.helix.monitoring.mbeans.ClusterStatusMonitor;
 import org.apache.log4j.Logger;
@@ -110,8 +111,10 @@ public class ExternalViewComputeStage extends 
AbstractBaseStage {
         if (clusterStatusMonitor != null
             && !idealState.getStateModelDefRef().equalsIgnoreCase(
                 DefaultSchedulerMessageHandlerFactory.SCHEDULER_TASK_QUEUE)) {
+          StateModelDefinition stateModelDef =
+              cache.getStateModelDef(idealState.getStateModelDefRef());
           clusterStatusMonitor.setResourceStatus(view,
-              cache._idealStateMap.get(view.getResourceName()));
+              cache._idealStateMap.get(view.getResourceName()), stateModelDef);
         }
       }
 

http://git-wip-us.apache.org/repos/asf/helix/blob/0474ee0e/helix-core/src/main/java/org/apache/helix/monitoring/mbeans/ClusterStatusMonitor.java
----------------------------------------------------------------------
diff --git 
a/helix-core/src/main/java/org/apache/helix/monitoring/mbeans/ClusterStatusMonitor.java
 
b/helix-core/src/main/java/org/apache/helix/monitoring/mbeans/ClusterStatusMonitor.java
index eaccc18..a4eaae3 100644
--- 
a/helix-core/src/main/java/org/apache/helix/monitoring/mbeans/ClusterStatusMonitor.java
+++ 
b/helix-core/src/main/java/org/apache/helix/monitoring/mbeans/ClusterStatusMonitor.java
@@ -24,6 +24,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
@@ -307,21 +308,29 @@ public class ClusterStatusMonitor implements 
ClusterStatusMonitorMBean {
     }
   }
 
-  public void setResourceStatus(ExternalView externalView, IdealState 
idealState) {
+  public void setResourceStatus(ExternalView externalView, IdealState 
idealState,
+      StateModelDefinition stateModelDef) {
+    String topState = null;
+    if (stateModelDef != null) {
+      List<String> priorityList = stateModelDef.getStatesPriorityList();
+      if (!priorityList.isEmpty()) {
+        topState = priorityList.get(0);
+      }
+    }
     try {
       String resourceName = externalView.getId();
       if (!_resourceMbeanMap.containsKey(resourceName)) {
         synchronized (this) {
           if (!_resourceMbeanMap.containsKey(resourceName)) {
             ResourceMonitor bean = new ResourceMonitor(_clusterName, 
resourceName);
-            bean.updateResource(externalView, idealState);
+            bean.updateResource(externalView, idealState, topState);
             registerResources(Arrays.asList(bean));
           }
         }
       }
       ResourceMonitor bean = _resourceMbeanMap.get(resourceName);
       String oldSensorName = bean.getSensorName();
-      bean.updateResource(externalView, idealState);
+      bean.updateResource(externalView, idealState, topState);
       String newSensorName = bean.getSensorName();
       if (!oldSensorName.equals(newSensorName)) {
         unregisterResources(Arrays.asList(resourceName));

http://git-wip-us.apache.org/repos/asf/helix/blob/0474ee0e/helix-core/src/main/java/org/apache/helix/monitoring/mbeans/ResourceMonitor.java
----------------------------------------------------------------------
diff --git 
a/helix-core/src/main/java/org/apache/helix/monitoring/mbeans/ResourceMonitor.java
 
b/helix-core/src/main/java/org/apache/helix/monitoring/mbeans/ResourceMonitor.java
index 284beef..1313686 100644
--- 
a/helix-core/src/main/java/org/apache/helix/monitoring/mbeans/ResourceMonitor.java
+++ 
b/helix-core/src/main/java/org/apache/helix/monitoring/mbeans/ResourceMonitor.java
@@ -20,18 +20,22 @@ package org.apache.helix.monitoring.mbeans;
  */
 
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.helix.HelixDefinedState;
 import org.apache.helix.model.ExternalView;
 import org.apache.helix.model.IdealState;
 import org.apache.log4j.Logger;
 
+import com.google.common.collect.Sets;
+
 public class ResourceMonitor implements ResourceMonitorMBean {
   private static final Logger LOG = Logger.getLogger(ResourceMonitor.class);
 
   private int _numOfPartitions;
   private int _numOfPartitionsInExternalView;
   private int _numOfErrorPartitions;
+  private int _numNonTopStatePartitions;
   private int _externalViewIdealStateDiff;
   private String _tag = ClusterStatusMonitor.DEFAULT_TAG;
   private String _resourceName;
@@ -53,6 +57,11 @@ public class ResourceMonitor implements ResourceMonitorMBean 
{
   }
 
   @Override
+  public long getMissingTopStatePartitionGauge() {
+    return _numNonTopStatePartitions;
+  }
+
+  @Override
   public long getDifferenceWithIdealStateGauge() {
     return _externalViewIdealStateDiff;
   }
@@ -67,7 +76,7 @@ public class ResourceMonitor implements ResourceMonitorMBean {
     return _resourceName;
   }
 
-  public void updateResource(ExternalView externalView, IdealState idealState) 
{
+  public void updateResource(ExternalView externalView, IdealState idealState, 
String topState) {
     if (externalView == null) {
       LOG.warn("external view is null");
       return;
@@ -77,6 +86,7 @@ public class ResourceMonitor implements ResourceMonitorMBean {
     if (idealState == null) {
       LOG.warn("ideal state is null for " + resourceName);
       _numOfErrorPartitions = 0;
+      _numNonTopStatePartitions = 0;
       _externalViewIdealStateDiff = 0;
       _numOfPartitionsInExternalView = 0;
       return;
@@ -86,6 +96,7 @@ public class ResourceMonitor implements ResourceMonitorMBean {
 
     int numOfErrorPartitions = 0;
     int numOfDiff = 0;
+    Set<String> topStatePartitions = Sets.newHashSet();
 
     if (_numOfPartitions == 0) {
       _numOfPartitions = idealState.getRecord().getMapFields().size();
@@ -112,11 +123,15 @@ public class ResourceMonitor implements 
ResourceMonitorMBean {
         if 
(externalViewRecord.get(host).equalsIgnoreCase(HelixDefinedState.ERROR.toString()))
 {
           numOfErrorPartitions++;
         }
+        if (topState != null && 
externalViewRecord.get(host).equalsIgnoreCase(topState)) {
+          topStatePartitions.add(partitionName);
+        }
       }
     }
     _numOfErrorPartitions = numOfErrorPartitions;
     _externalViewIdealStateDiff = numOfDiff;
     _numOfPartitionsInExternalView = externalView.getPartitionSet().size();
+    _numNonTopStatePartitions = _numOfPartitions - topStatePartitions.size();
     String tag = idealState.getInstanceGroupTag();
     if (tag == null || tag.equals("") || tag.equals("null")) {
       _tag = ClusterStatusMonitor.DEFAULT_TAG;

http://git-wip-us.apache.org/repos/asf/helix/blob/0474ee0e/helix-core/src/main/java/org/apache/helix/monitoring/mbeans/ResourceMonitorMBean.java
----------------------------------------------------------------------
diff --git 
a/helix-core/src/main/java/org/apache/helix/monitoring/mbeans/ResourceMonitorMBean.java
 
b/helix-core/src/main/java/org/apache/helix/monitoring/mbeans/ResourceMonitorMBean.java
index 33b001d..da1e4f8 100644
--- 
a/helix-core/src/main/java/org/apache/helix/monitoring/mbeans/ResourceMonitorMBean.java
+++ 
b/helix-core/src/main/java/org/apache/helix/monitoring/mbeans/ResourceMonitorMBean.java
@@ -26,6 +26,8 @@ public interface ResourceMonitorMBean extends 
SensorNameProvider {
 
   public long getErrorPartitionGauge();
 
+  public long getMissingTopStatePartitionGauge();
+
   public long getDifferenceWithIdealStateGauge();
 
   public long getExternalViewPartitionGauge();

http://git-wip-us.apache.org/repos/asf/helix/blob/0474ee0e/helix-core/src/test/java/org/apache/helix/monitoring/mbeans/TestResourceMonitor.java
----------------------------------------------------------------------
diff --git 
a/helix-core/src/test/java/org/apache/helix/monitoring/mbeans/TestResourceMonitor.java
 
b/helix-core/src/test/java/org/apache/helix/monitoring/mbeans/TestResourceMonitor.java
index 652eb88..d1a7e1e 100644
--- 
a/helix-core/src/test/java/org/apache/helix/monitoring/mbeans/TestResourceMonitor.java
+++ 
b/helix-core/src/test/java/org/apache/helix/monitoring/mbeans/TestResourceMonitor.java
@@ -26,7 +26,6 @@ import java.util.Map;
 import org.apache.helix.ZNRecord;
 import org.apache.helix.model.ExternalView;
 import org.apache.helix.model.IdealState;
-import org.apache.helix.monitoring.mbeans.ResourceMonitor;
 import org.apache.helix.tools.DefaultIdealStateCalculator;
 import org.testng.Assert;
 import org.testng.annotations.Test;
@@ -54,7 +53,7 @@ public class TestResourceMonitor {
     IdealState idealState = new IdealState(idealStateRecord);
     ExternalView externalView = new ExternalView(idealStateRecord);
 
-    monitor.updateResource(externalView, idealState);
+    monitor.updateResource(externalView, idealState, "MASTER");
 
     Assert.assertEquals(monitor.getDifferenceWithIdealStateGauge(), 0);
     Assert.assertEquals(monitor.getErrorPartitionGauge(), 0);
@@ -70,7 +69,7 @@ public class TestResourceMonitor {
       externalView.setStateMap(_dbName + "_" + 3 * i, map);
     }
 
-    monitor.updateResource(externalView, idealState);
+    monitor.updateResource(externalView, idealState, "MASTER");
     Assert.assertEquals(monitor.getDifferenceWithIdealStateGauge(), 0);
     Assert.assertEquals(monitor.getErrorPartitionGauge(), m);
     Assert.assertEquals(monitor.getExternalViewPartitionGauge(), _partitions);
@@ -80,7 +79,7 @@ public class TestResourceMonitor {
       externalView.getRecord().getMapFields().remove(_dbName + "_" + 4 * i);
     }
 
-    monitor.updateResource(externalView, idealState);
+    monitor.updateResource(externalView, idealState, "MASTER");
     Assert.assertEquals(monitor.getDifferenceWithIdealStateGauge(), n * 
(_replicas + 1));
     Assert.assertEquals(monitor.getErrorPartitionGauge(), 3);
     Assert.assertEquals(monitor.getExternalViewPartitionGauge(), _partitions - 
n);

Reply via email to