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/06 21:02:01 UTC

stratos git commit: fixing status calculation issue for groups and fixing restart of monitor hierarchy

Repository: stratos
Updated Branches:
  refs/heads/master bebed8056 -> 8d9632f89


fixing status calculation issue for groups and fixing restart of monitor hierarchy


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

Branch: refs/heads/master
Commit: 8d9632f894bff150db6e54684cea2fb90f1330fe
Parents: bebed80
Author: reka <rt...@gmail.com>
Authored: Sun Dec 7 01:31:44 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Sun Dec 7 01:31:44 2014 +0530

----------------------------------------------------------------------
 .../applications/topic/ApplicationBuilder.java  | 163 ++++++++++---------
 .../autoscaler/monitor/MonitorFactory.java      |  78 ++++-----
 .../monitor/component/GroupMonitor.java         |  35 +++-
 .../component/ParentComponentMonitor.java       |  21 ++-
 .../stratos/autoscaler/util/AutoscalerUtil.java |   8 +-
 .../domain/applications/ParentComponent.java    |  77 +++++----
 6 files changed, 207 insertions(+), 175 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/8d9632f8/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
index 63d8ab9..27457f4 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
@@ -20,10 +20,10 @@ package org.apache.stratos.autoscaler.applications.topic;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.autoscaler.context.AutoscalerContext;
 import org.apache.stratos.autoscaler.applications.ApplicationHolder;
 import org.apache.stratos.autoscaler.applications.pojo.ApplicationClusterContext;
 import org.apache.stratos.autoscaler.client.CloudControllerClient;
+import org.apache.stratos.autoscaler.context.AutoscalerContext;
 import org.apache.stratos.autoscaler.event.publisher.ClusterStatusEventPublisher;
 import org.apache.stratos.autoscaler.monitor.component.ApplicationMonitor;
 import org.apache.stratos.autoscaler.monitor.component.GroupMonitor;
@@ -82,35 +82,38 @@ public class ApplicationBuilder {
     }
 
     public static ApplicationInstance handleApplicationInstanceCreatedEvent(String appId, String instanceId,
-                                                             String networkPartitionId) {
+                                                                            String networkPartitionId) {
         if (log.isDebugEnabled()) {
             log.debug("Handling application activation event: [application-id] " + appId);
         }
-
-        Applications applications = ApplicationHolder.getApplications();
-        Application application = applications.getApplication(appId);
-        //update the status of the Group
-        if (application == null) {
-            log.warn(String.format("Application does not exist: [application-id] %s",
-                    appId));
-            return null;
-        }
-
-        ApplicationStatus status = ApplicationStatus.Created;
         ApplicationInstance applicationInstance = null;
+        //acquiring write lock to add the required instances
+        ApplicationHolder.acquireWriteLock();
+        try {
 
-        if (!application.containsInstanceContext(instanceId)) {
-            //setting the status, persist and publish
-            applicationInstance = new ApplicationInstance(appId, instanceId);
-            applicationInstance.setStatus(status);
-            applicationInstance.setNetworkPartitionId(networkPartitionId);
-            application.addInstance(instanceId, applicationInstance);
-            //updateApplicationMonitor(appId, status);
-            ApplicationHolder.persistApplication(application);
-            ApplicationsEventPublisher.sendApplicationInstanceCreatedEvent(appId, applicationInstance);
-        } else {
-            log.warn(String.format("Application Instance Context already exists" +
-                    " [appId] %s [ApplicationInstanceId] %s", appId, instanceId));
+            Applications applications = ApplicationHolder.getApplications();
+            Application application = applications.getApplication(appId);
+            //update the status of the Group
+            if (application == null) {
+                log.warn(String.format("Application does not exist: [application-id] %s",
+                        appId));
+                return null;
+            }
+
+            if (!application.containsInstanceContext(instanceId)) {
+                //setting the status, persist and publish
+                applicationInstance = new ApplicationInstance(appId, instanceId);
+                applicationInstance.setNetworkPartitionId(networkPartitionId);
+                application.addInstance(instanceId, applicationInstance);
+                //updateApplicationMonitor(appId, status);
+                ApplicationHolder.persistApplication(application);
+                ApplicationsEventPublisher.sendApplicationInstanceCreatedEvent(appId, applicationInstance);
+            } else {
+                log.warn(String.format("Application Instance Context already exists" +
+                        " [appId] %s [ApplicationInstanceId] %s", appId, instanceId));
+            }
+        } finally {
+            ApplicationHolder.releaseWriteLock();
         }
         return applicationInstance;
     }
@@ -139,7 +142,7 @@ public class ApplicationBuilder {
             ApplicationsEventPublisher.sendApplicationInstanceActivatedEvent(appId, instanceId);
         } else {
             log.warn(String.format("Application state transition is not valid: [application-id] %s " +
-                    " [instance-id] %s [current-status] %s [status-requested] %s",
+                            " [instance-id] %s [current-status] %s [status-requested] %s",
                     appId, instanceId, context.getStatus(), status));
         }
     }
