You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by is...@apache.org on 2014/11/26 14:44:01 UTC

[4/7] stratos git commit: getting ClusterInstanceContext using the instance id in the MonitorHierarchy

getting ClusterInstanceContext using the instance id in the MonitorHierarchy


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

Branch: refs/heads/master
Commit: c3e04dc4d2f555ec99c23592a1c087a41bd14cf5
Parents: 55be3ed
Author: Isuru Haththotuwa <is...@apache.org>
Authored: Wed Nov 26 17:53:44 2014 +0530
Committer: Isuru Haththotuwa <is...@apache.org>
Committed: Wed Nov 26 17:57:00 2014 +0530

----------------------------------------------------------------------
 .../monitor/cluster/VMClusterMonitor.java       | 88 +++++++++++++++-----
 .../monitor/cluster/VMLbClusterMonitor.java     | 64 ++++++++------
 .../status/checker/StatusChecker.java           |  6 +-
 .../cluster/ClusterStatusActiveProcessor.java   |  2 +-
 .../cluster/ClusterStatusInActiveProcessor.java |  2 +-
 .../ClusterStatusTerminatedProcessor.java       |  2 +-
 .../MemberGradientOfMemoryConsumptionEvent.java |  8 +-
 ...emberSecondDerivativeOfLoadAverageEvent.java |  8 +-
 8 files changed, 125 insertions(+), 55 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/c3e04dc4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
index 067df89..aeaaf62 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
@@ -18,6 +18,7 @@
  */
 package org.apache.stratos.autoscaler.monitor.cluster;
 
+import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.commons.logging.Log;
@@ -64,6 +65,7 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
 
         String networkPartitionId = averageLoadAverageEvent.getNetworkPartitionId();
         String clusterId = averageLoadAverageEvent.getClusterId();
+        String instanceId = averageLoadAverageEvent.getInstanceId();
         float value = averageLoadAverageEvent.getValue();
 
         if (log.isDebugEnabled()) {
@@ -71,7 +73,7 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
                     clusterId, networkPartitionId, value));
         }
 
