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 2015/05/11 10:29:21 UTC

[2/4] stratos git commit: fixing app bursting issue and code refactoring

fixing app bursting issue and code refactoring


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

Branch: refs/heads/master
Commit: 015e89b7d4c41257aa4d175ad58a1e04eb67910b
Parents: e0ccfe6
Author: reka <rt...@gmail.com>
Authored: Thu May 7 17:08:07 2015 +0530
Committer: reka <rt...@gmail.com>
Committed: Mon May 11 13:58:44 2015 +0530

----------------------------------------------------------------------
 .../applications/topic/ApplicationBuilder.java  | 89 +++++++++++++++-----
 .../topic/ApplicationsEventPublisher.java       | 33 +++++---
 .../context/cluster/AbstractClusterContext.java |  3 +-
 .../monitor/component/ApplicationMonitor.java   |  9 +-
 .../component/ParentComponentMonitor.java       |  2 +-
 .../status/processor/StatusProcessor.java       |  2 +-
 .../cluster/ClusterStatusActiveProcessor.java   |  2 +-
 .../cluster/ClusterStatusInactiveProcessor.java |  8 +-
 .../ClusterStatusTerminatedProcessor.java       | 10 +--
 .../group/GroupStatusActiveProcessor.java       | 25 +++---
 .../group/GroupStatusInactiveProcessor.java     | 69 +++++++--------
 .../processor/group/GroupStatusProcessor.java   | 16 ++--
 .../group/GroupStatusTerminatedProcessor.java   | 14 +--
 .../group/GroupStatusTerminatingProcessor.java  | 16 ++--
 14 files changed, 171 insertions(+), 127 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/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 60de3dd..b5da7a7 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
@@ -255,14 +255,16 @@ public class ApplicationBuilder {
         ApplicationsEventPublisher.sendApplicationDeletedEvent(appId, appClusterDataToSend);
     }
 
