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

[3/3] stratos git commit: fixing onactive action based on instances

fixing onactive action based on instances


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

Branch: refs/heads/master
Commit: a8ed191f91b198319cd2baa90f3e8919ce52607c
Parents: ea72151
Author: reka <rt...@gmail.com>
Authored: Tue Dec 2 22:01:39 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Tue Dec 2 23:28:17 2014 +0530

----------------------------------------------------------------------
 .../context/cluster/AbstractClusterContext.java | 22 +++++++
 .../context/cluster/VMClusterContext.java       |  1 +
 .../monitor/cluster/AbstractClusterMonitor.java |  7 ++-
 .../monitor/component/ApplicationMonitor.java   | 38 +++++++++++--
 .../monitor/component/GroupMonitor.java         | 60 ++++++++++++++------
 .../component/ParentComponentMonitor.java       | 41 +++++++++----
 6 files changed, 135 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/a8ed191f/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/AbstractClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/AbstractClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/AbstractClusterContext.java
index a2e0472..69f87a2 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/AbstractClusterContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/AbstractClusterContext.java
@@ -23,8 +23,11 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.cloud.controller.stub.domain.MemberContext;
 import org.apache.stratos.common.constants.StratosConstants;
+import org.apache.stratos.messaging.domain.instance.ClusterInstance;
 
 import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
 
 /*
  * It holds the runtime data of a service cluster
@@ -37,13 +40,32 @@ public class AbstractClusterContext implements Serializable {
     // cluster id
     protected String clusterId;
     private String serviceId;
+    protected Map<String, ClusterInstance> clusterInstanceMap;
+
 
     public AbstractClusterContext(String clusterId, String serviceId){
         this.clusterId = clusterId;
         this.serviceId = serviceId;
+        clusterInstanceMap = new HashMap<String, ClusterInstance>();
     }
 
     public String getServiceId() {
         return serviceId;
     }
+
+    public Map<String, ClusterInstance> getClusterInstanceMap() {
+        return clusterInstanceMap;
+    }
+
+    public void setClusterInstanceMap(Map<String, ClusterInstance> clusterInstanceMap) {
+        this.clusterInstanceMap = clusterInstanceMap;
+    }
+
+    public void addClusterInstance(ClusterInstance instance) {
+        this.clusterInstanceMap.put(instance.getInstanceId(), instance);
+    }
+
+    public ClusterInstance getClusterInstance(String instanceId) {
+        return this.clusterInstanceMap.get(instanceId);
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/a8ed191f/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
index 3de6306..065902e 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
@@ -54,6 +54,7 @@ public class VMClusterContext extends AbstractClusterContext {
 
     // Map<NetworkpartitionId, Network Partition Context>
     protected Map<String, ClusterLevelNetworkPartitionContext> networkPartitionCtxts;
+
     protected DeploymentPolicy deploymentPolicy;
     protected AutoscalePolicy autoscalePolicy;
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/a8ed191f/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/AbstractClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/AbstractClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/AbstractClusterMonitor.java
index 756079e..3afda6f 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/AbstractClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/AbstractClusterMonitor.java
@@ -34,6 +34,7 @@ import org.apache.stratos.messaging.domain.applications.Application;
 import org.apache.stratos.messaging.domain.applications.ApplicationStatus;
 import org.apache.stratos.messaging.domain.applications.Group;
 import org.apache.stratos.messaging.domain.applications.GroupStatus;
+import org.apache.stratos.messaging.domain.instance.ClusterInstance;
 import org.apache.stratos.messaging.domain.topology.ClusterStatus;
 import org.apache.stratos.messaging.event.health.stat.*;
 import org.apache.stratos.messaging.event.topology.*;
@@ -212,7 +213,9 @@ public abstract class AbstractClusterMonitor extends Monitor implements Runnable
         return status;
     }
 
-    public void setStatus(ClusterStatus status) {
+    public void setStatus(ClusterStatus status, String instanceId) {
+
+        this.clusterContext.getClusterInstance(instanceId).setStatus(status);
         /**
          * notifying the parent monitor about the state change
          * If the cluster in_active and if it is a in_dependent cluster,
@@ -415,4 +418,6 @@ public abstract class AbstractClusterMonitor extends Monitor implements Runnable
     public void setClusterContext(AbstractClusterContext clusterContext) {
         this.clusterContext = clusterContext;
     }
+
+
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/a8ed191f/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 0e5f751..990d482 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
@@ -39,6 +39,7 @@ import org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network.Ap
 import org.apache.stratos.messaging.domain.applications.Application;
 import org.apache.stratos.messaging.domain.applications.ApplicationStatus;
 import org.apache.stratos.messaging.domain.applications.GroupStatus;
+import org.apache.stratos.messaging.domain.instance.ApplicationInstance;
 import org.apache.stratos.messaging.domain.topology.ClusterStatus;
 import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState;
 
@@ -52,6 +53,9 @@ public class ApplicationMonitor extends ParentComponentMonitor {
 
     //network partition contexts
     private Map<String, ApplicationLevelNetworkPartitionContext> networkPartitionCtxts;
+    //application instance id map
+    private Map<String, ApplicationInstance> applicationInstanceIdMap;
+
 
     public ApplicationMonitor(Application application) throws DependencyBuilderException,
             TopologyInConsistentException {
@@ -59,10 +63,7 @@ public class ApplicationMonitor extends ParentComponentMonitor {
         //setting the appId for the application
         this.appId = application.getUniqueIdentifier();
         networkPartitionCtxts = new HashMap<String, ApplicationLevelNetworkPartitionContext>();
-
-        //starting the first set of dependencies from its children
-        //TODO startMinimumDependencies(application);
-
+        setApplicationInstanceIdMap(new HashMap<String, ApplicationInstance>());
     }
 
     /**
@@ -72,7 +73,6 @@ public class ApplicationMonitor extends ParentComponentMonitor {
      * @return the found GroupMonitor
      */
     public Monitor findGroupMonitorWithId(String groupId) {
-        Monitor monitor;
         //searching within active monitors
         return findGroupMonitor(groupId, aliasToActiveMonitorsMap.values());
     }
