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/22 15:22:25 UTC

stratos git commit: fixing issue when handling graceful termination

Repository: stratos
Updated Branches:
  refs/heads/master 17dfb7c78 -> 7d5f0bb38


fixing issue when handling graceful termination


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

Branch: refs/heads/master
Commit: 7d5f0bb38d6729637c0ff7392a375acdf1d138c1
Parents: 17dfb7c
Author: reka <rt...@gmail.com>
Authored: Mon Dec 22 19:52:11 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Mon Dec 22 19:52:11 2014 +0530

----------------------------------------------------------------------
 .../applications/topic/ApplicationBuilder.java  | 49 +++++++++++++-------
 .../network/NetworkPartitionContext.java        | 18 +++++++
 2 files changed, 49 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/7d5f0bb3/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 0325a02..529f57c 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
@@ -251,7 +251,8 @@ public class ApplicationBuilder {
             appClusterDataToSend = new HashSet<ClusterDataHolder>();
             Set<ClusterDataHolder> appClusterData = application.getClusterDataRecursively();
             for (ClusterDataHolder currClusterData : appClusterData) {
-                ClusterDataHolder newClusterData = new ClusterDataHolder(currClusterData.getServiceType(), currClusterData.getClusterId());
+                ClusterDataHolder newClusterData = new ClusterDataHolder(currClusterData.getServiceType(),
+                        currClusterData.getClusterId());
                 appClusterDataToSend.add(newClusterData);
             }
 
@@ -285,13 +286,26 @@ public class ApplicationBuilder {
                                         instanceId);
                 ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance().
                         getAppMonitor(appId);
-                applicationMonitor.getNetworkPartitionContext(applicationInstance.
-                                                                getNetworkPartitionId()).
-                        removeInstanceContext(instanceId);
+                NetworkPartitionContext networkPartitionContext = applicationMonitor.
+                        getNetworkPartitionContext(applicationInstance.
+                        getNetworkPartitionId());
+                networkPartitionContext.removeInstanceContext(instanceId);
                 applicationMonitor.removeInstance(instanceId);
                 application.removeInstance(instanceId);
+                ApplicationsEventPublisher.sendApplicationInstanceTerminatedEvent(appId, instanceId);
+
                 //removing the monitor
-                if (application.getInstanceContextCount() == 0) {
+                if (application.getInstanceContextCount() == 0 &&
+                        applicationMonitor.isTerminating()) {
+                    //Stopping the child threads
+                    if (applicationMonitor.hasMonitors() && applicationMonitor.isTerminating()) {
+                        for (Monitor monitor1 : applicationMonitor.getAliasToActiveMonitorsMap().values()) {
+                            //destroying the drools
+                            monitor1.destroy();
+                        }
+                    }
+                    //stopping application thread
+                    applicationMonitor.destroy();
                     AutoscalerContext.getInstance().removeAppMonitor(appId);
                     log.info("Application run time is removed: [application-id] " + appId);
                     //Removing the application from memory and registry
@@ -315,12 +329,9 @@ public class ApplicationBuilder {
                     } finally {
                         PrivilegedCarbonContext.endTenantFlow();
                     }
-
-
+                    //removing the clusters and persisted application
+                    handleApplicationRemoval(appId);
                 }
-                ApplicationsEventPublisher.sendApplicationInstanceTerminatedEvent(appId, instanceId);
-                //removing the clusters and persisted application
-                handleApplicationRemoval(appId);
             } else {
                 log.warn(String.format("Application state transition is not valid: [application-id] %s " +
                                 " [current-status] %s [status-requested] %s", appId,
@@ -657,19 +668,21 @@ public class ApplicationBuilder {
                                                  String networkPartitionId, String instanceId) {
         //Updating the Application Monitor
         ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance().getAppMonitor(appId);
+        NetworkPartitionContext context = applicationMonitor.
+                getNetworkPartitionContext(networkPartitionId);
         if (applicationMonitor != null) {
             if(status == ApplicationStatus.Active) {
-                applicationMonitor.getNetworkPartitionContext(networkPartitionId).
-                        movePendingInstanceToActiveInstances(instanceId);
+                context.movePendingInstanceToActiveInstances(instanceId);
             } else if(status == ApplicationStatus.Terminating) {
                 applicationMonitor.setTerminating(true);
-                NetworkPartitionContext context = applicationMonitor.
-                        getNetworkPartitionContext(networkPartitionId);
+
                 if(context.getActiveInstance(instanceId) != null) {
                     context.moveActiveInstanceToTerminationPendingInstances(instanceId);
                 } else if(context.getPendingInstance(instanceId) != null) {
                     context.movePendingInstanceToTerminationPendingInstances(instanceId);
                 }
+            } else if(status == ApplicationStatus.Terminated) {
+                context.removeTerminationPendingInstance(instanceId);
             }
             applicationMonitor.setStatus(status, instanceId);
         } else {
@@ -683,17 +696,17 @@ public class ApplicationBuilder {
                                            String instanceId, String parentInstanceId) {
         GroupMonitor monitor = getGroupMonitor(appId, groupId);
         if (monitor != null) {
+            NetworkPartitionContext context = monitor.getNetworkPartitionContext(networkPartitionId);
             if(status == GroupStatus.Active) {
-                monitor.getNetworkPartitionContext(networkPartitionId).
-                        movePendingInstanceToActiveInstances(instanceId);
+                context.movePendingInstanceToActiveInstances(instanceId);
             } else if(status == GroupStatus.Terminating) {
-                NetworkPartitionContext context = monitor.
-                        getNetworkPartitionContext(networkPartitionId);
                 if(context.getActiveInstance(instanceId) != null) {
                     context.moveActiveInstanceToTerminationPendingInstances(instanceId);
                 } else if(context.getPendingInstance(instanceId) != null) {
                     context.movePendingInstanceToTerminationPendingInstances(instanceId);
                 }
+            } else if(status == GroupStatus.Terminated) {
+                context.removeTerminationPendingInstance(instanceId);
             }
             monitor.setStatus(status, instanceId, parentInstanceId);
         } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/7d5f0bb3/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/NetworkPartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/NetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/NetworkPartitionContext.java
index 4afa075..06d41d4 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/NetworkPartitionContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/NetworkPartitionContext.java
@@ -222,4 +222,22 @@ public abstract class NetworkPartitionContext {
     public void setTerminatingPending(List<InstanceContext> terminatingPending) {
         this.terminatingPending = terminatingPending;
     }
+
+    public boolean removeTerminationPendingInstance(String instanceId) {
+        if (id == null) {
+            return false;
+        }
+        synchronized (pendingInstances) {
+            for (Iterator<InstanceContext> iterator = pendingInstances.iterator(); iterator.hasNext(); ) {
+                InstanceContext pendingInstance = iterator.next();
+                if (id.equals(pendingInstance.getId())) {
+                    iterator.remove();
+                    return true;
+                }
+
+            }
+        }
+        return false;
+    }
+
 }