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

[25/50] stratos git commit: fixing undeployment issue by removing the instances

fixing undeployment issue by removing the instances


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

Branch: refs/heads/master
Commit: 196336cbee7254f65b2c6ae1a1b0f900f4f18b17
Parents: dc5ae90
Author: reka <rt...@gmail.com>
Authored: Thu Dec 11 14:19:04 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Thu Dec 11 19:24:11 2014 +0530

----------------------------------------------------------------------
 .../applications/topic/ApplicationBuilder.java  |  2 +-
 .../topic/ApplicationsEventPublisher.java       |  4 +-
 .../partition/ClusterLevelPartitionContext.java |  9 +++++
 .../AutoscalerTopologyEventReceiver.java        |  1 +
 .../monitor/cluster/VMClusterMonitor.java       | 20 ++++++----
 .../monitor/component/ApplicationMonitor.java   |  2 +-
 .../monitor/component/GroupMonitor.java         | 27 ++++++++-----
 .../group/GroupStatusActiveProcessor.java       | 36 ++++++++----------
 .../group/GroupStatusTerminatedProcessor.java   | 33 ++++++++--------
 .../group/GroupStatusTerminatingProcessor.java  | 40 +++++++++-----------
 .../ApplicationInstanceTerminatedEvent.java     | 11 +++---
 ...licationInstanceCreatedMessageProcessor.java |  3 +-
 ...ationInstanceTerminatedMessageProcessor.java | 11 +++++-
 .../ClusterInstanceTerminatedProcessor.java     |  3 ++
 14 files changed, 113 insertions(+), 89 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/196336cb/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 d46a232..1194a6f 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
@@ -304,7 +304,7 @@ public class ApplicationBuilder {
                     //ApplicationHolder.removeApplication(appId);
                     log.info("Application run time is removed: [application-id] " + appId);
                 }