@@ -107,6 +107,8 @@ public class ApplicationMonitor extends ParentComponentMonitor {
      * @param status the status
      */
     public void setStatus(ApplicationStatus status, String instanceId) {
+        this.applicationInstanceIdMap.get(instanceId).setStatus(status);
+
         //notify the children about the state change
         try {
             MonitorStatusEventBuilder.notifyChildren(this, new ApplicationStatusEvent(status, appId, instanceId));
@@ -216,6 +218,10 @@ public class ApplicationMonitor extends ParentComponentMonitor {
                     ApplicationInstanceContext instanceContext = new ApplicationInstanceContext(instanceId);
                     context.addInstanceContext(instanceContext);
 
+                    ApplicationInstance instance = new ApplicationInstance(appId, instanceId);
+                    instance.setStatus(ApplicationStatus.Created);
+                    this.applicationInstanceIdMap.put(instanceId, instance);
+
                     this.networkPartitionCtxts.put(context.getId(), context);
 
                     instanceIds.add(instanceId);
@@ -257,6 +263,11 @@ public class ApplicationMonitor extends ParentComponentMonitor {
                         ApplicationInstanceContext instanceContext = new ApplicationInstanceContext(instanceId);
                         context.addInstanceContext(instanceContext);
                         this.networkPartitionCtxts.put(context.getId(), context);
+
+                        ApplicationInstance instance = new ApplicationInstance(appId, instanceId);
+                        instance.setStatus(ApplicationStatus.Created);
+                        this.applicationInstanceIdMap.put(instanceId, instance);
+
                         burstNPFound = true;
                     }
                 }
@@ -306,4 +317,21 @@ public class ApplicationMonitor extends ParentComponentMonitor {
     public void addApplicationLevelNetworkPartitionContext(ApplicationLevelNetworkPartitionContext applicationLevelNetworkPartitionContext) {
         this.networkPartitionCtxts.put(applicationLevelNetworkPartitionContext.getId(), applicationLevelNetworkPartitionContext);
     }
+
+    public Map<String, ApplicationInstance> getApplicationInstanceIdMap() {
+        return applicationInstanceIdMap;
+    }
+
+    public void setApplicationInstanceIdMap(Map<String, ApplicationInstance> applicationInstanceIdMap) {
+        this.applicationInstanceIdMap = applicationInstanceIdMap;
+    }
+
+    public void addApplicationInstance(ApplicationInstance instance) {
+        this.applicationInstanceIdMap.put(instance.getInstanceId(), instance);
+
+    }
+
+    public ApplicationInstance getApplicationInstance(String instanceId) {
+        return this.applicationInstanceIdMap.get(instanceId);
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/a8ed191f/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 9ec04d7..b2b6697 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
@@ -40,10 +40,12 @@ import org.apache.stratos.autoscaler.pojo.policy.PolicyManager;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.ChildPolicy;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.DeploymentPolicy;
 import org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network.ChildLevelNetworkPartition;
+import org.apache.stratos.autoscaler.util.ServiceReferenceHolder;
 import org.apache.stratos.messaging.domain.applications.Application;
 import org.apache.stratos.messaging.domain.applications.ApplicationStatus;
 import org.apache.stratos.messaging.domain.applications.Group;
 import org.apache.stratos.messaging.domain.applications.GroupStatus;
+import org.apache.stratos.messaging.domain.instance.ApplicationInstance;
 import org.apache.stratos.messaging.domain.instance.GroupInstance;
 import org.apache.stratos.messaging.domain.instance.Instance;
 import org.apache.stratos.messaging.domain.topology.ClusterStatus;
@@ -71,6 +73,8 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
     //network partition contexts
     private Map<String, GroupLevelNetworkPartitionContext> networkPartitionCtxts;
 
+    private Map<String, GroupInstance> groupInstanceIdMap;
+
     private boolean isDestroyed;
 
     /**
@@ -85,9 +89,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
         super(group);
         this.appId = appId;
         networkPartitionCtxts = new HashMap<String, GroupLevelNetworkPartitionContext>();
-
-        //starting the minimum start able dependencies
-        //startMinimumDependencies(group, parentInstanceId);
+        setGroupInstanceIdMap(new HashMap<String, GroupInstance>());
     }
 
     @Override
@@ -131,6 +133,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
      * @param status status of the group
      */
     public void setStatus(GroupStatus status, String instanceId) {
+        this.groupInstanceIdMap.get(instanceId).setStatus(status);
 
         if (status == GroupStatus.Inactive && !this.hasStartupDependents) {
             log.info("[Group] " + this.id + "is not notifying the parent, " +
@@ -192,14 +195,6 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
                     AutoscalerContext.getInstance().removeClusterMonitor(id);
                 }
             }
-            //If cluster monitor, need to terminate the existing one
-            //TODO block
-            /*if (this.status == GroupStatus.Terminating) {
-                StatusChecker.getInstance().onChildStatusChange(id, this.id, this.appId);
-            } else {
-                onChildTerminatedEvent(id);
-            }*/
-
         } else if (status1 == ClusterStatus.Terminating || status1 == GroupStatus.Terminating) {
             //mark the child monitor as inActive in the map
             this.markMonitorAsTerminating(id);
@@ -212,11 +207,24 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
             } else {
                 log.warn("[monitor] " + id + " cannot be found in the inActive monitors list");
             }
-            //TODO block
-            /*if (this.status == GroupStatus.Terminating || this.status == GroupStatus.Terminated) {
-                StatusChecker.getInstance().onChildStatusChange(id, this.id, this.appId);
-                log.info("Executing the un-subscription request for the [monitor] " + id);
-            }*/
+            //If cluster monitor, need to terminate the existing one
+            ApplicationHolder.releaseReadLock();
+            GroupStatus instanceStatus;
+            try {
+                Group group = ApplicationHolder.getApplications().
+                        getApplication(appId).getGroupRecursively(this.id);
+                instanceStatus = group.getInstanceContexts(instanceId).getStatus();
+
+            } finally {
+                ApplicationHolder.releaseReadLock();
+            }
+
+            if (instanceStatus == GroupStatus.Terminating) {
+                ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(this.id,
+                        appId, instanceId);
+            } else {
+                onChildTerminatedEvent(id, instanceId);
+            }
         }
     }
 
@@ -258,7 +266,8 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
 
         //Notifying children, if this group has scaling dependencies
         if (currentChildContextInScalingTree.isGroupScalingEnabled()) {
-            for (ApplicationChildContext applicationChildContext : currentChildContextInScalingTree.getApplicationChildContextList()) {
+            for (ApplicationChildContext applicationChildContext :
+                    currentChildContextInScalingTree.getApplicationChildContextList()) {
 
                 //Get group monitor so that it can notify it's children
                 Monitor monitor = aliasToActiveMonitorsMap.get(applicationChildContext.getId());
@@ -480,4 +489,21 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
     public void setDestroyed(boolean isDestroyed) {
         this.isDestroyed = isDestroyed;
     }
+
+    public Map<String, GroupInstance> getGroupInstanceIdMap() {
+        return groupInstanceIdMap;
+    }
+
+    public void setGroupInstanceIdMap(Map<String, GroupInstance> groupInstanceIdMap) {
+        this.groupInstanceIdMap = groupInstanceIdMap;
+    }
+
+    public void addGroupInstance(GroupInstance instance) {
+        this.groupInstanceIdMap.put(instance.getInstanceId(), instance);
+
+    }
+
+    public GroupInstance getGroupInstance(String instanceId) {
+        return this.groupInstanceIdMap.get(instanceId);
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/a8ed191f/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 56e2a63..f48461f 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
@@ -63,9 +63,9 @@ public abstract class ParentComponentMonitor extends Monitor {
     protected DependencyTree scalingDependencyTree;
     //monitors map, key=GroupAlias/clusterId and value=GroupMonitor/AbstractClusterMonitor
     protected Map<String, Monitor> aliasToActiveMonitorsMap;
-    //monitors map, stopped monitors
+    //instanceIds map, stopped monitors
     protected List<String> inactiveMonitorsList;
-    //terminating monitors list
+    //terminating instances list
     protected List<String> terminatingMonitorsList;
 
     public ParentComponentMonitor(ParentComponent component) throws DependencyBuilderException {
@@ -109,6 +109,18 @@ public abstract class ParentComponentMonitor extends Monitor {
      * This will start the parallel dependencies at once from the top level.
      * it will get invoked when the monitor starts up only.
      */
+    public boolean startDependencyByInstanceCreation(String childId, String instanceId) throws
+            ParentMonitorNotFoundException {
+        //start the first dependency
+        List<ApplicationChildContext> applicationContexts =
+                this.startupDependencyTree.getStarAbleDependencies(childId);
+        return startDependency(applicationContexts, instanceId);
+    }
+
+    /**
+     * This will start the parallel dependencies at once from the top level.
+     * it will get invoked when the monitor starts up only.
+     */
     public void startDependency(ParentComponent component) {
         //start the first dependency
         List<ApplicationChildContext> applicationContexts = this.startupDependencyTree.
@@ -132,7 +144,8 @@ public abstract class ParentComponentMonitor extends Monitor {
                 .getStarAbleDependencies(id);
         List<String> instanceIds = new ArrayList<String>();
         instanceIds.add(instanceId);
-        return startDependency(applicationContexts, instanceIds);
+        boolean startup = startDependency(applicationContexts, instanceIds);
+        return startup;
     }
 
     public boolean startAllChildrenDependency(ParentComponent component, String instanceId)
@@ -242,8 +255,13 @@ public abstract class ParentComponentMonitor extends Monitor {
             if (this.terminatingMonitorsList.contains(eventId)) {
                 this.terminatingMonitorsList.remove(eventId);
             }
+            boolean startDep;
+            if(!aliasToActiveMonitorsMap.containsKey(eventId)) {
+               startDep = startDependency(eventId, instanceId);
+            } else {
+                startDep = startDependencyByInstanceCreation(eventId, instanceId);
+            }
 
-            boolean startDep = startDependency(eventId, instanceId);
             if (log.isDebugEnabled()) {
                 log.debug("started a child: " + startDep + " by the group/cluster: " + eventId);
 
@@ -351,8 +369,8 @@ public abstract class ParentComponentMonitor extends Monitor {
         boolean allParentsActive = false;
         //make sure all the parent contexts got terminated or whether all of them are active
         if (parentContexts != null) {
-            parentsTerminated = allParentTerminated(parentContexts);
-            allParentsActive = allParentActive(parentContexts);
+            parentsTerminated = allParentTerminated(parentContexts, instanceId);
+            allParentsActive = allParentActive(parentContexts, instanceId);
         }
 
         if ((terminationList.isEmpty() || allDependentTerminated) &&
@@ -391,7 +409,8 @@ public abstract class ParentComponentMonitor extends Monitor {
     }
 
 
-    private boolean allParentTerminated(List<ApplicationChildContext> parentContexts) {
+    private boolean allParentTerminated(List<ApplicationChildContext> parentContexts,
+                                        String instanceId) {
         boolean parentsTerminated = false;
         for (ApplicationChildContext context1 : parentContexts) {
             if (this.inactiveMonitorsList.contains(context1.getId())) {
@@ -413,11 +432,11 @@ public abstract class ParentComponentMonitor extends Monitor {
         return parentsTerminated;
     }
 
-    private boolean allParentActive(List<ApplicationChildContext> parentContexts) {
+    private boolean allParentActive(List<ApplicationChildContext> parentContexts, String instanceId) {
         boolean parentsActive = false;
         for (ApplicationChildContext context1 : parentContexts) {
-            if (this.inactiveMonitorsList.contains(context1.getId()) ||
-                    this.terminatingMonitorsList.contains(context1.getId())) {
+            if (this.inactiveMonitorsList.contains(instanceId) ||
+                    this.terminatingMonitorsList.contains(instanceId)) {
                 parentsActive = false;
                 log.info("Dependent [Monitor] " + context1.getId()
                         + " is not yet active");
@@ -632,4 +651,4 @@ public abstract class ParentComponentMonitor extends Monitor {
     }
 
 
-}
\ No newline at end of file
+}