-    public static void handleApplicationInstanceTerminatedEvent(String applicationId, String instanceId) {
+    public static void handleApplicationInstanceTerminatedEvent(String applicationId,
+                                                                String instanceId) {
         if (log.isDebugEnabled()) {
             log.debug("Handling application terminated event: [application-id] " + applicationId +
                     " [instance] " + instanceId);
         }
 
         Application application = ApplicationHolder.getApplications().getApplication(applicationId);
-        ApplicationContext applicationContext = AutoscalerContext.getInstance().getApplicationContext(applicationId);
+        ApplicationContext applicationContext = AutoscalerContext.getInstance().
+                getApplicationContext(applicationId);
 
         if ((application == null) || (applicationContext == null)) {
             log.warn("Application does not exist: [application-id] " + applicationId);
@@ -272,7 +274,8 @@ public class ApplicationBuilder {
             if (applicationInstance.isStateTransitionValid(status)) {
                 //setting the status, persist and publish
                 applicationInstance.setStatus(status);
-                updateApplicationMonitor(applicationId, status, applicationInstance.getNetworkPartitionId(),
+                updateApplicationMonitor(applicationId, status,
+                        applicationInstance.getNetworkPartitionId(),
                         instanceId);
                 ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance().
                         getAppMonitor(applicationId);
@@ -282,14 +285,16 @@ public class ApplicationBuilder {
                 networkPartitionContext.removeInstanceContext(instanceId);
                 applicationMonitor.removeInstance(instanceId);
                 application.removeInstance(instanceId);
-                ApplicationsEventPublisher.sendApplicationInstanceTerminatedEvent(applicationId, instanceId);
+                ApplicationsEventPublisher.sendApplicationInstanceTerminatedEvent(applicationId,
+                        instanceId);
 
                 //removing the monitor
                 if (application.getInstanceContextCount() == 0 &&
                         applicationMonitor.isTerminating()) {
                     //Stopping the child threads
                     if (applicationMonitor.hasMonitors() && applicationMonitor.isTerminating()) {
-                        for (Monitor monitor1 : applicationMonitor.getAliasToActiveChildMonitorsMap().values()) {
+                        for (Monitor monitor1 : applicationMonitor.
+                                getAliasToActiveChildMonitorsMap().values()) {
                             //destroying the drools
                             monitor1.destroy();
                         }
@@ -302,7 +307,7 @@ public class ApplicationBuilder {
                     applicationContext.setStatus(ApplicationContext.STATUS_CREATED);
                     AutoscalerContext.getInstance().updateApplicationContext(applicationContext);
 
-                    log.info("Application undeployed successfully: [application-id] " + applicationId);
+                    log.info("Application un-deployed successfully: [application-id] " + applicationId);
                 }
             } else {
                 log.warn(String.format("Application state transition is not valid: [application-id] %s " +
@@ -338,19 +343,23 @@ public class ApplicationBuilder {
             ApplicationHolder.releaseWriteLock();
         }
 
-        // if monitors is not found for any cluster, assume cluster is not there and send cluster terminating event.
-        // this assumes the cluster monitor will not fail after creating members, but will only fail before
+        // if monitors is not found for any cluster, assume cluster is not there and
+        // send cluster terminating event. This assumes the cluster monitor will
+        // not fail after creating members, but will only fail before
         for (ClusterDataHolder aClusterData : clusterData) {
             if (AutoscalerContext.getInstance().getClusterMonitor(aClusterData.getClusterId()) == null) {
                 TopologyManager.acquireReadLockForCluster(aClusterData.getServiceType(),
                         aClusterData.getClusterId());
                 try {
-                    Service service = TopologyManager.getTopology().getService(aClusterData.getServiceType());
+                    Service service = TopologyManager.getTopology().
+                            getService(aClusterData.getServiceType());
                     if (service != null) {
                         Cluster cluster = service.getCluster(aClusterData.getClusterId());
                         if (cluster != null) {
-                            for (ClusterInstance instance : cluster.getInstanceIdToInstanceContextMap().values()) {
-                                ClusterStatusEventPublisher.sendClusterStatusClusterTerminatingEvent(applicationId,
+                            for (ClusterInstance instance :
+                                    cluster.getInstanceIdToInstanceContextMap().values()) {
+                                ClusterStatusEventPublisher.
+                                        sendClusterStatusClusterTerminatingEvent(applicationId,
                                         aClusterData.getServiceType(),
                                         aClusterData.getClusterId(),
                                         instance.getInstanceId());
@@ -368,7 +377,8 @@ public class ApplicationBuilder {
     }
 
 
-    public static void handleGroupInstanceTerminatedEvent(String appId, String groupId, String instanceId) {
+    public static void handleGroupInstanceTerminatedEvent(String appId, String groupId,
+                                                          String instanceId) {
         if (log.isDebugEnabled()) {
             log.debug("Handling group terminated event: [group-id] " + groupId +
                     " [application-id] " + appId + " [instance] " + instanceId);
@@ -405,7 +415,8 @@ public class ApplicationBuilder {
 
                 if (monitor != null) {
                     if (monitor.hasMonitors() && applicationMonitor.isTerminating()) {
-                        for (Monitor monitor1 : monitor.getAliasToActiveChildMonitorsMap().values()) {
+                        for (Monitor monitor1 : monitor.
+                                getAliasToActiveChildMonitorsMap().values()) {
                             //destroying the drools
                             monitor1.destroy();
                         }
@@ -643,17 +654,33 @@ public class ApplicationBuilder {
         NetworkPartitionContext context = applicationMonitor.
                 getNetworkPartitionContext(networkPartitionId);
         if (applicationMonitor != null) {
-            if (status == ApplicationStatus.Active) {
+            if(status == ApplicationStatus.Active) {
+                if(log.isDebugEnabled()) {
+                    log.debug("Moving pending [application-instance] " + instanceId +
+                            " to active list in [application] " + appId);
+                }
                 context.movePendingInstanceToActiveInstances(instanceId);
-            } else if (status == ApplicationStatus.Terminating) {
+            } else if(status == ApplicationStatus.Terminating) {
                 applicationMonitor.setTerminating(true);
 
-                if (context.getActiveInstance(instanceId) != null) {
+                if(context.getActiveInstance(instanceId) != null) {
+                    if(log.isDebugEnabled()) {
+                        log.debug("Moving active [application-instance] " + instanceId +
+                                " to termination pending list " + "in [application] " + appId);
+                    }
                     context.moveActiveInstanceToTerminationPendingInstances(instanceId);
-                } else if (context.getPendingInstance(instanceId) != null) {
+                } else if(context.getPendingInstance(instanceId) != null) {
+                    if(log.isDebugEnabled()) {
+                        log.debug("Moving pending  [application-instance]" + instanceId +
+                                " to termination pending list in [application] " + appId);
+                    }
                     context.movePendingInstanceToTerminationPendingInstances(instanceId);
                 }
-            } else if (status == ApplicationStatus.Terminated) {
+            } else if(status == ApplicationStatus.Terminated) {
+                if(log.isDebugEnabled()) {
+                    log.debug("Removing termination pending [application-instance] " + instanceId
+                            + " [application] " + appId);
+                }
                 context.removeTerminationPendingInstance(instanceId);
             }
             applicationMonitor.setStatus(status, instanceId);
@@ -669,15 +696,31 @@ public class ApplicationBuilder {
         GroupMonitor monitor = getGroupMonitor(appId, groupId);
         if (monitor != null) {
             NetworkPartitionContext context = monitor.getNetworkPartitionContext(networkPartitionId);
-            if (status == GroupStatus.Active) {
+            if(status == GroupStatus.Active) {
+                if(log.isDebugEnabled()) {
+                    log.debug("Moving pending group instance to active list in [group] " + groupId
+                            + " [group-instance] " + instanceId);
+                }
                 context.movePendingInstanceToActiveInstances(instanceId);
-            } else if (status == GroupStatus.Terminating) {
-                if (context.getActiveInstance(instanceId) != null) {
+            } else if(status == GroupStatus.Terminating) {
+                if(context.getActiveInstance(instanceId) != null) {
+                    if(log.isDebugEnabled()) {
+                        log.debug("Moving active group instance to termination pending list in " +
+                                "[group] " + groupId + " [group-instance] " + instanceId);
+                    }
                     context.moveActiveInstanceToTerminationPendingInstances(instanceId);
-                } else if (context.getPendingInstance(instanceId) != null) {
+                } else if(context.getPendingInstance(instanceId) != null) {
+                    if(log.isDebugEnabled()) {
+                        log.debug("Moving pending group instance to termination pending list in " +
+                                "[group] " + groupId + " [group-instance] " + instanceId);
+                    }
                     context.movePendingInstanceToTerminationPendingInstances(instanceId);
                 }
-            } else if (status == GroupStatus.Terminated) {
+            } else if(status == GroupStatus.Terminated) {
+                if(log.isDebugEnabled()) {
+                    log.debug("Removing termination pending group instance in " +
+                            "[group] " + groupId + " [group-instance] " + instanceId);
+                }
                 context.removeTerminationPendingInstance(instanceId);
             }
             monitor.setStatus(status, instanceId, parentInstanceId);

http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java
index bd66cd0..d5c71cf 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java
@@ -33,14 +33,15 @@ public class ApplicationsEventPublisher {
         publishEvent(new ApplicationDeletedEvent(appId, clusterData));
     }
 
-    public static void sendApplicationInstanceCreatedEvent(String appId, ApplicationInstance applicationInstance) {
+    public static void sendApplicationInstanceCreatedEvent(String appId,
+                                                           ApplicationInstance applicationInstance) {
         publishEvent(new ApplicationInstanceCreatedEvent(appId, applicationInstance));
     }
 
     public static void sendGroupInstanceCreatedEvent(String appId, String groupId,
                                                      GroupInstance groupInstance) {
         if (log.isInfoEnabled()) {
-            log.info("Publishing group created event: [application] " + appId +
+            log.info("Publishing group instance created event: [application] " + appId +
                     " [group] " + groupId + " [instance] " + groupInstance.getInstanceId());
         }
         GroupInstanceCreatedEvent groupCreatedEvent =
@@ -48,9 +49,10 @@ public class ApplicationsEventPublisher {
         publishEvent(groupCreatedEvent);
     }
 
-    public static void sendGroupInstanceActivatedEvent(String appId, String groupId, String instanceId) {
+    public static void sendGroupInstanceActivatedEvent(String appId, String groupId,
+                                                       String instanceId) {
         if (log.isInfoEnabled()) {
-            log.info("Publishing group activated event: [application] " + appId +
+            log.info("Publishing group instance activated event: [application] " + appId +
                     " [group] " + groupId + " [instance] " + instanceId);
         }
         GroupInstanceActivatedEvent groupActivatedEvent =
@@ -58,9 +60,10 @@ public class ApplicationsEventPublisher {
         publishEvent(groupActivatedEvent);
     }
 
-    public static void sendGroupInstanceInactivateEvent(String appId, String groupId, String instanceId) {
+    public static void sendGroupInstanceInactivateEvent(String appId, String groupId,
+                                                        String instanceId) {
         if (log.isInfoEnabled()) {
-            log.info("Publishing group inactivate event: [application] " + appId +
+            log.info("Publishing group instance inactivate event: [application] " + appId +
                     " [group] " + groupId + " [instance] " + instanceId);
         }
         GroupInstanceInactivatedEvent groupInactivateEvent =
@@ -68,9 +71,10 @@ public class ApplicationsEventPublisher {
         publishEvent(groupInactivateEvent);
     }
 
-    public static void sendGroupInstanceTerminatingEvent(String appId, String groupId, String instanceId) {
+    public static void sendGroupInstanceTerminatingEvent(String appId, String groupId,
+                                                         String instanceId) {
         if (log.isInfoEnabled()) {
-            log.info("Publishing group terminating event: [application] " + appId +
+            log.info("Publishing group instance terminating event: [application] " + appId +
                     " [group] " + groupId + " [instance] " + instanceId);
         }
         GroupInstanceTerminatingEvent groupInTerminatingEvent =
@@ -78,10 +82,11 @@ public class ApplicationsEventPublisher {
         publishEvent(groupInTerminatingEvent);
     }
 
-    public static void sendGroupInstanceTerminatedEvent(String appId, String groupId, String instanceId) {
+    public static void sendGroupInstanceTerminatedEvent(String appId, String groupId,
+                                                        String instanceId) {
 
         if (log.isInfoEnabled()) {
-            log.info("Publishing group terminated event: [application] " + appId +
+            log.info("Publishing group instance terminated event: [application] " + appId +
                     " [group] " + groupId + " [instance] " + instanceId);
         }
         GroupInstanceTerminatedEvent groupInTerminatedEvent =
@@ -91,7 +96,7 @@ public class ApplicationsEventPublisher {
 
     public static void sendApplicationInstanceActivatedEvent(String appId, String instanceId) {
         if (log.isInfoEnabled()) {
-            log.info("Publishing application active event: [application] " + appId
+            log.info("Publishing application instance active event: [application] " + appId
                     + " [instance] " + instanceId);
         }
         ApplicationInstanceActivatedEvent applicationActivatedEvent =
@@ -102,7 +107,7 @@ public class ApplicationsEventPublisher {
 
     public static void sendApplicationInstanceInactivatedEvent(String appId, String instanceId) {
         if (log.isInfoEnabled()) {
-            log.info("Publishing application inactivated event: [application] " + appId +
+            log.info("Publishing application instance in-activated event: [application] " + appId +
                     " [instance] " + instanceId);
         }
         ApplicationInstanceInactivatedEvent applicationInactivatedEvent =
@@ -113,7 +118,7 @@ public class ApplicationsEventPublisher {
 
     public static void sendApplicationInstanceTerminatingEvent(String appId, String instanceId) {
         if (log.isInfoEnabled()) {
-            log.info("Publishing application terminating event: [application] " + appId +
+            log.info("Publishing application instance terminating event: [application] " + appId +
                     " [instance] " + instanceId);
         }
         ApplicationInstanceTerminatingEvent applicationTerminatingEvent =
@@ -123,7 +128,7 @@ public class ApplicationsEventPublisher {
 
     public static void sendApplicationInstanceTerminatedEvent(String appId, String instanceId) {
         if (log.isInfoEnabled()) {
-            log.info("Publishing application terminated event: [application] " + appId +
+            log.info("Publishing application instance terminated event: [application] " + appId +
                     " [instance] " + instanceId);
         }
         ApplicationInstanceTerminatedEvent applicationTerminatedEvent =

http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/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 a2d887e..4a1c117 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
@@ -25,6 +25,7 @@ import org.apache.stratos.messaging.domain.instance.ClusterInstance;
 import java.io.Serializable;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 /*
  * It holds the runtime data of a service cluster
@@ -43,7 +44,7 @@ public class AbstractClusterContext implements Serializable {
     public AbstractClusterContext(String clusterId, String serviceId) {
         this.clusterId = clusterId;
         this.serviceId = serviceId;
-        clusterInstanceMap = new HashMap<String, ClusterInstance>();
+        clusterInstanceMap = new ConcurrentHashMap<String, ClusterInstance>();
     }
 
     public String getServiceId() {

http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/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 314be1e..0228a15 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
@@ -471,7 +471,7 @@ public class ApplicationMonitor extends ParentComponentMonitor {
         }
 
         boolean burstNPFound = false;
-        String instanceId = null;
+        List<String> instanceIdList = new ArrayList<String>();
 
         ApplicationPolicy applicationPolicy = PolicyManager.getInstance().
                 getApplicationPolicy(application.getApplicationPolicyId());
@@ -517,7 +517,7 @@ public class ApplicationMonitor extends ParentComponentMonitor {
 
         for (String networkPartitionId : nextNetworkPartitions) {
             if (!this.getNetworkPartitionCtxts().containsKey(networkPartitionId)) {
-
+                String instanceId = null;
                 ApplicationLevelNetworkPartitionContext context = new
                         ApplicationLevelNetworkPartitionContext(networkPartitionId);
 
@@ -534,6 +534,9 @@ public class ApplicationMonitor extends ParentComponentMonitor {
                             "in the ApplicationsTopology. Hence not creating new AppInstance.");
                     instanceId = handleApplicationInstanceCreation(application, context, appInstance);
                 }
+                if(instanceId != null) {
+                    instanceIdList.add(instanceId);
+                }
                 burstNPFound = true;
             }
         }
@@ -541,7 +544,7 @@ public class ApplicationMonitor extends ParentComponentMonitor {
         if (!burstNPFound) {
             log.warn("[Application] " + appId + " cannot be burst as no available resources found");
         } else {
-            startDependency(application, instanceId);
+            startDependency(application, instanceIdList);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/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 75b18f1..0265501 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
@@ -113,7 +113,7 @@ public abstract class ParentComponentMonitor extends Monitor {
         // Create the executor service with identifier and thread pool size
         executorService = StratosThreadPool.getExecutorService(AutoscalerConstants.AUTOSCALER_THREAD_POOL_ID,
                 AutoscalerConstants.AUTOSCALER_THREAD_POOL_SIZE);
-        networkPartitionCtxts = new HashMap<String, NetworkPartitionContext>();
+        networkPartitionCtxts = new ConcurrentHashMap<String, NetworkPartitionContext>();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/StatusProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/StatusProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/StatusProcessor.java
index 3d0512c..89982c9 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/StatusProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/StatusProcessor.java
@@ -19,7 +19,7 @@
 package org.apache.stratos.autoscaler.status.processor;
 
 /**
- * Created by reka on 11/25/14.
+ * Abstract class to calculate the status of application/group/cluster
  */
 public abstract class StatusProcessor {
     /**

http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java
index eb35f4f..468d172 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java
@@ -45,7 +45,7 @@ public class ClusterStatusActiveProcessor extends ClusterStatusProcessor {
         if (type == null || (ClusterStatusActiveProcessor.class.getName().equals(type))) {
             statusChanged = doProcess(clusterId, instanceId);
             if (statusChanged) {
-                return statusChanged;
+                return true;
             }
 
         } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInactiveProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInactiveProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInactiveProcessor.java
index 8383513..ed918e3 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInactiveProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInactiveProcessor.java
@@ -45,7 +45,7 @@ public class ClusterStatusInactiveProcessor extends ClusterStatusProcessor {
         if (type == null || (ClusterStatusInactiveProcessor.class.getName().equals(type))) {
             statusChanged = doProcess(clusterId, instanceId);
             if (statusChanged) {
-                return statusChanged;
+                return true;
             }
 
         } else {
@@ -54,15 +54,15 @@ public class ClusterStatusInactiveProcessor extends ClusterStatusProcessor {
                 return nextProcessor.process(type, clusterId, instanceId);
             } else {
 
-                log.warn(String.format("No possible state change found for [type] %s [cluster] %s [instance]",
-                        type, clusterId, instanceId));
+                log.warn(String.format("No possible state change found for [type] %s [cluster] %s " +
+                                "[instance] %s", type, clusterId, instanceId));
             }
         }
         return false;
     }
 
     private boolean doProcess(String clusterId, String instanceId) {
-        ClusterMonitor monitor = (ClusterMonitor) AutoscalerContext.getInstance().
+        ClusterMonitor monitor = AutoscalerContext.getInstance().
                 getClusterMonitor(clusterId);
 
         boolean clusterInactive;

http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java
index 9a6216a..f56a29a 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java
@@ -50,7 +50,7 @@ public class ClusterStatusTerminatedProcessor extends ClusterStatusProcessor {
         if (type == null || (ClusterStatusTerminatedProcessor.class.getName().equals(type))) {
             statusChanged = doProcess(clusterId, instanceId);
             if (statusChanged) {
-                return statusChanged;
+                return true;
             }
 
         } else {
@@ -118,7 +118,6 @@ public class ClusterStatusTerminatedProcessor extends ClusterStatusProcessor {
      * @return whether has members or not
      */
     private boolean clusterInstanceHasMembers(ClusterMonitor monitor, String instanceId) {
-        boolean hasMember = false;
         for (ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext :
                 monitor.getAllNetworkPartitionCtxts().values()) {
             //minimum check per partition
@@ -130,16 +129,13 @@ public class ClusterStatusTerminatedProcessor extends ClusterStatusProcessor {
                     for (ClusterLevelPartitionContext partitionContext :
                             clusterInstanceContext.getPartitionCtxts()) {
                         if (partitionContext.getNonTerminatedMemberCount() > 0) {
-                            hasMember = true;
-                            return hasMember;
-                        } else {
-                            hasMember = false;
+                            return true;
                         }
                     }
                 }
             }
 
         }
-        return hasMember;
+        return false;
     }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusActiveProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusActiveProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusActiveProcessor.java
index 7f824a7..e8c5b0b 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusActiveProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusActiveProcessor.java
@@ -85,28 +85,25 @@ public class GroupStatusActiveProcessor extends GroupStatusProcessor {
             groups = component.getAliasToGroupMap();
             clusterData = component.getClusterDataMap();
 
-            if (groups.isEmpty() && getAllClusterInSameState(clusterData, ClusterStatus.Active, instanceId) ||
-                    clusterData.isEmpty() && getAllGroupInSameState(groups, GroupStatus.Active, instanceId) ||
+            if (groups.isEmpty() &&
+                    getAllClusterInSameState(clusterData, ClusterStatus.Active, instanceId) ||
+                    clusterData.isEmpty() &&
+                            getAllGroupInSameState(groups, GroupStatus.Active, instanceId) ||
                     getAllClusterInSameState(clusterData, ClusterStatus.Active, instanceId) &&
                             getAllGroupInSameState(groups, GroupStatus.Active, instanceId)) {
-                //send activation event
+
                 if (component instanceof Application) {
                     //send application activated event
-
-                    if (log.isInfoEnabled()) {
-                        log.info(String.format("Sending application active for [application] %s [instance] %s ", appId
-                                , instanceId));
-                    }
+                    log.info("Sending application instance active for [application] " + appId +
+                            " [instance] " + instanceId);
                     ApplicationBuilder.handleApplicationInstanceActivatedEvent(appId, instanceId);
                     return true;
                 } else if (component instanceof Group) {
                     //send activation to the parent
-
-                    if (log.isInfoEnabled()) {
-                        log.info(String.format("Sending group instance active for [group] %s [instance] %s ", component.getUniqueIdentifier()
-                                , instanceId));
-                    }
-                    ApplicationBuilder.handleGroupInstanceActivatedEvent(appId, component.getUniqueIdentifier(), instanceId);
+                    log.info("Sending group instance active for [group] " +
+                            component.getUniqueIdentifier() + " [instance] " + instanceId);
+                    ApplicationBuilder.handleGroupInstanceActivatedEvent(appId,
+                            component.getUniqueIdentifier(), instanceId);
                     return true;
                 }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusInactiveProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusInactiveProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusInactiveProcessor.java
index 8d77230..a69db5a 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusInactiveProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusInactiveProcessor.java
@@ -26,15 +26,17 @@ import org.apache.stratos.autoscaler.status.processor.StatusProcessor;
 import org.apache.stratos.messaging.domain.application.*;
 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.message.receiver.topology.TopologyManager;
 
+import java.util.List;
 import java.util.Map;
 
 /**
- * Cluster active status processor
+ * Cluster in-active status processor
  */
 public class GroupStatusInactiveProcessor extends GroupStatusProcessor {
     private static final Log log = LogFactory.getLog(GroupStatusInactiveProcessor.class);
@@ -50,7 +52,7 @@ public class GroupStatusInactiveProcessor extends GroupStatusProcessor {
         boolean statusChanged;
         statusChanged = doProcess(idOfComponent, appId, instanceId);
         if (statusChanged) {
-            return statusChanged;
+            return true;
         }
 
         if (nextProcessor != null) {
@@ -91,34 +93,31 @@ public class GroupStatusInactiveProcessor extends GroupStatusProcessor {
 
             if (groups.isEmpty() && getAllClusterInactive(clusterData, instanceId) ||
                     clusterData.isEmpty() && getAllGroupInactive(groups, instanceId) ||
-                    getAllClusterInactive(clusterData, instanceId) || getAllGroupInactive(groups, instanceId)) {
-                //send the in activation event
+                    getAllClusterInactive(clusterData, instanceId) ||
+                    getAllGroupInactive(groups, instanceId)) {
+                //send the in-activation event
                 if (component instanceof Application) {
-                    //send application activated event
+                    //send application in-activated event
                     log.warn("Sending application instance inactive for [Application] " + appId +
                             " [ApplicationInstance] " + instanceId);
                     ApplicationBuilder.handleApplicationInstanceInactivateEvent(appId, instanceId);
 
                     return true;
-                    //ApplicationBuilder.handleApp(appId);
-                } else if (component instanceof Group) {
-                    //send activation to the parent
+                } else {
+                    //send group in-activated event
                     if (((Group) component).getStatus(instanceId) != GroupStatus.Inactive) {
-                        log.info("sending group instance Inactive for [group] " +
+                        log.info("Sending group instance Inactive for [group] " +
                                 component.getUniqueIdentifier() + " [instance] " + instanceId);
-                        ApplicationBuilder.handleGroupInactivateEvent(appId, component.getUniqueIdentifier(), instanceId);
+                        ApplicationBuilder.handleGroupInactivateEvent(appId,
+                                component.getUniqueIdentifier(), instanceId);
                         return true;
                     }
                 }
             }
-
-
         } finally {
             ApplicationHolder.releaseWriteLock();
 
         }
-
-
         return false;
     }
 
@@ -130,26 +129,20 @@ public class GroupStatusInactiveProcessor extends GroupStatusProcessor {
      * @return whether inactive or not
      */
 
-    private boolean getAllClusterInactive(Map<String, ClusterDataHolder> clusterData, String instanceId) {
-        boolean clusterStat = false;
+    private boolean getAllClusterInactive(Map<String, ClusterDataHolder> clusterData,
+                                          String instanceId) {
         for (Map.Entry<String, ClusterDataHolder> clusterDataHolderEntry : clusterData.entrySet()) {
-            Service service = TopologyManager.getTopology().getService(clusterDataHolderEntry.getValue().getServiceType());
+            Service service = TopologyManager.getTopology().
+                    getService(clusterDataHolderEntry.getValue().getServiceType());
             Cluster cluster = service.getCluster(clusterDataHolderEntry.getValue().getClusterId());
             ClusterInstance context = cluster.getInstanceContexts(instanceId);
             if (context != null) {
                 if (context.getStatus() == ClusterStatus.Inactive) {
-                    clusterStat = true;
-                    return clusterStat;
-                } else {
-                    clusterStat = false;
-
+                    return true;
                 }
-            } else {
-                clusterStat = false;
             }
-
         }
-        return clusterStat;
+        return false;
     }
 
 
@@ -160,21 +153,29 @@ public class GroupStatusInactiveProcessor extends GroupStatusProcessor {
      * @return whether inactive or not
      */
     private boolean getAllGroupInactive(Map<String, Group> groups, String instanceId) {
-        boolean groupStat = false;
         for (Group group : groups.values()) {
             GroupInstance context = group.getInstanceContexts(instanceId);
             if (context != null) {
                 if (context.getStatus() == GroupStatus.Inactive) {
-                    groupStat = true;
-                    return groupStat;
-                } else {
-                    groupStat = false;
+                    return true;
                 }
-                //TODO get by parent
             } else {
-                groupStat = false;
+                List<Instance> instanceList = group.getInstanceContextsWithParentId(instanceId);
+                //if no instances found and requested status is terminated,
+                // then considering this group as terminated
+                if (instanceList != null && !instanceList.isEmpty()) {
+                    int sameStateInstances = 0;
+                    for (Instance context1 : instanceList) {
+                        if (((GroupInstance) context1).getStatus().equals(GroupStatus.Inactive)) {
+                            sameStateInstances++;
+                        }
+                    }
+                    if (sameStateInstances >= 1) {
+                        return true;
+                    }
+                }
             }
         }
-        return groupStat;
+        return false;
     }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessor.java
index bdf8f7e..d14bcbd 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessor.java
@@ -65,15 +65,14 @@ public abstract class GroupStatusProcessor extends StatusProcessor {
                 if (context.getStatus() == status) {
                     groupStat = true;
                 } else {
-                    groupStat = false;
-                    return groupStat;
+                    return false;
                 }
             } else {
                 //Checking the minimum of the group instances to be satisfied
                 List<Instance> contexts = group.getInstanceContextsWithParentId(instanceId);
                 //if no instances found and requested status is terminated,
                 // then considering this group as terminated
-                if (context == null && contexts.isEmpty() && status == GroupStatus.Terminated) {
+                if (contexts == null || contexts.isEmpty() && status == GroupStatus.Terminated) {
                     groupStat = true;
                 } else {
                     int minGroupInstances = group.getGroupMinInstances();
@@ -86,12 +85,9 @@ public abstract class GroupStatusProcessor extends StatusProcessor {
                     if (sameStateInstances >= minGroupInstances) {
                         groupStat = true;
                     } else {
-                        groupStat = false;
-                        return groupStat;
+                        return false;
                     }
                 }
-
-
             }
         }
         return groupStat;
@@ -123,16 +119,14 @@ public abstract class GroupStatusProcessor extends StatusProcessor {
                     if (context.getStatus() == status) {
                         clusterStat = true;
                     } else {
-                        clusterStat = false;
-                        return clusterStat;
+                        return false;
                     }
                 } else {
                     //Checking whether non-existent context is for a terminated state change
                     if (status == ClusterStatus.Terminated) {
                         clusterStat = true;
                     } else {
-                        clusterStat = false;
-                        return clusterStat;
+                        return false;
                     }
                 }
             } finally {

http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusTerminatedProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusTerminatedProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusTerminatedProcessor.java
index 133feaa..8cade3c 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusTerminatedProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusTerminatedProcessor.java
@@ -29,7 +29,7 @@ import org.apache.stratos.messaging.domain.topology.ClusterStatus;
 import java.util.Map;
 
 /**
- * Cluster active status processor
+ * Cluster Terminated status processor
  */
 public class GroupStatusTerminatedProcessor extends GroupStatusProcessor {
     private static final Log log = LogFactory.getLog(GroupStatusTerminatedProcessor.class);
@@ -86,18 +86,20 @@ public class GroupStatusTerminatedProcessor extends GroupStatusProcessor {
             groups = component.getAliasToGroupMap();
             clusterData = component.getClusterDataMap();
 
-            if (groups.isEmpty() && getAllClusterInSameState(clusterData, ClusterStatus.Terminated, instanceId) ||
-                    clusterData.isEmpty() && getAllGroupInSameState(groups, GroupStatus.Terminated, instanceId) ||
+            if (groups.isEmpty() &&
+                    getAllClusterInSameState(clusterData, ClusterStatus.Terminated, instanceId) ||
+                    clusterData.isEmpty() &&
+                            getAllGroupInSameState(groups, GroupStatus.Terminated, instanceId) ||
                     getAllClusterInSameState(clusterData, ClusterStatus.Terminated, instanceId) &&
                             getAllGroupInSameState(groups, GroupStatus.Terminated, instanceId)) {
                 //send the terminated event
                 if (component instanceof Application) {
-                    log.info("sending application terminated for [application] " + appId + " [instance] "
-                            + instanceId);
+                    log.info("Sending application instance terminated for [application] " + appId
+                            + " [instance] " + instanceId);
                     ApplicationBuilder.handleApplicationInstanceTerminatedEvent(appId, instanceId);
                     return true;
                 } else if (component instanceof Group) {
-                    log.info("sending group instance terminated for [group] " +
+                    log.info("Sending group instance terminated for [group] " +
                             component.getUniqueIdentifier() + " [instance] " + instanceId);
                     ApplicationBuilder.handleGroupInstanceTerminatedEvent(appId,
                             component.getUniqueIdentifier(), instanceId);

http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusTerminatingProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusTerminatingProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusTerminatingProcessor.java
index d3a29ae..fd83833 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusTerminatingProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusTerminatingProcessor.java
@@ -29,7 +29,7 @@ import org.apache.stratos.messaging.domain.topology.ClusterStatus;
 import java.util.Map;
 
 /**
- * Cluster active status processor
+ * Cluster terminating status processor
  */
 public class GroupStatusTerminatingProcessor extends GroupStatusProcessor {
     private static final Log log = LogFactory.getLog(GroupStatusTerminatingProcessor.class);
@@ -86,19 +86,21 @@ public class GroupStatusTerminatingProcessor extends GroupStatusProcessor {
             groups = component.getAliasToGroupMap();
             clusterData = component.getClusterDataMap();
 
-            if (groups.isEmpty() && getAllClusterInSameState(clusterData, ClusterStatus.Terminating, instanceId) ||
-                    clusterData.isEmpty() && getAllGroupInSameState(groups, GroupStatus.Terminating, instanceId) ||
+            if (groups.isEmpty() &&
+                    getAllClusterInSameState(clusterData, ClusterStatus.Terminating, instanceId) ||
+                    clusterData.isEmpty() &&
+                            getAllGroupInSameState(groups, GroupStatus.Terminating, instanceId) ||
                     getAllClusterInSameState(clusterData, ClusterStatus.Terminating, instanceId) &&
                             getAllGroupInSameState(groups, GroupStatus.Terminating, instanceId)) {
-                //send the terminated event
+                //send the terminating event
                 if (component instanceof Application) {
-                    log.info("sending app terminating for [application] " + appId + " and for " +
-                            " [instance] " + instanceId);
+                    log.info("Sending application instance terminating for [application] "
+                            + appId + " and for " + " [instance] " + instanceId);
                     ApplicationBuilder.handleApplicationInstanceTerminatedEvent(appId, instanceId);
                     return true;
                 } else if (component instanceof Group) {
                     //send activation to the parent
-                    log.info("sending group terminating for [group] " +
+                    log.info("Sending group terminating for [group] " +
                             component.getUniqueIdentifier() + " and for [instance] "
                             + instanceId);
                     ApplicationBuilder.handleGroupTerminatingEvent(appId,