@@ -161,7 +164,7 @@ public class ApplicationBuilder {
             } else {
                 org.apache.stratos.autoscaler.pojo.policy.deployment.DeploymentPolicy policy =
                         PolicyManager.getInstance().getDeploymentPolicyByApplication(appId);
-                if(policy != null) {
+                if (policy != null) {
                     log.warn(String.format("Application has been found in the ApplicationsTopology" +
                                     ": [application-id] %s, Please unDeploy the Application Policy.",
                             appId));
@@ -223,11 +226,11 @@ public class ApplicationBuilder {
                     if (service != null) {
                         Cluster cluster = service.getCluster(aClusterData.getClusterId());
                         if (cluster != null) {
-                            for(ClusterInstance instance : cluster.getInstanceIdToInstanceContextMap().values()) {
+                            for (ClusterInstance instance : cluster.getInstanceIdToInstanceContextMap().values()) {
                                 ClusterStatusEventPublisher.sendClusterTerminatingEvent(appId,
-                                                                    aClusterData.getServiceType(),
-                                                                    aClusterData.getClusterId(),
-                                                                    instance.getInstanceId());
+                                        aClusterData.getServiceType(),
+                                        aClusterData.getClusterId(),
+                                        instance.getInstanceId());
                             }
                         }
                     }
@@ -253,22 +256,25 @@ public class ApplicationBuilder {
         } else {
             Application application = applications.getApplication(appId);
             Set<ClusterDataHolder> clusterData = application.getClusterDataRecursively();
-
+            ApplicationInstance instance = application.getInstanceContexts(instanceId);
             ApplicationStatus status = ApplicationStatus.Terminated;
-            if (application.isStateTransitionValid(status, instanceId)) {
+            if (instance.isStateTransitionValid(status)) {
                 //setting the status, persist and publish
-                application.setStatus(status, instanceId);
+                instance.setStatus(status);
+                application.removeInstance(instanceId);
                 updateApplicationMonitor(appId, status, instanceId);
                 //removing the monitor
-                AutoscalerContext.getInstance().removeAppMonitor(appId);
-                //Removing the application from memory and registry
-                ApplicationHolder.removeApplication(appId);
-                log.info("Application is removed: [application-id] " + appId);
+                if(application.getInstanceContextCount() == 0) {
+                    AutoscalerContext.getInstance().removeAppMonitor(appId);
+                    //Removing the application from memory and registry
+                    ApplicationHolder.removeApplication(appId);
+                    log.info("Application is removed: [application-id] " + appId);
 
+                }
                 ApplicationsEventPublisher.sendApplicationInstanceTerminatedEvent(appId, clusterData);
             } else {
                 log.warn(String.format("Application state transition is not valid: [application-id] %s " +
-                        " [current-status] %s [status-requested] %s", appId,
+                                " [current-status] %s [status-requested] %s", appId,
                         application.getInstanceContexts(instanceId).getStatus(),
                         status));
             }
@@ -302,6 +308,7 @@ public class ApplicationBuilder {
         if (context != null) {
             if (context.isStateTransitionValid(status)) {
                 //setting the status, persist and publish
+                context.setStatus(status);
                 updateGroupMonitor(appId, groupId, status, instanceId);
                 ApplicationHolder.persistApplication(application);
                 ApplicationsEventPublisher.sendGroupInstanceTerminatedEvent(appId, groupId, instanceId);
@@ -345,6 +352,7 @@ public class ApplicationBuilder {
         if (context != null) {
             if (context.isStateTransitionValid(status)) {
                 //setting the status, persist and publish
+                context.setStatus(status);
                 updateGroupMonitor(appId, groupId, status, instanceId);
                 ApplicationHolder.persistApplication(application);
                 ApplicationsEventPublisher.sendGroupInstanceActivatedEvent(appId, groupId, instanceId);
@@ -399,46 +407,51 @@ public class ApplicationBuilder {
                                                                 String networkPartitionId,
                                                                 String instanceId,
                                                                 String partitionId) {
-        if (log.isDebugEnabled()) {
-            log.debug("Handling Group creation for the [group]: " + groupId +
-                    " in the [application] " + appId);
-        }
-
         GroupInstance instance = null;
-        Applications applications = ApplicationHolder.getApplications();
-        Application application = applications.getApplication(appId);
-        //update the status of the Group
-        if (application == null) {
-            log.warn(String.format("Application %s does not exist",
-                    appId));
-            return instance;
-        }
+        ApplicationHolder.acquireWriteLock();
+        try {
+            if (log.isDebugEnabled()) {
+                log.debug("Handling Group creation for the [group]: " + groupId +
+                        " in the [application] " + appId);
+            }
+            Applications applications = ApplicationHolder.getApplications();
+            Application application = applications.getApplication(appId);
+            //update the status of the Group
+            if (application == null) {
+                log.warn(String.format("Application %s does not exist",
+                        appId));
+                return instance;
+            }
 
-        Group group = application.getGroupRecursively(groupId);
-        if (group == null) {
-            log.warn(String.format("Group %s does not exist",
-                    groupId));
-            return instance;
-        }
+            Group group = application.getGroupRecursively(groupId);
+            if (group == null) {
+                log.warn(String.format("Group %s does not exist",
+                        groupId));
+                return instance;
+            }
 
-        GroupStatus status = GroupStatus.Created;
+            GroupStatus status = GroupStatus.Created;
 
-        if (!group.containsInstanceContext(instanceId)) {
-            //setting the status, persist and publish
-            instance = new GroupInstance(groupId, instanceId);
-            instance.setParentId(parentId);
-            instance.setPartitionId(partitionId);
-            instance.setNetworkPartitionId(networkPartitionId);
-            instance.setStatus(status);
-            group.addInstance(instanceId, instance);
-            //updateGroupMonitor(appId, groupId, status);
-            ApplicationHolder.persistApplication(application);
-            ApplicationsEventPublisher.sendGroupInstanceCreatedEvent(appId, groupId, instance);
-        } else {
-            log.warn("Group Instance Context already exists: [group-id] " + groupId +
-                    " [Group-Instance-Id] " + instanceId);
+            if (!group.containsInstanceContext(instanceId)) {
+                //setting the status, persist and publish
+                instance = new GroupInstance(groupId, instanceId);
+                instance.setParentId(parentId);
+                instance.setPartitionId(partitionId);
+                instance.setNetworkPartitionId(networkPartitionId);
+                instance.setStatus(status);
+                group.addInstance(instanceId, instance);
+                //updateGroupMonitor(appId, groupId, status);
+                ApplicationHolder.persistApplication(application);
+                ApplicationsEventPublisher.sendGroupInstanceCreatedEvent(appId, groupId, instance);
+            } else {
+                log.warn("Group Instance Context already exists: [group-id] " + groupId +
+                        " [Group-Instance-Id] " + instanceId);
+            }
+        } finally {
+            ApplicationHolder.releaseWriteLock();
         }
-        
+
+
         return instance;
     }
 
@@ -470,6 +483,7 @@ public class ApplicationBuilder {
         if (context != null) {
             if (context.isStateTransitionValid(status)) {
                 //setting the status, persist and publish
+                context.setStatus(status);
                 updateGroupMonitor(appId, groupId, status, instanceId);
                 ApplicationHolder.persistApplication(application);
                 ApplicationsEventPublisher.sendGroupInstanceInActivateEvent(appId, groupId, instanceId);
@@ -514,6 +528,7 @@ public class ApplicationBuilder {
             if (context != null) {
                 if (context.isStateTransitionValid(status)) {
                     //setting the status, persist and publish
+                    context.setStatus(status);
                     updateGroupMonitor(appId, groupId, status, instanceId);
                     ApplicationHolder.persistApplication(application);
                     ApplicationsEventPublisher.sendGroupInstanceTerminatingEvent(appId, groupId, instanceId);

http://git-wip-us.apache.org/repos/asf/stratos/blob/8d9632f8/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
index 643710d..a981eec 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
@@ -45,6 +45,7 @@ import org.apache.stratos.messaging.domain.instance.ClusterInstance;
 import org.apache.stratos.messaging.domain.instance.GroupInstance;
 import org.apache.stratos.messaging.domain.instance.Instance;
 import org.apache.stratos.messaging.domain.topology.Cluster;
+import org.apache.stratos.messaging.domain.topology.ClusterStatus;
 import org.apache.stratos.messaging.domain.topology.Service;
 import org.apache.stratos.messaging.domain.topology.Topology;
 import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
@@ -140,36 +141,24 @@ public class MonitorFactory {
 
         }
 
-        //acquiring write lock to add the group instances
-        ApplicationHolder.acquireWriteLock();
-        try {
-            Group group = ApplicationHolder.getApplications().
-                    getApplication(appId).getGroupRecursively(context.getId());
-            //Starting the minimum dependencies
-            initialStartup = groupMonitor.createInstanceAndStartDependencyAtStartup(group, instanceIds);
-        } finally {
-            ApplicationHolder.releaseWriteLock();
-        }
+        Group group = ApplicationHolder.getApplications().
+                getApplication(appId).getGroupRecursively(context.getId());
+        //Starting the minimum dependencies
+        initialStartup = groupMonitor.createInstanceAndStartDependencyAtStartup(group, instanceIds);
 
         /**
          * If not first app deployment, acquiring read lock to check current the status of the group,
          * when the stratos got to restarted
          */
-        if (!initialStartup) {
-            ApplicationHolder.acquireReadLock();
-            try {
-                Group group = ApplicationHolder.getApplications().
-                        getApplication(appId).getGroupRecursively(context.getId());
-                //Starting statusChecking to make it sync with the Topology in the restart of stratos.
-                for (GroupInstance instance : group.getInstanceIdToInstanceContextMap().values()) {
-                    ServiceReferenceHolder.getInstance().
-                            getGroupStatusProcessorChain().
-                            process(group.getUniqueIdentifier(), appId, instance.getInstanceId());
-                }
-            } finally {
-                ApplicationHolder.releaseReadLock();
+        /*if (!initialStartup) {
+            //Starting statusChecking to make it sync with the Topology in the restart of stratos.
+            for (GroupInstance instance : group.getInstanceIdToInstanceContextMap().values()) {
+                ServiceReferenceHolder.getInstance().
+                        getGroupStatusProcessorChain().
+                        process(group.getUniqueIdentifier(), appId, instance.getInstanceId());
             }
-        }
+
+        }*/
 
         return groupMonitor;
 
@@ -189,10 +178,11 @@ public class MonitorFactory {
             TopologyInConsistentException, PolicyValidationException {
         ApplicationMonitor applicationMonitor;
         boolean initialStartup = false;
+        Application application;
         //acquiring read lock to start the monitor
         ApplicationHolder.acquireReadLock();
         try {
-            Application application = ApplicationHolder.getApplications().getApplication(appId);
+            application = ApplicationHolder.getApplications().getApplication(appId);
             if (application != null) {
                 applicationMonitor = new ApplicationMonitor(application);
                 applicationMonitor.setHasStartupDependents(false);
@@ -207,32 +197,19 @@ public class MonitorFactory {
 
         }
 
-        //acquiring write lock to add the required instances
-        ApplicationHolder.acquireWriteLock();
-        try {
-            Application application = ApplicationHolder.getApplications().getApplication(appId);
-            initialStartup = applicationMonitor.startMinimumDependencies(application);
-        } finally {
-            ApplicationHolder.releaseWriteLock();
-        }
+        initialStartup = applicationMonitor.startMinimumDependencies(application);
 
-        //If not first app deployment, then calculate the current status of the app instance.
+        /*//If not first app deployment, then calculate the current status of the app instance.
         if (!initialStartup) {
-            ApplicationHolder.acquireReadLock();
-            try {
-                Application application = ApplicationHolder.getApplications().getApplication(appId);
-                for (ApplicationInstance instance :
-                        application.getInstanceIdToInstanceContextMap().values()) {
-                    //Starting statusChecking to make it sync with the Topology in the restart of stratos.
-                    ServiceReferenceHolder.getInstance().
-                            getGroupStatusProcessorChain().
-                            process(appId, appId, instance.getInstanceId());
+            for (ApplicationInstance instance :
+                    application.getInstanceIdToInstanceContextMap().values()) {
+                //Starting statusChecking to make it sync with the Topology in the restart of stratos.
+                ServiceReferenceHolder.getInstance().
+                        getGroupStatusProcessorChain().
+                        process(appId, appId, instance.getInstanceId());
 
-                }
-            } finally {
-                ApplicationHolder.releaseReadLock();
             }
-        }
+        }*/
 
         return applicationMonitor;
 
@@ -321,6 +298,13 @@ public class MonitorFactory {
                             if (clusterMonitor.getInstance(clusterInstance.getInstanceId()) == null) {
                                 clusterMonitor.addInstance(clusterInstance);
                             }
+                            //Checking the current status of the cluster instance
+                            boolean stateChanged = ServiceReferenceHolder.getInstance().getClusterStatusProcessorChain().
+                                    process("", clusterId, clusterInstance.getInstanceId());
+                            if(!stateChanged && clusterInstance.getStatus() != ClusterStatus.Created) {
+                                clusterMonitor.notifyParentMonitor(clusterInstance.getStatus(),
+                                        clusterInstance.getInstanceId());
+                            }
                         }
                     } else {
                         createClusterInstance(cluster.getServiceName(),

http://git-wip-us.apache.org/repos/asf/stratos/blob/8d9632f8/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 fb96bea..ec73fd1 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
@@ -46,6 +46,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.instance.GroupInstance;
 import org.apache.stratos.messaging.domain.instance.Instance;
 import org.apache.stratos.messaging.domain.topology.ClusterStatus;
@@ -124,7 +125,6 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
      * @param status status of the group
      */
     public void setStatus(GroupStatus status, String instanceId) {
-        ((GroupInstance) this.instanceIdToInstanceMap.get(instanceId)).setStatus(status);
 
         if (status == GroupStatus.Inactive && !this.hasStartupDependents) {
             log.info("[Group] " + this.id + "is not notifying the parent, " +
@@ -171,6 +171,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
         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);
 
@@ -325,20 +326,24 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
                 getDeploymentPolicyByApplication(appId).
                 getChildPolicy(groupId);
 
-
+        String networkPartitionId = parentInstanceContext.getNetworkPartitionId();
         if (this.networkPartitionCtxts.containsKey(parentInstanceContext)) {
             groupLevelNetworkPartitionContext = this.networkPartitionCtxts.
-                    get(parentInstanceContext.getNetworkPartitionId());
+                    get(networkPartitionId);
         } else {
             if (policy != null) {
                 ChildLevelNetworkPartition networkPartition = policy.
                         getChildLevelNetworkPartition(parentInstanceContext.getNetworkPartitionId());
                 groupLevelNetworkPartitionContext = new GroupLevelNetworkPartitionContext(
-                        parentInstanceContext.getNetworkPartitionId(),
+                        networkPartitionId,
                         networkPartition.getPartitionAlgo());
             } else {
                 groupLevelNetworkPartitionContext = new GroupLevelNetworkPartitionContext(
-                        parentInstanceContext.getNetworkPartitionId());
+                        networkPartitionId);
+            }
+            if(log.isInfoEnabled()) {
+                log.info("[Network partition] " + networkPartitionId + "has been added for the " +
+                        "[Group] " + this.id);
             }
             this.addNetworkPartitionContext(groupLevelNetworkPartitionContext);
         }
@@ -372,6 +377,10 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
                     networkPartitionContext.getPartitionCtxt(parentPartitionId) != null) {
                 partitionContext = new GroupLevelPartitionContext(0);
                 networkPartitionContext.addPartitionContext((GroupLevelPartitionContext) partitionContext);
+                if(log.isInfoEnabled()) {
+                    log.info("[Partition] " + parentPartitionId + "has been added for the " +
+                            "[Group] " + this.id);
+                }
             }
         } else {
             ChildLevelNetworkPartition networkPartition = policy.
@@ -387,6 +396,10 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
                     childPartitionContexts.add((GroupLevelPartitionContext) partitionContext);
                     networkPartitionContext.addPartitionContext(
                             (GroupLevelPartitionContext) partitionContext);
+                    if(log.isInfoEnabled()) {
+                        log.info("[Partition] " + childLevelPartition.getPartitionId() +
+                                "has been added for the [Group] " + this.id);
+                    }
                 }
             }
         }
@@ -422,6 +435,11 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
         groupInstanceContext.addPartitionContext((GroupLevelPartitionContext) partitionContext);
         groupLevelNetworkPartitionContext.addInstanceContext(groupInstanceContext);
 
+        if(log.isInfoEnabled()) {
+            log.info("Group [Instance context] " + instanceId +
+                    " has been added to [Group] " + this.id);
+        }
+
         if (partitionContext != null) {
             ((GroupLevelPartitionContext) partitionContext).addActiveInstance(groupInstance);
         }
@@ -465,11 +483,11 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
             for(Instance instance : existingGroupInstances) {
                 initialStartup = false;
                 partitionContext = groupLevelNetworkPartitionContext.
-                        getPartitionContextById(parentPartitionId);
+                        getPartitionContextById(instance.getPartitionId());
                 groupInstanceId = createGroupInstanceAndAddToMonitor(group, parentInstanceContext,
                         partitionContext,
                         groupLevelNetworkPartitionContext,
-                        null);
+                        (GroupInstance) instance);
                 instanceIdsToStart.add(groupInstanceId);
             }
 
@@ -502,6 +520,9 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
             }
 
         }
+        if(log.isInfoEnabled()) {
+            log.info("Starting the dependencies for the [Group] " + group.getUniqueIdentifier());
+        }
         startDependency(group, instanceIdsToStart);
         return initialStartup;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/8d9632f8/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 a0710ac..721f291 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
@@ -42,8 +42,10 @@ import org.apache.stratos.autoscaler.monitor.MonitorFactory;
 import org.apache.stratos.autoscaler.monitor.cluster.AbstractClusterMonitor;
 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;
@@ -266,6 +268,7 @@ public abstract class ParentComponentMonitor extends Monitor {
                 startDep = startDependencyByInstanceCreation(eventId, instanceId);
             }
 
+            //Checking whether all the monitors got created
             if (!startDep) {
                 ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().
                         process(this.id, this.appId, instanceId);
@@ -276,7 +279,6 @@ public abstract class ParentComponentMonitor extends Monitor {
             //TODO revert the siblings and notify parent, change a flag for reverting/un-subscription
             log.error(e);
         }
-
     }
 
     /**
@@ -603,16 +605,16 @@ public abstract class ParentComponentMonitor extends Monitor {
         public void run() {
             Monitor monitor = null;
             int retries = 5;
-            boolean success;
-            do {
-                //TODO remove thread.sleep, exectutor service
+            boolean success = false;
+            while (!success && retries != 0) {
+                /*//TODO remove thread.sleep, exectutor service
                 try {
                     Thread.sleep(5000);
                 } catch (InterruptedException e1) {
-                }
+                }*/
 
-                if (log.isDebugEnabled()) {
-                    log.debug("Monitor is going to be started for [group/cluster] "
+                if (log.isInfoEnabled()) {
+                    log.info("Monitor is going to be started for [group/cluster] "
                             + context.getId());
                 }
                 try {
@@ -633,12 +635,9 @@ public abstract class ParentComponentMonitor extends Monitor {
                     String msg = "Monitor creation failed for: " + context.getId();
                     log.warn(msg, e);
                     retries--;
-
                 }
                 success = true;
-
-            } while (!success && retries != 0);
-
+            }
 
             if (monitor == null) {
                 String msg = "Monitor creation failed, even after retrying for 5 times, "

http://git-wip-us.apache.org/repos/asf/stratos/blob/8d9632f8/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
index 7e2ac38..8bea86e 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
@@ -378,11 +378,11 @@ public class AutoscalerUtil {
             ApplicationMonitor applicationMonitor = null;
             int retries = 5;
             boolean success = false;
-            do {
-                try {
+            while (!success && retries != 0) {
+                /*try {
                     Thread.sleep(5000);
                 } catch (InterruptedException e1) {
-                }
+                }*/
                 try {
                     long start = System.currentTimeMillis();
                     log.info("application monitor is going to be started for [application] " +
@@ -406,7 +406,7 @@ public class AutoscalerUtil {
                     log.warn(msg, e);
                     retries--;
                 }
-            } while (!success && retries != 0);
+            }
 
             if (applicationMonitor == null) {
                 String msg = "Application monitor creation failed, even after retrying for 5 times, "

http://git-wip-us.apache.org/repos/asf/stratos/blob/8d9632f8/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java
index 8b8b879..4dd6b34 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ParentComponent.java
@@ -31,14 +31,14 @@ import java.util.*;
 
 public abstract class ParentComponent<T extends Instance> implements Serializable {
 
-    // Dependency Order
-    private DependencyOrder dependencyOrder;
     // Group Map, key = Group.alias
     protected final Map<String, Group> aliasToGroupMap;
     // Cluster Id map, key = subscription alias for the cartridge type
     protected final Map<String, ClusterDataHolder> aliasToClusterDataMap;
     // Group/Cluster Instance Context map, key = instance id
     protected Map<String, T> instanceIdToInstanceContextMap;
+    // Dependency Order
+    private DependencyOrder dependencyOrder;
     // flag for Group level scaling
     private boolean isGroupScalingEnabled;
     //flag for group instance level monitoring
@@ -46,7 +46,7 @@ public abstract class ParentComponent<T extends Instance> implements Serializabl
     //deployment policy
     private String deploymentPolicy;
 
-    public ParentComponent () {
+    public ParentComponent() {
         this.isGroupScalingEnabled = false;
         this.isGroupInstanceMonitoringEnabled = false;
         aliasToGroupMap = new HashMap<String, Group>();
@@ -60,7 +60,7 @@ public abstract class ParentComponent<T extends Instance> implements Serializabl
      *
      * @return unique identifier String
      */
-    public abstract String getUniqueIdentifier ();
+    public abstract String getUniqueIdentifier();
 
     /**
      * Adds a group
@@ -72,15 +72,6 @@ public abstract class ParentComponent<T extends Instance> implements Serializabl
     }
 
     /**
-     * Setter for Group alias to Group map
-     *
-     * @param groupAliasToGroup Map, key = alias given to the Group, value = Group
-     */
-    public void setGroups(Map<String, Group> groupAliasToGroup) {
-        aliasToGroupMap.putAll(groupAliasToGroup);
-    }
-
-    /**
      * Get the Group for the given alias in the context of the parent entity.
      * Will not search recursively in the nested levels.
      *
@@ -103,7 +94,7 @@ public abstract class ParentComponent<T extends Instance> implements Serializabl
         return travereAndCheckRecursively(aliasToGroupMap, groupAlias);
     }
 
-    private Group travereAndCheckRecursively (Map<String,Group> aliasToGroupMap, String groupAlias) {
+    private Group travereAndCheckRecursively(Map<String, Group> aliasToGroupMap, String groupAlias) {
 
         if (aliasToGroupMap.containsKey(groupAlias)) {
             synchronized (aliasToGroupMap) {
@@ -121,10 +112,10 @@ public abstract class ParentComponent<T extends Instance> implements Serializabl
     }
 
     public ClusterDataHolder getClusterDataHolderRecursivelyByAlias(String alias) {
-        if(this.aliasToClusterDataMap.containsKey(alias)) {
+        if (this.aliasToClusterDataMap.containsKey(alias)) {
             return this.aliasToClusterDataMap.get(alias);
         } else {
-            if(this.aliasToGroupMap != null && !this.aliasToGroupMap.isEmpty()) {
+            if (this.aliasToGroupMap != null && !this.aliasToGroupMap.isEmpty()) {
                 return getClusterDataByAlias(alias, this.aliasToGroupMap.values());
             }
         }
@@ -160,12 +151,12 @@ public abstract class ParentComponent<T extends Instance> implements Serializabl
     }
 
     /**
-     * Setter for Dependency Order
+     * Setter for Group alias to Group map
      *
-     * @param dependencyOrder Dependency Order object
+     * @param groupAliasToGroup Map, key = alias given to the Group, value = Group
      */
-    public void setDependencyOrder(DependencyOrder dependencyOrder) {
-        this.dependencyOrder = dependencyOrder;
+    public void setGroups(Map<String, Group> groupAliasToGroup) {
+        aliasToGroupMap.putAll(groupAliasToGroup);
     }
 
     /**
@@ -178,6 +169,15 @@ public abstract class ParentComponent<T extends Instance> implements Serializabl
     }
 
     /**
+     * Setter for Dependency Order
+     *
+     * @param dependencyOrder Dependency Order object
+     */
+    public void setDependencyOrder(DependencyOrder dependencyOrder) {
+        this.dependencyOrder = dependencyOrder;
+    }
+
+    /**
      * Setter for alias to Cluster Data map
      *
      * @param aliasToClusterData Map, key = alias given to the cluster, value =  ClusterData object
@@ -203,7 +203,7 @@ public abstract class ParentComponent<T extends Instance> implements Serializabl
      *
      * @return Set of ClusterDataHolder objects if available, else null
      */
-    public Set<ClusterDataHolder> getClusterDataRecursively () {
+    public Set<ClusterDataHolder> getClusterDataRecursively() {
 
         Set<ClusterDataHolder> appClusterData = new HashSet<ClusterDataHolder>();
 
@@ -224,18 +224,27 @@ public abstract class ParentComponent<T extends Instance> implements Serializabl
      * Adds InstanceContext of a child to the instanceIdToInstanceContextMap.
      *
      * @param instanceId instance id of child
-     * @param instance InstanceContext object
+     * @param instance   InstanceContext object
      */
     public void addInstance(String instanceId, T instance) {
         instanceIdToInstanceContextMap.put(instanceId, instance);
     }
 
     /**
+     * This will remove the instance from instanceIdToInstanceContextMap
+     *
+     * @param instanceId instance id of child
+     */
+    public void removeInstance(String instanceId) {
+        instanceIdToInstanceContextMap.remove(instanceId);
+    }
+
+    /**
      * Adds InstanceContext of a child to the instanceIdToInstanceContextMap.
      *
      * @param instanceId instance id of child
      */
-    public boolean containsInstanceContext (String instanceId) {
+    public boolean containsInstanceContext(String instanceId) {
         return getInstanceIdToInstanceContextMap().containsKey(instanceId);
     }
 
@@ -246,7 +255,7 @@ public abstract class ParentComponent<T extends Instance> implements Serializabl
      * @param instanceId instance id
      * @return InstanceContext obj. if exists, else null
      */
-    public T getInstanceContexts (String instanceId) {
+    public T getInstanceContexts(String instanceId) {
         // if map is empty, return null
         if (getInstanceIdToInstanceContextMap().isEmpty()) {
             return null;
@@ -266,7 +275,7 @@ public abstract class ParentComponent<T extends Instance> implements Serializabl
      * @param parentInstanceId parent instance id
      * @return InstanceContext obj. if exists, else null
      */
-    public List<Instance> getInstanceContextsWithParentId (String parentInstanceId) {
+    public List<Instance> getInstanceContextsWithParentId(String parentInstanceId) {
         // if map is empty, return null
         List<Instance> contexts = new ArrayList<Instance>();
 
@@ -275,9 +284,9 @@ public abstract class ParentComponent<T extends Instance> implements Serializabl
         }
 
         // if instanceId is null, just get the first InstanceContext
-        if (parentInstanceId == null) {
-            for(Instance context : instanceIdToInstanceContextMap.values()) {
-                if(parentInstanceId.equals(context.getParentId())) {
+        if (parentInstanceId != null) {
+            for (Instance context : instanceIdToInstanceContextMap.values()) {
+                if (parentInstanceId.equals(context.getParentId())) {
                     contexts.add(context);
                 }
             }
@@ -291,12 +300,16 @@ public abstract class ParentComponent<T extends Instance> implements Serializabl
      *
      * @return number of instance contexts
      */
-    public int getInstanceContextCount () {
+    public int getInstanceContextCount() {
 
         return getInstanceIdToInstanceContextMap().keySet().size();
     }
 
-    protected void getClusterData (Set<ClusterDataHolder> clusterData, Collection<Group> groups) {
+    public int getComponentsCount() {
+        return getClusterDataMap().keySet().size() + getAliasToGroupMap().keySet().size();
+    }
+
+    protected void getClusterData(Set<ClusterDataHolder> clusterData, Collection<Group> groups) {
 
         for (Group group : groups) {
             if (group.getClusterDataMap() != null && !group.getClusterDataMap().isEmpty()) {
@@ -308,11 +321,11 @@ public abstract class ParentComponent<T extends Instance> implements Serializabl
         }
     }
 
-    private ClusterDataHolder getClusterDataByAlias (String alias, Collection<Group> groups) {
+    private ClusterDataHolder getClusterDataByAlias(String alias, Collection<Group> groups) {
 
         for (Group group : groups) {
             if (group.getClusterDataMap() != null && !group.getClusterDataMap().isEmpty()) {
-                if(group.getClusterData(alias) != null) {
+                if (group.getClusterData(alias) != null) {
                     return group.getClusterData(alias);
                 }
             } else {