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;
+ }
+
}