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

[04/50] stratos git commit: adding a map to keep track of inactive and terminating instances

adding a map to keep track of inactive and terminating instances


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

Branch: refs/heads/master
Commit: c920d2e03617f58316184fee6e25768177259b96
Parents: 65e6c0e
Author: reka <rt...@gmail.com>
Authored: Wed Dec 10 20:27:48 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Thu Dec 11 10:30:51 2014 +0530

----------------------------------------------------------------------
 .../monitor/component/ApplicationMonitor.java   |  23 ++--
 .../monitor/component/GroupMonitor.java         |  42 +++----
 .../component/ParentComponentMonitor.java       | 117 ++++++++++++-------
 3 files changed, 103 insertions(+), 79 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/c920d2e0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
index 9026966..f8f2e82 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
@@ -129,36 +129,33 @@ public class ApplicationMonitor extends ParentComponentMonitor {
 
     @Override
     public void onChildStatusEvent(MonitorStatusEvent statusEvent) {
-        String id = statusEvent.getId();
+        String childId = statusEvent.getId();
         String instanceId = statusEvent.getInstanceId();
         LifeCycleState status1 = statusEvent.getStatus();
         //Events coming from parent are In_Active(in faulty detection), Scaling events, termination
         if (status1 == ClusterStatus.Active || status1 == GroupStatus.Active) {
-            onChildActivatedEvent(id, instanceId);
+            onChildActivatedEvent(childId, instanceId);
 
         } else if (status1 == ClusterStatus.Inactive || status1 == GroupStatus.Inactive) {
-            this.markMonitorAsInactive(id);
-            onChildInactiveEvent(id, instanceId);
+            this.markInstanceAsInactive(childId, instanceId);
+            onChildInactiveEvent(childId, instanceId);
 
         } else if (status1 == ClusterStatus.Terminating || status1 == GroupStatus.Terminating) {
-            //mark the child monitor as inactive in the map
-            this.markMonitorAsTerminating(id);
+            //mark the child monitor as inActive in the map
+            markInstanceAsTerminating(childId, instanceId);
 
         } else if (status1 == ClusterStatus.Terminated || status1 == GroupStatus.Terminated) {
             //Check whether all dependent goes Terminated and then start them in parallel.
-            if (this.terminatingMonitorsList.contains(id)) {
-                this.terminatingMonitorsList.remove(id);
-                this.aliasToActiveMonitorsMap.remove(id);
-            } else {
-                log.warn("[monitor] " + id + " cannot be found in the inactive monitors list");
-            }
+            removeInstanceFromFromInactiveMap(childId, instanceId);
+            removeInstanceFromFromTerminatingMap(childId, instanceId);
+
             ApplicationInstance instance = (ApplicationInstance) instanceIdToInstanceMap.get(instanceId);
             if (instance != null) {
                 if (instance.getStatus() == ApplicationStatus.Terminating) {
                     ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(this.id,
                             appId, instanceId);
                 } else {
-                    onChildTerminatedEvent(id, instanceId);
+                    onChildTerminatedEvent(childId, instanceId);
                 }
             } else {
                 log.warn("The required instance cannot be found in the the [GroupMonitor] " +

http://git-wip-us.apache.org/repos/asf/stratos/blob/c920d2e0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
index 8ba999b..c139ff5 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
@@ -125,10 +125,10 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
      */
     public void setStatus(GroupStatus status, String instanceId) {
         GroupInstance groupInstance = (GroupInstance) this.instanceIdToInstanceMap.get(instanceId);
-        if(groupInstance == null) {
+        if (groupInstance == null) {
             log.warn("The required group [instance] " + instanceId + " not found in the GroupMonitor");
         } else {
-            if(groupInstance.getStatus() != status) {
+            if (groupInstance.getStatus() != status) {
                 groupInstance.setStatus(status);
             }
         }
@@ -173,49 +173,45 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
 
     @Override
     public void onChildStatusEvent(MonitorStatusEvent statusEvent) {
-        String id = statusEvent.getId();
+        String childId = statusEvent.getId();
         String instanceId = statusEvent.getInstanceId();
         LifeCycleState status1 = statusEvent.getStatus();
         //Events coming from parent are In_Active(in faulty detection), Scaling events, termination
 
         if (status1 == ClusterStatus.Active || status1 == GroupStatus.Active) {
-            onChildActivatedEvent(id, instanceId);
+            onChildActivatedEvent(childId, instanceId);
 
         } else if (status1 == ClusterStatus.Inactive || status1 == GroupStatus.Inactive) {
             //handling restart of stratos
-            if (!this.aliasToActiveMonitorsMap.get(id).hasStartupDependents()) {
-                onChildActivatedEvent(id, instanceId);
+            if (!this.aliasToActiveMonitorsMap.get(childId).hasStartupDependents()) {
+                onChildActivatedEvent(childId, instanceId);
             } else {
-                this.markMonitorAsInactive(instanceId);
-                onChildInactiveEvent(id, instanceId);
+                this.markInstanceAsInactive(childId, instanceId);
+                onChildInactiveEvent(childId, instanceId);
             }
 
-
         } else if (status1 == ClusterStatus.Terminating || status1 == GroupStatus.Terminating) {
-            //mark the child monitor as inactive in the map
-            this.markMonitorAsTerminating(instanceId);
+            //mark the child monitor as inActive in the map
+            markInstanceAsTerminating(childId, instanceId);
 
         } else if (status1 == ClusterStatus.Terminated || status1 == GroupStatus.Terminated) {
             //Check whether all dependent goes Terminated and then start them in parallel.
-            if (this.terminatingMonitorsList.contains(id)) {
-                this.terminatingMonitorsList.remove(id);
-                this.aliasToActiveMonitorsMap.remove(id);
-            } else {
-                log.warn("[monitor] " + id + " cannot be found in the inactive monitors list");
-            }
+            removeInstanceFromFromInactiveMap(childId, instanceId);
+            removeInstanceFromFromTerminatingMap(childId, instanceId);
             GroupInstance instance = (GroupInstance) this.instanceIdToInstanceMap.get(instanceId);
             if (instance != null) {
                 if (instance.getStatus() == GroupStatus.Terminating || instance.getStatus() == GroupStatus.Terminated) {
                     ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(this.id,
                             appId, instanceId);
                 } else {
-                    onChildTerminatedEvent(id, instanceId);
+                    onChildTerminatedEvent(childId, instanceId);
                 }
             } else {
                 log.warn("The required instance cannot be found in the the [GroupMonitor] " +
                         this.id);
             }
         }
+
     }
 
     @Override
@@ -388,7 +384,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
             if (parentPartitionId != null &&
                     networkPartitionContext.getPartitionCtxt(parentPartitionId) == null) {
                 partitionContext = new GroupLevelPartitionContext(parentPartitionId,
-                                                networkPartitionId);
+                        networkPartitionId);
                 networkPartitionContext.addPartitionContext((GroupLevelPartitionContext) partitionContext);
                 if (log.isInfoEnabled()) {
                     log.info("[Partition] " + parentPartitionId + "has been added for the " +
@@ -627,14 +623,14 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
         return networkPartitionCtxts;
     }
 
-    public GroupLevelNetworkPartitionContext getNetworkPartitionContext(String networkPartitionId) {
-        return this.networkPartitionCtxts.get(networkPartitionId);
-    }
-
     public void setNetworkPartitionCtxts(Map<String, GroupLevelNetworkPartitionContext> networkPartitionCtxts) {
         this.networkPartitionCtxts = networkPartitionCtxts;
     }
 
+    public GroupLevelNetworkPartitionContext getNetworkPartitionContext(String networkPartitionId) {
+        return this.networkPartitionCtxts.get(networkPartitionId);
+    }
+
     public void addNetworkPartitionContext(GroupLevelNetworkPartitionContext clusterLevelNetworkPartitionContext) {
         this.networkPartitionCtxts.put(clusterLevelNetworkPartitionContext.getId(), clusterLevelNetworkPartitionContext);
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/c920d2e0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
index a0e552c..050d85d 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
@@ -43,15 +43,14 @@ import org.apache.stratos.autoscaler.monitor.cluster.AbstractClusterMonitor;
 import org.apache.stratos.autoscaler.monitor.cluster.VMClusterMonitor;
 import org.apache.stratos.autoscaler.monitor.events.builder.MonitorStatusEventBuilder;
 import org.apache.stratos.autoscaler.util.ServiceReferenceHolder;
-import org.apache.stratos.messaging.domain.applications.Group;
 import org.apache.stratos.messaging.domain.applications.GroupStatus;
 import org.apache.stratos.messaging.domain.applications.ParentComponent;
 import org.apache.stratos.messaging.domain.instance.ClusterInstance;
-import org.apache.stratos.messaging.domain.instance.Instance;
 import org.apache.stratos.messaging.domain.topology.ClusterStatus;
 import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
 
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * Monitor is to monitor it's child monitors and
@@ -68,15 +67,15 @@ public abstract class ParentComponentMonitor extends Monitor {
     protected Map<String, Monitor> aliasToActiveMonitorsMap;
     //Pending monitors list
     protected List<String> pendingMonitorsList;
-    //instanceIds map, stopped monitors
-    protected List<String> inactiveMonitorsList;
-    //terminating instances list
-    protected List<String> terminatingMonitorsList;
+    //instanceIds map, key=alias, value instanceIds stopped monitors
+    protected Map<String, List<String>> inactiveInstancesMap;
+    //terminating map, key=alias, value instanceIds
+    protected Map<String, List<String>> terminatingInstancesMap;
 
     public ParentComponentMonitor(ParentComponent component) throws DependencyBuilderException {
-        aliasToActiveMonitorsMap = new HashMap<String, Monitor>();
-        inactiveMonitorsList = new ArrayList<String>();
-        terminatingMonitorsList = new ArrayList<String>();
+        aliasToActiveMonitorsMap = new ConcurrentHashMap<String, Monitor>();
+        inactiveInstancesMap = new ConcurrentHashMap<String, List<String>>();
+        terminatingInstancesMap = new ConcurrentHashMap<String, List<String>>();
         pendingMonitorsList = new ArrayList<String>();
         //clusterIdToClusterMonitorsMap = new HashMap<String, AbstractClusterMonitor>();
         this.id = component.getUniqueIdentifier();
@@ -235,24 +234,18 @@ public abstract class ParentComponentMonitor extends Monitor {
     /**
      * This will start the child monitors based on the active of siblings according to start up order
      *
-     * @param eventId parent id of the event which received
+     * @param childId parent id of the event which received
      */
-    protected void onChildActivatedEvent(String eventId, String instanceId) {
+    protected void onChildActivatedEvent(String childId, String instanceId) {
         try {
-            //if the activated monitor is in in_active map move it to active map
-            if (this.inactiveMonitorsList.contains(eventId)) {
-                this.inactiveMonitorsList.remove(eventId);
-            }
-
-            if (this.terminatingMonitorsList.contains(eventId)) {
-                this.terminatingMonitorsList.remove(eventId);
-            }
+            removeInstanceFromFromInactiveMap(childId, instanceId);
+            removeInstanceFromFromTerminatingMap(childId, instanceId);
 
             boolean startDep;
-            if (!aliasToActiveMonitorsMap.containsKey(eventId) || !pendingMonitorsList.contains(eventId)) {
-                startDep = startDependency(eventId, instanceId);
+            if (!aliasToActiveMonitorsMap.containsKey(childId) || !pendingMonitorsList.contains(childId)) {
+                startDep = startDependency(childId, instanceId);
             } else {
-                startDep = startDependencyByInstanceCreation(eventId, instanceId);
+                startDep = startDependencyByInstanceCreation(childId, instanceId);
             }
 
             //Checking whether all the monitors got created
@@ -260,7 +253,7 @@ public abstract class ParentComponentMonitor extends Monitor {
                 ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().
                         process(this.id, this.appId, instanceId);
             } else {
-                log.info("started a child: " + startDep + " by the group/cluster: " + eventId);
+                log.info("started a child: " + startDep + " by the group/cluster: " + childId);
             }
         } catch (MonitorNotFoundException e) {
             //TODO revert the siblings and notify parent, change a flag for reverting/un-subscription
@@ -399,7 +392,7 @@ public abstract class ParentComponentMonitor extends Monitor {
                 log.warn("Dependent [monitor] " + context1.getId() + " not in the correct state");
                 allDependentTerminated = false;
                 return allDependentTerminated;
-            } else if (this.inactiveMonitorsList.contains(context1.getId())) {
+            } else if (this.inactiveInstancesMap.containsKey(context1.getId())) {
                 log.info("Waiting for the [dependent] " + context1.getId() + " to be terminated...");
                 allDependentTerminated = false;
                 return allDependentTerminated;
@@ -415,7 +408,8 @@ public abstract class ParentComponentMonitor extends Monitor {
                                         String instanceId) {
         boolean parentsTerminated = false;
         for (ApplicationChildContext context1 : parentContexts) {
-            if (this.inactiveMonitorsList.contains(context1.getId())) {
+            if (this.inactiveInstancesMap.containsKey(context1.getId()) &&
+                    this.inactiveInstancesMap.get(context1.getId()).contains(instanceId)) {
                 log.info("Waiting for the [Parent Monitor] " + context1.getId()
                         + " to be terminated");
                 parentsTerminated = false;
@@ -437,8 +431,10 @@ public abstract class ParentComponentMonitor extends Monitor {
     private boolean allParentActive(List<ApplicationChildContext> parentContexts, String instanceId) {
         boolean parentsActive = false;
         for (ApplicationChildContext context1 : parentContexts) {
-            if (this.inactiveMonitorsList.contains(instanceId) ||
-                    this.terminatingMonitorsList.contains(instanceId)) {
+            if (this.inactiveInstancesMap.containsKey(context1.getId()) &&
+                    this.inactiveInstancesMap.get(context1.getId()).contains(instanceId) ||
+                    this.terminatingInstancesMap.containsKey(context1.getId()) &&
+                            this.terminatingInstancesMap.get(context1.getId()).contains(instanceId)) {
                 parentsActive = false;
                 log.info("Dependent [Monitor] " + context1.getId()
                         + " is not yet active");
@@ -478,20 +474,55 @@ public abstract class ParentComponentMonitor extends Monitor {
     }
 
     // move to inactive monitors list to use in the Terminated event
-    protected synchronized void markMonitorAsInactive(String monitorKey) {
+    protected synchronized void markInstanceAsInactive(String childId, String instanceId) {
+
+        if (!this.inactiveInstancesMap.containsKey(childId)) {
+            this.inactiveInstancesMap.get(childId).add(instanceId);
+        } else {
+            List<String> instanceIds = new ArrayList<String>();
+            instanceIds.add(instanceId);
+            this.inactiveInstancesMap.put(childId, instanceIds);
+        }
+    }
+
+    // move to inactive monitors list to use in the Terminated event
+    protected synchronized void removeInstanceFromFromInactiveMap(String childId, String instanceId) {
+        if (this.inactiveInstancesMap.containsKey(childId) &&
+                this.inactiveInstancesMap.get(childId).contains(instanceId)) {
+            this.inactiveInstancesMap.get(childId).remove(instanceId);
+            if(this.inactiveInstancesMap.get(childId).isEmpty()) {
+                this.inactiveInstancesMap.remove(childId);
+            }
+        }
+    }
 
-        if (!this.inactiveMonitorsList.contains(monitorKey)) {
-            this.inactiveMonitorsList.add(monitorKey);
+    // move to inactive monitors list to use in the Terminated event
+    protected synchronized void removeInstanceFromFromTerminatingMap(String childId, String instanceId) {
+        if (this.terminatingInstancesMap.containsKey(childId) &&
+                this.terminatingInstancesMap.get(childId).contains(instanceId)) {
+            this.terminatingInstancesMap.get(childId).remove(instanceId);
+            if(this.terminatingInstancesMap.get(childId).isEmpty()) {
+                this.terminatingInstancesMap.remove(childId);
+            }
         }
     }
 
     // move to inactive monitors list to use in the Terminated event
-    protected synchronized void markMonitorAsTerminating(String monitorKey) {
-        if (!this.terminatingMonitorsList.contains(monitorKey)) {
-            if (this.inactiveMonitorsList.contains(monitorKey)) {
-                this.inactiveMonitorsList.remove(monitorKey);
+    protected synchronized void markInstanceAsTerminating(String childId, String instanceId) {
+        if (!this.terminatingInstancesMap.containsKey(childId)) {
+            if (this.inactiveInstancesMap.containsKey(childId) &&
+                    this.inactiveInstancesMap.get(childId).contains(instanceId)) {
+                this.inactiveInstancesMap.get(childId).remove(instanceId);
+                this.terminatingInstancesMap.get(childId).add(instanceId);
+            } else {
+                if (this.inactiveInstancesMap.containsKey(childId) &&
+                        this.inactiveInstancesMap.get(childId).contains(instanceId)) {
+                    this.inactiveInstancesMap.get(childId).remove(instanceId);
+                }
+                List<String> instanceIds = new ArrayList<String>();
+                instanceIds.add(instanceId);
+                this.terminatingInstancesMap.put(childId, instanceIds);
             }
-            this.terminatingMonitorsList.add(monitorKey);
         }
     }
 
@@ -552,20 +583,20 @@ public abstract class ParentComponentMonitor extends Monitor {
         return hasInDepChild;
     }
 
-    public List<String> getAliasToInActiveMonitorsMap() {
-        return this.inactiveMonitorsList;
+    public Map<String, List<String>> getAliasToInActiveMonitorsMap() {
+        return this.inactiveInstancesMap;
     }
 
-    public void setAliasToInActiveMonitorsMap(List<String> inactiveMonitorsList) {
-        this.inactiveMonitorsList = inactiveMonitorsList;
+    public void setAliasToInActiveMonitorsMap(Map<String, List<String>> inactiveMonitorsList) {
+        this.inactiveInstancesMap = inactiveMonitorsList;
     }
 
-    public List<String> getTerminatingMonitorsList() {
-        return terminatingMonitorsList;
+    public Map<String, List<String>> getTerminatingInstancesMap() {
+        return terminatingInstancesMap;
     }
 
-    public void setTerminatingMonitorsList(List<String> terminatingMonitorsList) {
-        this.terminatingMonitorsList = terminatingMonitorsList;
+    public void setTerminatingInstancesMap(Map<String, List<String>> terminatingInstancesMap) {
+        this.terminatingInstancesMap = terminatingInstancesMap;
     }
 
     public AutoscaleAlgorithm getAutoscaleAlgorithm(String partitionAlgorithm) {