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);