-        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(networkPartitionId);
+        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(instanceId ,networkPartitionId);
         if (null != networkPartitionContext) {
             networkPartitionContext.setAverageLoadAverage(value);
         } else {
@@ -89,12 +91,13 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
 
         String networkPartitionId = gradientOfLoadAverageEvent.getNetworkPartitionId();
         String clusterId = gradientOfLoadAverageEvent.getClusterId();
+        String instanceId = gradientOfLoadAverageEvent.getInstanceId();
         float value = gradientOfLoadAverageEvent.getValue();
         if (log.isDebugEnabled()) {
             log.debug(String.format("Grad of load avg event: [cluster] %s [network-partition] %s [value] %s",
                     clusterId, networkPartitionId, value));
         }
-        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(networkPartitionId);
+        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(instanceId, networkPartitionId);
         if (null != networkPartitionContext) {
             networkPartitionContext.setLoadAverageGradient(value);
         } else {
@@ -111,12 +114,13 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
 
         String networkPartitionId = secondDerivativeOfLoadAverageEvent.getNetworkPartitionId();
         String clusterId = secondDerivativeOfLoadAverageEvent.getClusterId();
+        String instanceId = secondDerivativeOfLoadAverageEvent.getInstanceId();
         float value = secondDerivativeOfLoadAverageEvent.getValue();
         if (log.isDebugEnabled()) {
             log.debug(String.format("Second Derivation of load avg event: [cluster] %s "
                     + "[network-partition] %s [value] %s", clusterId, networkPartitionId, value));
         }
-        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(networkPartitionId);
+        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(instanceId, networkPartitionId);
         if (null != networkPartitionContext) {
             networkPartitionContext.setLoadAverageSecondDerivative(value);
         } else {
@@ -133,12 +137,13 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
 
         String networkPartitionId = averageMemoryConsumptionEvent.getNetworkPartitionId();
         String clusterId = averageMemoryConsumptionEvent.getClusterId();
+        String instanceId = averageMemoryConsumptionEvent.getInstanceId();
         float value = averageMemoryConsumptionEvent.getValue();
         if (log.isDebugEnabled()) {
             log.debug(String.format("Avg Memory Consumption event: [cluster] %s [network-partition] %s "
                     + "[value] %s", clusterId, networkPartitionId, value));
         }
-        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(networkPartitionId);
+        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(instanceId, networkPartitionId);
         if (null != networkPartitionContext) {
             networkPartitionContext.setAverageMemoryConsumption(value);
         } else {
@@ -156,12 +161,13 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
 
         String networkPartitionId = gradientOfMemoryConsumptionEvent.getNetworkPartitionId();
         String clusterId = gradientOfMemoryConsumptionEvent.getClusterId();
+        String instanceId = gradientOfMemoryConsumptionEvent.getInstanceId();
         float value = gradientOfMemoryConsumptionEvent.getValue();
         if (log.isDebugEnabled()) {
             log.debug(String.format("Grad of Memory Consumption event: [cluster] %s "
                     + "[network-partition] %s [value] %s", clusterId, networkPartitionId, value));
         }
-        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(networkPartitionId);
+        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(instanceId, networkPartitionId);
         if (null != networkPartitionContext) {
             networkPartitionContext.setMemoryConsumptionGradient(value);
         } else {
@@ -178,12 +184,13 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
 
         String networkPartitionId = secondDerivativeOfMemoryConsumptionEvent.getNetworkPartitionId();
         String clusterId = secondDerivativeOfMemoryConsumptionEvent.getClusterId();
+        String instanceId = secondDerivativeOfMemoryConsumptionEvent.getInstanceId();
         float value = secondDerivativeOfMemoryConsumptionEvent.getValue();
         if (log.isDebugEnabled()) {
             log.debug(String.format("Second Derivation of Memory Consumption event: [cluster] %s "
                     + "[network-partition] %s [value] %s", clusterId, networkPartitionId, value));
         }
-        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(networkPartitionId);
+        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(instanceId, networkPartitionId);
         if (null != networkPartitionContext) {
             networkPartitionContext.setMemoryConsumptionSecondDerivative(value);
         } else {
@@ -205,8 +212,13 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
                     clusterId, networkPartitionId, floatValue));
         }
 
+<<<<<<< HEAD
         NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(networkPartitionId);
         if (null != networkPartitionContext) {
+=======
+        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(null, networkPartitionId);
+        if(null != networkPartitionContext){
+>>>>>>> getting ClusterInstanceContext using the instance id in the MonitorHierarchy
             networkPartitionContext.setAverageRequestsServedPerInstance(floatValue);
 
         } else {
@@ -224,6 +236,7 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
 
         String networkPartitionId = averageRequestsInFlightEvent.getNetworkPartitionId();
         String clusterId = averageRequestsInFlightEvent.getClusterId();
+        String instanceId = averageRequestsInFlightEvent.getInstanceId();
         Float servedCount = averageRequestsInFlightEvent.getServedCount();
         Float activeInstances = averageRequestsInFlightEvent.getActiveInstances();
         Float requestsServedPerInstance = servedCount / activeInstances;
@@ -235,7 +248,7 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
             log.debug(String.format("Average Rif event: [cluster] %s [network-partition] %s [value] %s",
                     clusterId, networkPartitionId, value));
         }
-        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(networkPartitionId);
+        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(instanceId, networkPartitionId);
         if (null != networkPartitionContext) {
             networkPartitionContext.setAverageRequestsInFlight(value);
         } else {
@@ -252,12 +265,13 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
 
         String networkPartitionId = gradientOfRequestsInFlightEvent.getNetworkPartitionId();
         String clusterId = gradientOfRequestsInFlightEvent.getClusterId();
+        String instanceId = gradientOfRequestsInFlightEvent.getInstanceId();
         float value = gradientOfRequestsInFlightEvent.getValue();
         if (log.isDebugEnabled()) {
             log.debug(String.format("Gradient of Rif event: [cluster] %s [network-partition] %s [value] %s",
                     clusterId, networkPartitionId, value));
         }
-        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(networkPartitionId);
+        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(instanceId, networkPartitionId);
         if (null != networkPartitionContext) {
             networkPartitionContext.setRequestsInFlightGradient(value);
         } else {
@@ -274,12 +288,13 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
 
         String networkPartitionId = secondDerivativeOfRequestsInFlightEvent.getNetworkPartitionId();
         String clusterId = secondDerivativeOfRequestsInFlightEvent.getClusterId();
+        String instanceId = secondDerivativeOfRequestsInFlightEvent.getInstanceId();
         float value = secondDerivativeOfRequestsInFlightEvent.getValue();
         if (log.isDebugEnabled()) {
             log.debug(String.format("Second derivative of Rif event: [cluster] %s "
                     + "[network-partition] %s [value] %s", clusterId, networkPartitionId, value));
         }
-        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(networkPartitionId);
+        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(instanceId, networkPartitionId);
         if (null != networkPartitionContext) {
             networkPartitionContext.setRequestsInFlightSecondDerivative(value);
         } else {
@@ -294,10 +309,11 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
     public void handleMemberAverageMemoryConsumptionEvent(
             MemberAverageMemoryConsumptionEvent memberAverageMemoryConsumptionEvent) {
 
+        String instanceId = memberAverageMemoryConsumptionEvent.getInstanceId();
         String memberId = memberAverageMemoryConsumptionEvent.getMemberId();
         Member member = getMemberByMemberId(memberId);
         String networkPartitionId = getNetworkPartitionIdByMemberId(memberId);
-        NetworkPartitionContext networkPartitionCtxt = getNetworkPartitionCtxt(networkPartitionId);
+        NetworkPartitionContext networkPartitionCtxt = getNetworkPartitionCtxt(instanceId, networkPartitionId);
         PartitionContext partitionCtxt = networkPartitionCtxt.getPartitionCtxt(member.getPartitionId());
         MemberStatsContext memberStatsContext = partitionCtxt.getMemberStatsContext(memberId);
         if (null == memberStatsContext) {
@@ -314,10 +330,11 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
     public void handleMemberGradientOfMemoryConsumptionEvent(
             MemberGradientOfMemoryConsumptionEvent memberGradientOfMemoryConsumptionEvent) {
 
+        String instanceId = memberGradientOfMemoryConsumptionEvent.getInstanceId();
         String memberId = memberGradientOfMemoryConsumptionEvent.getMemberId();
         Member member = getMemberByMemberId(memberId);
         String networkPartitionId = getNetworkPartitionIdByMemberId(memberId);
-        NetworkPartitionContext networkPartitionCtxt = getNetworkPartitionCtxt(networkPartitionId);
+        NetworkPartitionContext networkPartitionCtxt = getNetworkPartitionCtxt(instanceId, networkPartitionId);
         PartitionContext partitionCtxt = networkPartitionCtxt.getPartitionCtxt(member.getPartitionId());
         MemberStatsContext memberStatsContext = partitionCtxt.getMemberStatsContext(memberId);
         if (null == memberStatsContext) {
@@ -340,10 +357,11 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
     public void handleMemberAverageLoadAverageEvent(
             MemberAverageLoadAverageEvent memberAverageLoadAverageEvent) {
 
+        String instanceId = memberAverageLoadAverageEvent.getInstanceId();
         String memberId = memberAverageLoadAverageEvent.getMemberId();
         Member member = getMemberByMemberId(memberId);
         String networkPartitionId = getNetworkPartitionIdByMemberId(memberId);
-        NetworkPartitionContext networkPartitionCtxt = getNetworkPartitionCtxt(networkPartitionId);
+        NetworkPartitionContext networkPartitionCtxt = getNetworkPartitionCtxt(instanceId, networkPartitionId);
         PartitionContext partitionCtxt = networkPartitionCtxt.getPartitionCtxt(member.getPartitionId());
         MemberStatsContext memberStatsContext = partitionCtxt.getMemberStatsContext(memberId);
         if (null == memberStatsContext) {
@@ -360,10 +378,11 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
     public void handleMemberGradientOfLoadAverageEvent(
             MemberGradientOfLoadAverageEvent memberGradientOfLoadAverageEvent) {
 
+        String instanceId = memberGradientOfLoadAverageEvent.getInstanceId();
         String memberId = memberGradientOfLoadAverageEvent.getMemberId();
         Member member = getMemberByMemberId(memberId);
         String networkPartitionId = getNetworkPartitionIdByMemberId(memberId);
-        NetworkPartitionContext networkPartitionCtxt = getNetworkPartitionCtxt(networkPartitionId);
+        NetworkPartitionContext networkPartitionCtxt = getNetworkPartitionCtxt(instanceId, networkPartitionId);
         PartitionContext partitionCtxt = networkPartitionCtxt.getPartitionCtxt(member.getPartitionId());
         MemberStatsContext memberStatsContext = partitionCtxt.getMemberStatsContext(memberId);
         if (null == memberStatsContext) {
@@ -380,10 +399,11 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
     public void handleMemberSecondDerivativeOfLoadAverageEvent(
             MemberSecondDerivativeOfLoadAverageEvent memberSecondDerivativeOfLoadAverageEvent) {
 
+        String instanceId = memberSecondDerivativeOfLoadAverageEvent.getInstanceId();
         String memberId = memberSecondDerivativeOfLoadAverageEvent.getMemberId();
         Member member = getMemberByMemberId(memberId);
         String networkPartitionId = getNetworkPartitionIdByMemberId(memberId);
-        NetworkPartitionContext networkPartitionCtxt = getNetworkPartitionCtxt(networkPartitionId);
+        NetworkPartitionContext networkPartitionCtxt = getNetworkPartitionCtxt(instanceId, networkPartitionId);
         PartitionContext partitionCtxt = networkPartitionCtxt.getPartitionCtxt(member.getPartitionId());
         MemberStatsContext memberStatsContext = partitionCtxt.getMemberStatsContext(memberId);
         if (null == memberStatsContext) {
@@ -417,7 +437,7 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
         }
 
         NetworkPartitionContext nwPartitionCtxt;
-        nwPartitionCtxt = getNetworkPartitionCtxt(member);
+        nwPartitionCtxt = getNetworkPartitionCtxt(instanceId, member);
         String partitionId = getPartitionOfMember(memberId);
         PartitionContext partitionCtxt = nwPartitionCtxt.getPartitionCtxt(partitionId);
         if (!partitionCtxt.activeMemberExist(memberId)) {
@@ -452,10 +472,11 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
     public void handleMemberActivatedEvent(
             MemberActivatedEvent memberActivatedEvent) {
 
+        String instanceId = memberActivatedEvent.getInstanceId();
         String networkPartitionId = memberActivatedEvent.getNetworkPartitionId();
         String partitionId = memberActivatedEvent.getPartitionId();
         String memberId = memberActivatedEvent.getMemberId();
-        NetworkPartitionContext networkPartitionCtxt = getNetworkPartitionCtxt(networkPartitionId);
+        NetworkPartitionContext networkPartitionCtxt = getNetworkPartitionCtxt(instanceId, networkPartitionId);
         PartitionContext partitionContext;
         partitionContext = networkPartitionCtxt.getPartitionCtxt(partitionId);
         partitionContext.addMemberStatsContext(new MemberStatsContext(memberId));
@@ -474,7 +495,8 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
         String networkPartitionId = maintenanceModeEvent.getNetworkPartitionId();
         String partitionId = maintenanceModeEvent.getPartitionId();
         String memberId = maintenanceModeEvent.getMemberId();
-        NetworkPartitionContext networkPartitionCtxt = getNetworkPartitionCtxt(networkPartitionId);
+        String instanceId = maintenanceModeEvent.getInstanceId();
+        NetworkPartitionContext networkPartitionCtxt = getNetworkPartitionCtxt(instanceId, networkPartitionId);
         PartitionContext partitionContext = networkPartitionCtxt.getPartitionCtxt(partitionId);
         partitionContext.addMemberStatsContext(new MemberStatsContext(memberId));
         if (log.isDebugEnabled()) {
@@ -487,6 +509,21 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
     @Override
     public void handleMemberReadyToShutdownEvent(
             MemberReadyToShutdownEvent memberReadyToShutdownEvent) {
+<<<<<<< HEAD
+=======
+
+        NetworkPartitionContext nwPartitionCtxt;
+        String networkPartitionId = memberReadyToShutdownEvent.getNetworkPartitionId();
+        String instanceId = memberReadyToShutdownEvent.getInstanceId();
+        nwPartitionCtxt = getNetworkPartitionCtxt(instanceId, networkPartitionId);
+
+        // start a new member in the same Partition
+        String memberId = memberReadyToShutdownEvent.getMemberId();
+        String partitionId = getPartitionOfMember(memberId);
+        PartitionContext partitionCtxt = nwPartitionCtxt.getPartitionCtxt(partitionId);
+        // terminate the shutdown ready member
+        CloudControllerClient ccClient = CloudControllerClient.getInstance();
+>>>>>>> getting ClusterInstanceContext using the instance id in the MonitorHierarchy
         try {
             NetworkPartitionContext nwPartitionCtxt;
             String networkPartitionId = memberReadyToShutdownEvent.getNetworkPartitionId();
@@ -526,7 +563,7 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
         String clusterId = memberTerminatedEvent.getClusterId();
         String instanceId = memberTerminatedEvent.getInstanceId();
         String partitionId = memberTerminatedEvent.getPartitionId();
-        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(networkPartitionId);
+        NetworkPartitionContext networkPartitionContext = getNetworkPartitionCtxt(instanceId, networkPartitionId);
         PartitionContext partitionContext = networkPartitionContext.getPartitionCtxt(partitionId);
         partitionContext.removeMemberStatsContext(memberId);
 
@@ -614,7 +651,7 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
         Thread memberTerminator = new Thread(new Runnable() {
             public void run() {
 
-                for (NetworkPartitionContext networkPartitionContext : getNetworkPartitionCtxts().values()) {
+                for (NetworkPartitionContext networkPartitionContext : getAllNetworkPartitionCtxts().values()) {
                     for (PartitionContext partitionContext : networkPartitionContext.getPartitionCtxts().values()) {
                         //if (log.isDebugEnabled()) {
                         log.info("Starting to terminate all members in cluster [" + getClusterId() + "] Network Partition [ " +
@@ -657,9 +694,20 @@ abstract public class VMClusterMonitor extends AbstractClusterMonitor {
         return vmClusterContext.getNetworkPartitionCtxts();
     }
 
+    public Map<String, NetworkPartitionContext> getAllNetworkPartitionCtxts() {
+
+        Map<String, NetworkPartitionContext> nwPartitionIdToNwPartitionMap = new HashMap<String, NetworkPartitionContext>();
+
+        for (AbstractClusterContext clusterContext : instanceIdToClusterContextMap.values()) {
+            VMClusterContext vmClusterContext = (VMClusterContext) clusterContext;
+            nwPartitionIdToNwPartitionMap.putAll(vmClusterContext.getNetworkPartitionCtxts());
+        }
+        return nwPartitionIdToNwPartitionMap;
+    }
+
     protected NetworkPartitionContext getNetworkPartitionCtxt(String instanceId, String id) {
 
-        VMClusterContext vmClusterContext = (VMClusterContext) instanceIdToClusterContextMap.get(instanceId);;
+        VMClusterContext vmClusterContext = (VMClusterContext) instanceIdToClusterContextMap.get(instanceId);
         return vmClusterContext.getNetworkPartitionCtxt(id);
     }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/c3e04dc4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMLbClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMLbClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMLbClusterMonitor.java
index af770a0..aa8ec30 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMLbClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMLbClusterMonitor.java
@@ -19,15 +19,14 @@
 package org.apache.stratos.autoscaler.monitor.cluster;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.commons.configuration.XMLConfiguration;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.autoscaler.NetworkPartitionContext;
-import org.apache.stratos.autoscaler.NetworkPartitionLbHolder;
-import org.apache.stratos.autoscaler.PartitionContext;
-import org.apache.stratos.autoscaler.VMClusterContext;
+import org.apache.stratos.autoscaler.*;
 import org.apache.stratos.autoscaler.monitor.events.MonitorScalingEvent;
 import org.apache.stratos.autoscaler.partition.PartitionManager;
 import org.apache.stratos.autoscaler.policy.PolicyManager;
@@ -83,35 +82,46 @@ public class VMLbClusterMonitor extends VMClusterMonitor {
 
     @Override
     protected void monitor() {
-        // TODO make this concurrent
-        for (NetworkPartitionContext networkPartitionContext : getNetworkPartitionCtxts().values()) {
 
-            // minimum check per partition
-            for (PartitionContext partitionContext : networkPartitionContext.getPartitionCtxts()
-                    .values()) {
+        Set<Map.Entry<String, AbstractClusterContext>> instanceIdToClusterCtxtEntries = instanceIdToClusterContextMap.entrySet();
+        for (final Map.Entry<String, AbstractClusterContext> instanceIdToClusterCtxtEntry : instanceIdToClusterCtxtEntries) {
+            Runnable monitoringRunnable = new Runnable() {
 
-                if (partitionContext != null) {
-                    getMinCheckKnowledgeSession().setGlobal("clusterId", getClusterId());
-                    getMinCheckKnowledgeSession().setGlobal("isPrimary", false);
+                @Override
+                public void run() {
+                    for (NetworkPartitionContext networkPartitionContext : getNetworkPartitionCtxts(instanceIdToClusterCtxtEntry.getKey()).values()) {
 
-                    if (log.isDebugEnabled()) {
-                        log.debug(String.format("Running minimum check for partition %s ",
-                                                partitionContext.getPartitionId()));
-                    }
+                        // minimum check per partition
+                        for (PartitionContext partitionContext : networkPartitionContext.getPartitionCtxts()
+                                .values()) {
 
-                    minCheckFactHandle =
-                            AutoscalerRuleEvaluator.evaluateMinCheck(getMinCheckKnowledgeSession(),
-                                                                     minCheckFactHandle,
-                                                                     partitionContext);
-                    obsoleteCheckFactHandle = 
-                    		AutoscalerRuleEvaluator.evaluateObsoleteCheck(getObsoleteCheckKnowledgeSession(), 
-                    				obsoleteCheckFactHandle, partitionContext);
-                    // start only in the first partition context
-                    break;
-                }
+                            if (partitionContext != null) {
+                                getMinCheckKnowledgeSession().setGlobal("clusterId", getClusterId());
+                                getMinCheckKnowledgeSession().setGlobal("isPrimary", false);
 
-            }
+                                if (log.isDebugEnabled()) {
+                                    log.debug(String.format("Running minimum check for partition %s ",
+                                            partitionContext.getPartitionId()));
+                                }
+
+                                minCheckFactHandle =
+                                        AutoscalerRuleEvaluator.evaluateMinCheck(getMinCheckKnowledgeSession(),
+                                                minCheckFactHandle,
+                                                partitionContext);
+                                obsoleteCheckFactHandle =
+                                        AutoscalerRuleEvaluator.evaluateObsoleteCheck(getObsoleteCheckKnowledgeSession(),
+                                                obsoleteCheckFactHandle, partitionContext);
+                                // start only in the first partition context
+                                break;
+                            }
+
+                        }
+
+                    }
+                }
+            };
 
+            monitoringRunnable.run();
         }
     }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/c3e04dc4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java
index 4bfe40a..b36ce2a 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java
@@ -174,7 +174,7 @@ public class StatusChecker {
      */
     private boolean clusterActive(VMClusterMonitor monitor) {
         boolean clusterActive = false;
-        for (NetworkPartitionContext networkPartitionContext : monitor.getNetworkPartitionCtxts().values()) {
+        for (NetworkPartitionContext networkPartitionContext : monitor.getAllNetworkPartitionCtxts().values()) {
             //minimum check per partition
             for (PartitionContext partitionContext : networkPartitionContext.getPartitionCtxts().values()) {
                 if (partitionContext.getMinimumMemberCount() == partitionContext.getActiveMemberCount()) {
@@ -198,7 +198,7 @@ public class StatusChecker {
      */
     private boolean clusterMonitorHasMembers(VMClusterMonitor monitor) {
         boolean hasMember = false;
-        for (NetworkPartitionContext networkPartitionContext : monitor.getNetworkPartitionCtxts().values()) {
+        for (NetworkPartitionContext networkPartitionContext : monitor.getAllNetworkPartitionCtxts().values()) {
             //minimum check per partition
             for (PartitionContext partitionContext : networkPartitionContext.getPartitionCtxts().values()) {
                 if (partitionContext.getNonTerminatedMemberCount() > 0) {
@@ -263,7 +263,7 @@ public class StatusChecker {
      */
     private boolean getClusterInactive(VMClusterMonitor monitor, String partitionId) {
         boolean clusterInActive = false;
-        for (NetworkPartitionContext networkPartitionContext : monitor.getNetworkPartitionCtxts().values()) {
+        for (NetworkPartitionContext networkPartitionContext : monitor.getAllNetworkPartitionCtxts().values()) {
             for (PartitionContext partition : networkPartitionContext.getPartitionCtxts().values()) {
                 if (partitionId.equals(partition.getPartitionId()) &&
                         partition.getActiveMemberCount() <= partition.getMinimumMemberCount()) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/c3e04dc4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/cluster/ClusterStatusActiveProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/cluster/ClusterStatusActiveProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/cluster/ClusterStatusActiveProcessor.java
index 23ef47c..29e3f9a 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/cluster/ClusterStatusActiveProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/cluster/ClusterStatusActiveProcessor.java
@@ -65,7 +65,7 @@ public class ClusterStatusActiveProcessor extends ClusterStatusProcessor {
         VMClusterMonitor monitor = (VMClusterMonitor) AutoscalerContext.getInstance().
                                     getClusterMonitor(clusterId);
         boolean clusterActive = false;
-        for (NetworkPartitionContext networkPartitionContext : monitor.getNetworkPartitionCtxts().values()) {
+        for (NetworkPartitionContext networkPartitionContext : monitor.getNetworkPartitionCtxts(instanceId).values()) {
             //minimum check per partition
             for (PartitionContext partitionContext : networkPartitionContext.getPartitionCtxts().values()) {
                 if (partitionContext.getMinimumMemberCount() == partitionContext.getActiveMemberCount()) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/c3e04dc4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/cluster/ClusterStatusInActiveProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/cluster/ClusterStatusInActiveProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/cluster/ClusterStatusInActiveProcessor.java
index 2b17653..9b60a9e 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/cluster/ClusterStatusInActiveProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/cluster/ClusterStatusInActiveProcessor.java
@@ -91,7 +91,7 @@ public class ClusterStatusInActiveProcessor extends ClusterStatusProcessor {
 
     private boolean getClusterInactive(VMClusterMonitor monitor) {
         boolean clusterInActive = false;
-        for (NetworkPartitionContext networkPartitionContext : monitor.getNetworkPartitionCtxts().values()) {
+        for (NetworkPartitionContext networkPartitionContext : monitor.getAllNetworkPartitionCtxts().values()) {
             for (PartitionContext partition : networkPartitionContext.getPartitionCtxts().values()) {
                 if (partition.getActiveMemberCount() <= partition.getMinimumMemberCount()) {
                     clusterInActive = true;

http://git-wip-us.apache.org/repos/asf/stratos/blob/c3e04dc4/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/cluster/ClusterStatusTerminatedProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/cluster/ClusterStatusTerminatedProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/cluster/ClusterStatusTerminatedProcessor.java
index d480690..a2a6b13 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/cluster/ClusterStatusTerminatedProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/cluster/ClusterStatusTerminatedProcessor.java
@@ -120,7 +120,7 @@ public class ClusterStatusTerminatedProcessor extends ClusterStatusProcessor {
      */
     private boolean clusterMonitorHasMembers(VMClusterMonitor monitor) {
         boolean hasMember = false;
-        for (NetworkPartitionContext networkPartitionContext : monitor.getNetworkPartitionCtxts().values()) {
+        for (NetworkPartitionContext networkPartitionContext : monitor.getAllNetworkPartitionCtxts().values()) {
             //minimum check per partition
             for (PartitionContext partitionContext : networkPartitionContext.getPartitionCtxts().values()) {
                 if (partitionContext.getNonTerminatedMemberCount() > 0) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/c3e04dc4/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/health/stat/MemberGradientOfMemoryConsumptionEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/health/stat/MemberGradientOfMemoryConsumptionEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/health/stat/MemberGradientOfMemoryConsumptionEvent.java
index b94f5ef..f9a528a 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/health/stat/MemberGradientOfMemoryConsumptionEvent.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/health/stat/MemberGradientOfMemoryConsumptionEvent.java
@@ -26,10 +26,12 @@ import org.apache.stratos.messaging.event.Event;
  */
 public class MemberGradientOfMemoryConsumptionEvent extends Event {
 
+    private final String instanceId;
     private final String memberId;
     private final float value;
 
-    public MemberGradientOfMemoryConsumptionEvent(String memberId, float value) {
+    public MemberGradientOfMemoryConsumptionEvent(String instanceId, String memberId, float value) {
+        this.instanceId = instanceId;
         this.memberId = memberId;
         this.value = value;
     }
@@ -42,4 +44,8 @@ public class MemberGradientOfMemoryConsumptionEvent extends Event {
     public float getValue() {
         return value;
     }
+
+    public String getInstanceId() {
+        return instanceId;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/c3e04dc4/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/health/stat/MemberSecondDerivativeOfLoadAverageEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/health/stat/MemberSecondDerivativeOfLoadAverageEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/health/stat/MemberSecondDerivativeOfLoadAverageEvent.java
index 23be4f0..e4d4b9c 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/health/stat/MemberSecondDerivativeOfLoadAverageEvent.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/health/stat/MemberSecondDerivativeOfLoadAverageEvent.java
@@ -26,11 +26,13 @@ import org.apache.stratos.messaging.event.Event;
  */
 public class MemberSecondDerivativeOfLoadAverageEvent extends Event {
     private final String clusterId;
+    private final String instanceId;
     private final String memberId;
     private final float value;
 
-    public MemberSecondDerivativeOfLoadAverageEvent(String clusterId, String memberId, float value) {
+    public MemberSecondDerivativeOfLoadAverageEvent(String clusterId, String instanceId, String memberId, float value) {
         this.clusterId = clusterId;
+        this.instanceId = instanceId;
         this.memberId = memberId;
         this.value = value;
     }
@@ -47,4 +49,8 @@ public class MemberSecondDerivativeOfLoadAverageEvent extends Event {
     public String getClusterId() {
         return clusterId;
     }
+
+    public String getInstanceId() {
+        return instanceId;
+    }
 }