-                ApplicationsEventPublisher.sendApplicationInstanceTerminatedEvent(appId, clusterData);
+                ApplicationsEventPublisher.sendApplicationInstanceTerminatedEvent(appId, instanceId);
             } else {
                 log.warn(String.format("Application state transition is not valid: [application-id] %s " +
                                 " [current-status] %s [status-requested] %s", appId,

http://git-wip-us.apache.org/repos/asf/stratos/blob/196336cb/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 52e8c55..c03a92b 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
@@ -119,12 +119,12 @@ public class ApplicationsEventPublisher {
         publishEvent(applicationTerminatingEvent);
     }
 
-    public static void sendApplicationInstanceTerminatedEvent(String appId, Set<ClusterDataHolder> clusterData) {
+    public static void sendApplicationInstanceTerminatedEvent(String appId, String instanceId) {
         if (log.isInfoEnabled()) {
             log.info("Publishing Application terminated event for [application]: " + appId);
         }
         ApplicationInstanceTerminatedEvent applicationTerminatedEvent =
-                new ApplicationInstanceTerminatedEvent(appId, clusterData);
+                new ApplicationInstanceTerminatedEvent(appId, instanceId);
         publishEvent(applicationTerminatedEvent);
     }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/196336cb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/ClusterLevelPartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/ClusterLevelPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/ClusterLevelPartitionContext.java
index 663f301..f3f5046 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/ClusterLevelPartitionContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/ClusterLevelPartitionContext.java
@@ -539,6 +539,15 @@ public class ClusterLevelPartitionContext extends PartitionContext implements Se
         return null;
     }
 
+    public MemberContext getObsoleteMember(String memberId) {
+        for (MemberContext memberContext : obsoletedMembers.values()) {
+            if (memberId.equals(memberContext.getMemberId())) {
+                return memberContext;
+            }
+        }
+        return null;
+    }
+
     public long getTerminationPendingMemberExpiryTime() {
         return terminationPendingMemberExpiryTime;
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/196336cb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java
index 53d60b7..865cfb7 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java
@@ -321,6 +321,7 @@ public class AutoscalerTopologyEventReceiver {
             @Override
             protected void onEvent(Event event) {
                 try {
+                    log.info("[MemberReadyToShutdownEvent] Received: " + event.getClass());
                     MemberReadyToShutdownEvent memberReadyToShutdownEvent = (MemberReadyToShutdownEvent) event;
                     String clusterId = memberReadyToShutdownEvent.getClusterId();
                     AutoscalerContext asCtx = AutoscalerContext.getInstance();

http://git-wip-us.apache.org/repos/asf/stratos/blob/196336cb/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
index cf1e090..f208edc 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
@@ -919,15 +919,19 @@ public class VMClusterMonitor extends AbstractClusterMonitor {
             //move member to pending termination list
             if (partitionCtxt.getPendingTerminationMember(memberId) != null) {
                 partitionCtxt.movePendingTerminationMemberToObsoleteMembers(memberId);
-            } else if (partitionCtxt.getPendingTerminationMember(memberId) != null) {
-                // add member to obsolete list since the member is shutdown ready member
-                partitionCtxt.movePendingTerminationMemberToObsoleteMembers(memberId);
-            }
+                if (log.isInfoEnabled()) {
+                    log.info(String.format("Member is removed from the pending termination members " +
+                            "and moved to obsolete list: [member] %s " +
+                            "[partition] %s [cluster] %s ", memberId, partitionId, clusterId));
+                }
+            } else if(partitionCtxt.getObsoleteMember(memberId) != null) {
+                if (log.isInfoEnabled()) {
+                    log.info(String.format("Member is  in obsolete list: [member] %s " +
+                            "[partition] %s [cluster] %s ", memberId, partitionId, clusterId));
+                }
+            } //TODO else part
+
 
-            if (log.isInfoEnabled()) {
-                log.info(String.format("Member is terminated and removed from the active members list: [member] %s " +
-                        "[partition] %s [cluster] %s ", memberId, partitionId, clusterId));
-            }
         } catch (Exception e) {
             String msg = "Error processing event " + e.getLocalizedMessage();
             log.error(msg, e);

http://git-wip-us.apache.org/repos/asf/stratos/blob/196336cb/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 f8f2e82..9d0a943 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
@@ -151,7 +151,7 @@ public class ApplicationMonitor extends ParentComponentMonitor {
 
             ApplicationInstance instance = (ApplicationInstance) instanceIdToInstanceMap.get(instanceId);
             if (instance != null) {
-                if (instance.getStatus() == ApplicationStatus.Terminating) {
+                if (this.isTerminating()) {
                     ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(this.id,
                             appId, instanceId);
                 } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/196336cb/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 10bcec1..15aa733 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
@@ -173,9 +173,12 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
 
     @Override
     public void onChildStatusEvent(MonitorStatusEvent statusEvent) {
-        String childId = statusEvent.getId();
-        String instanceId = statusEvent.getInstanceId();
-        LifeCycleState status1 = statusEvent.getStatus();
+
+         String childId = statusEvent.getId();
+         String instanceId = statusEvent.getInstanceId();
+         LifeCycleState status1 = statusEvent.getStatus();
+         String id = this.id;
+
         //Events coming from parent are In_Active(in faulty detection), Scaling events, termination
 
         if (status1 == ClusterStatus.Active || status1 == GroupStatus.Active) {
@@ -183,34 +186,40 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
 
         } else if (status1 == ClusterStatus.Inactive || status1 == GroupStatus.Inactive) {
             //handling restart of stratos
-            if (!this.aliasToActiveMonitorsMap.get(childId).hasStartupDependents()) {
+            if (!aliasToActiveMonitorsMap.get(childId).hasStartupDependents()) {
                 onChildActivatedEvent(childId, instanceId);
             } else {
-                this.markInstanceAsInactive(childId, instanceId);
+                markInstanceAsInactive(childId, instanceId);
                 onChildInactiveEvent(childId, instanceId);
             }
 
         } else if (status1 == ClusterStatus.Terminating || status1 == GroupStatus.Terminating) {
-            //mark the child monitor as inActive in the map
+            //mark the child monitor as inactive in the map
             markInstanceAsTerminating(childId, instanceId);
 
         } else if (status1 == ClusterStatus.Terminated || status1 == GroupStatus.Terminated) {
             //Check whether all dependent goes Terminated and then start them in parallel.
             removeInstanceFromFromInactiveMap(childId, instanceId);
             removeInstanceFromFromTerminatingMap(childId, instanceId);
-            GroupInstance instance = (GroupInstance) this.instanceIdToInstanceMap.get(instanceId);
+
+            GroupInstance instance = (GroupInstance) instanceIdToInstanceMap.get(instanceId);
             if (instance != null) {
                 if (instance.getStatus() == GroupStatus.Terminating || instance.getStatus() == GroupStatus.Terminated) {
-                    ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(this.id,
+                    ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(id,
                             appId, instanceId);
                 } else {
                     onChildTerminatedEvent(childId, instanceId);
                 }
+            } else {
+                log.warn("The required instance cannot be found in the the [GroupMonitor] " +
+                        id);
             }
         }
-
     }
 
+
+
+
     @Override
     public void onParentStatusEvent(MonitorStatusEvent statusEvent)
             throws MonitorNotFoundException {

http://git-wip-us.apache.org/repos/asf/stratos/blob/196336cb/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 da2562a..69a6bfa 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
@@ -81,27 +81,23 @@ public class GroupStatusActiveProcessor extends GroupStatusProcessor {
             groups = component.getAliasToGroupMap();
             clusterData = component.getClusterDataMap();
 
-            if (component.isGroupScalingEnabled()) {
-
-            } else {
-                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
-                        log.info("sending app activate: " + appId);
-                        ApplicationBuilder.handleApplicationInstanceActivatedEvent(appId, instanceId);
-                        return true;
-                    } else if (component instanceof Group) {
-                        //send activation to the parent
-                        log.info("sending group activate: " + component.getUniqueIdentifier());
-                        ApplicationBuilder.handleGroupInstanceActivatedEvent(appId, component.getUniqueIdentifier(), instanceId);
-                        return true;
-                    }
-
+            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
+                    log.info("sending app activate: " + appId);
+                    ApplicationBuilder.handleApplicationInstanceActivatedEvent(appId, instanceId);
+                    return true;
+                } else if (component instanceof Group) {
+                    //send activation to the parent
+                    log.info("sending group activate: " + component.getUniqueIdentifier());
+                    ApplicationBuilder.handleGroupInstanceActivatedEvent(appId, component.getUniqueIdentifier(), instanceId);
+                    return true;
                 }
+
             }
         } finally {
             ApplicationHolder.releaseWriteLock();

http://git-wip-us.apache.org/repos/asf/stratos/blob/196336cb/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 b365d71..578037d 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
@@ -39,6 +39,7 @@ public class GroupStatusTerminatedProcessor extends GroupStatusProcessor {
     public void setNext(StatusProcessor nextProcessor) {
         this.nextProcessor = (GroupStatusProcessor) nextProcessor;
     }
+
     @Override
     public boolean process(String idOfComponent, String appId,
                            String instanceId) {
@@ -84,24 +85,20 @@ public class GroupStatusTerminatedProcessor extends GroupStatusProcessor {
             groups = component.getAliasToGroupMap();
             clusterData = component.getClusterDataMap();
 
-            if (component.isGroupScalingEnabled()) {
-
-            } else {
-                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 app terminated: " + appId);
-                        ApplicationBuilder.handleApplicationInstanceTerminatedEvent(appId, instanceId);
-                        return true;
-                    } else if (component instanceof Group) {
-                            log.info("sending group terminated : " + component.getUniqueIdentifier());
-                            ApplicationBuilder.handleGroupInstanceTerminatedEvent(appId,
-                                    component.getUniqueIdentifier(), instanceId);
-                            return true;
-                    }
+            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 app terminated: " + appId);
+                    ApplicationBuilder.handleApplicationInstanceTerminatedEvent(appId, instanceId);
+                    return true;
+                } else if (component instanceof Group) {
+                    log.info("sending group terminated : " + component.getUniqueIdentifier());
+                    ApplicationBuilder.handleGroupInstanceTerminatedEvent(appId,
+                            component.getUniqueIdentifier(), instanceId);
+                    return true;
                 }
             }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/196336cb/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 2fe0cd4..c536146 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
@@ -85,28 +85,24 @@ public class GroupStatusTerminatingProcessor extends GroupStatusProcessor {
             groups = component.getAliasToGroupMap();
             clusterData = component.getClusterDataMap();
 
-            if (component.isGroupScalingEnabled()) {
-
-            } else {
-                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
-                    if (component instanceof Application) {
-                        log.info("sending app 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] " +
-                                    component.getUniqueIdentifier() + " and for [instance] "
-                                    + instanceId);
-                            ApplicationBuilder.handleGroupTerminatingEvent(appId,
-                                    component.getUniqueIdentifier(), instanceId);
-                            return true;
-                    }
+            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
+                if (component instanceof Application) {
+                    log.info("sending app 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] " +
+                            component.getUniqueIdentifier() + " and for [instance] "
+                            + instanceId);
+                    ApplicationBuilder.handleGroupTerminatingEvent(appId,
+                            component.getUniqueIdentifier(), instanceId);
+                    return true;
                 }
             }
         } finally {

http://git-wip-us.apache.org/repos/asf/stratos/blob/196336cb/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/applications/ApplicationInstanceTerminatedEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/applications/ApplicationInstanceTerminatedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/applications/ApplicationInstanceTerminatedEvent.java
index 1d05ba3..25def05 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/applications/ApplicationInstanceTerminatedEvent.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/applications/ApplicationInstanceTerminatedEvent.java
@@ -31,18 +31,17 @@ public class ApplicationInstanceTerminatedEvent extends Event implements Seriali
     private static final long serialVersionUID = 2625412714611885089L;
 
     private String appId;
-    private Set<ClusterDataHolder> clusterData;
-
-    public ApplicationInstanceTerminatedEvent(String appId, Set<ClusterDataHolder> clusterData) {
+    private String instanceId;
+    public ApplicationInstanceTerminatedEvent(String appId, String instanceId) {
         this.appId = appId;
-        this.clusterData = clusterData;
+        this.instanceId = instanceId;
     }
 
     public String getAppId() {
         return appId;
     }
 
-    public Set<ClusterDataHolder> getClusterData() {
-        return clusterData;
+    public String getInstanceId() {
+        return instanceId;
     }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/196336cb/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationInstanceCreatedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationInstanceCreatedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationInstanceCreatedMessageProcessor.java
index e92d581..fe6a3f9 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationInstanceCreatedMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationInstanceCreatedMessageProcessor.java
@@ -95,7 +95,8 @@ public class ApplicationInstanceCreatedMessageProcessor extends MessageProcessor
         }
 
         // check if an Application instance with same name exists in applications instance
-        if (null != applications.getApplication(event.getApplicationId()).getInstanceByNetworkPartitionId(applicationInstance.getNetworkPartitionId())) {
+        if (null != applications.getApplication(event.getApplicationId()).
+                    getInstanceByNetworkPartitionId(applicationInstance.getNetworkPartitionId())) {
 
             log.warn("Application instance with id [ " + applicationInstance.getInstanceId() + " ] already exists");
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/196336cb/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationInstanceTerminatedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationInstanceTerminatedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationInstanceTerminatedMessageProcessor.java
index c7a39b5..ebba54b 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationInstanceTerminatedMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationInstanceTerminatedMessageProcessor.java
@@ -20,7 +20,9 @@ package org.apache.stratos.messaging.message.processor.applications;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.messaging.domain.applications.ApplicationStatus;
 import org.apache.stratos.messaging.domain.applications.Applications;
+import org.apache.stratos.messaging.domain.instance.ApplicationInstance;
 import org.apache.stratos.messaging.event.applications.ApplicationInstanceTerminatedEvent;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
 import org.apache.stratos.messaging.message.processor.applications.updater.ApplicationsUpdater;
@@ -85,9 +87,16 @@ public class ApplicationInstanceTerminatedMessageProcessor extends MessageProces
 
         // check if an Application with same name exists in applications
         String appId = event.getAppId();
+        String instanceId = event.getInstanceId();
         if (applications.applicationExists(appId)) {
             log.warn("Application with id [ " + appId + " ] still exists in Applications, removing it");
-            applications.removeApplication(appId);
+            ApplicationInstance instance = applications.getApplication(appId).
+                                                getInstanceContexts(instanceId);
+            if(instance == null) {
+                log.info("Application [Instance] " + instanceId + " has already been removed");
+            }
+            instance.setStatus(ApplicationStatus.Terminated);
+            applications.getApplication(appId).removeInstance(instanceId);
         }
 
         notifyEventListeners(event);

http://git-wip-us.apache.org/repos/asf/stratos/blob/196336cb/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterInstanceTerminatedProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterInstanceTerminatedProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterInstanceTerminatedProcessor.java
index 6f6d335..4e43f35 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterInstanceTerminatedProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterInstanceTerminatedProcessor.java
@@ -116,6 +116,7 @@ public class ClusterInstanceTerminatedProcessor extends MessageProcessor {
             if (log.isDebugEnabled()) {
                 log.debug(String.format("Cluster not exists in service: [service] %s [cluster] %s", event.getServiceName(),
                         event.getClusterId()));
+                return false;
             }
         } else {
             // Apply changes to the topology
@@ -124,12 +125,14 @@ public class ClusterInstanceTerminatedProcessor extends MessageProcessor {
                 log.warn("Cluster Instance Context is not found for [cluster] " +
                         event.getClusterId() + " [instance-id] " +
                         event.getInstanceId());
+                return false;
             }
             ClusterStatus status = ClusterStatus.Terminated;
             if (!context.isStateTransitionValid(status)) {
                 log.error("Invalid State Transition from " + context.getStatus() + " to " + status);
             }
             context.setStatus(status);
+            cluster.removeInstanceContext(event.getInstanceId());
 
         }