Repository: stratos Updated Branches: refs/heads/stratos-4.1.x b5d1020da -> 70eaa362d
improving force undeployment Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/45228ba3 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/45228ba3 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/45228ba3 Branch: refs/heads/stratos-4.1.x Commit: 45228ba3739e53f9cddcbf1b8484b98192bb5ce9 Parents: 21e6c20 Author: reka <[email protected]> Authored: Wed Sep 16 10:48:04 2015 +0530 Committer: reka <[email protected]> Committed: Wed Sep 16 10:49:03 2015 +0530 ---------------------------------------------------------------------- .../stratos/autoscaler/monitor/Monitor.java | 3 +- .../monitor/component/ApplicationMonitor.java | 45 ++--- .../monitor/component/GroupMonitor.java | 69 +++---- .../component/ParentComponentMonitor.java | 4 + .../services/impl/AutoscalerServiceImpl.java | 183 +++++++++++-------- .../stratos/autoscaler/util/AutoscalerUtil.java | 38 ++++ .../activemq-data/testBroker/KahaDB/db-1.log | Bin 0 -> 33030144 bytes .../activemq-data/testBroker/KahaDB/db.data | Bin 0 -> 49152 bytes .../activemq-data/testBroker/KahaDB/db.redo | Bin 0 -> 49240 bytes .../application/ApplicationUpdateTest.java | 7 +- 10 files changed, 209 insertions(+), 140 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java index 170d99f..c58ec41 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java @@ -22,6 +22,7 @@ import org.apache.stratos.autoscaler.monitor.component.ParentComponentMonitor; import org.apache.stratos.messaging.domain.instance.Instance; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; /** * Abstract class for the monitoring functionality in Autoscaler. @@ -38,7 +39,7 @@ public abstract class Monitor implements EventHandler, Runnable { //monitors map, key=InstanceId and value=ClusterInstance/GroupInstance/ApplicationInstance protected Map<String, Instance> instanceIdToInstanceMap; public Monitor() { - this.instanceIdToInstanceMap = new HashMap<String, Instance>(); + this.instanceIdToInstanceMap = new ConcurrentHashMap<String, Instance>(); } /** http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/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 70ee9d4..e15b795 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 @@ -445,30 +445,33 @@ public class ApplicationMonitor extends ParentComponentMonitor { removeInstanceFromFromInactiveMap(childId, instanceId); removeInstanceFromFromTerminatingMap(childId, instanceId); - ApplicationInstance instance = (ApplicationInstance) instanceIdToInstanceMap.get(instanceId); - if (instance != null) { - if (isTerminating() || instance.getStatus() == ApplicationStatus.Terminating || - instance.getStatus() == ApplicationStatus.Terminated) { - ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(id, - appId, instanceId); - } else { - Monitor monitor = getMonitor(childId); - boolean active = false; - if (monitor instanceof GroupMonitor) { - //Checking whether the Group is still active in case the faulty member - // identified after scaling up - active = verifyGroupStatus(childId, instanceId, GroupStatus.Active); - } - if (!active) { - onChildTerminatedEvent(childId, instanceId); + //If application is forcefully un-deployed, no need to handle here. + if(!force) { + ApplicationInstance instance = (ApplicationInstance) instanceIdToInstanceMap.get(instanceId); + if (instance != null) { + if (isTerminating() || instance.getStatus() == ApplicationStatus.Terminating || + instance.getStatus() == ApplicationStatus.Terminated) { + ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(id, + appId, instanceId); } else { - log.info("[Group Instance] " + instanceId + " is still active " + - "upon termination of the [child ] " + childId); + Monitor monitor = getMonitor(childId); + boolean active = false; + if (monitor instanceof GroupMonitor) { + //Checking whether the Group is still active in case the faulty member + // identified after scaling up + active = verifyGroupStatus(childId, instanceId, GroupStatus.Active); + } + if (!active) { + onChildTerminatedEvent(childId, instanceId); + } else { + log.info("[Group Instance] " + instanceId + " is still active " + + "upon termination of the [child ] " + childId); + } } + } else { + log.warn("The required instance cannot be found in the the [GroupMonitor] " + + id); } - } else { - log.warn("The required instance cannot be found in the the [GroupMonitor] " + - id); } } } http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/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 bc3052a..3136ed0 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 @@ -504,43 +504,48 @@ public class GroupMonitor extends ParentComponentMonitor { removeInstanceFromFromInactiveMap(childId, instanceId); removeInstanceFromFromTerminatingMap(childId, instanceId); - GroupInstance instance = (GroupInstance) instanceIdToInstanceMap.get(instanceId); - if (instance != null) { - // If this parent instance is terminating, then based on child notification, - // it has to decide its state rather than starting a the children recovery - - ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance(). - getAppMonitor(appId); - //In case if the group instance is not in terminating while application is - // terminating, changing the status to terminating - if (applicationMonitor.isTerminating() && instance.getStatus().getCode() < 3) { - //Sending group instance terminating event - ApplicationBuilder.handleGroupTerminatingEvent(appId, id, instanceId); - } + // If this parent instance is terminating, then based on child notification, + // it has to decide its state rather than starting a the children recovery + + ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance(). + getAppMonitor(appId); + //If application is forcefully un-deployed, no need to handle here. + if(!applicationMonitor.isForce()) { + GroupInstance instance = (GroupInstance) instanceIdToInstanceMap.get(instanceId); + if (instance != null) { + + //In case if the group instance is not in terminating while application is + // terminating, changing the status to terminating + if (applicationMonitor.isTerminating() && instance.getStatus().getCode() < 3) { + //Sending group instance terminating event + ApplicationBuilder.handleGroupTerminatingEvent(appId, id, instanceId); + } - if (instance.getStatus() == GroupStatus.Terminating || - instance.getStatus() == GroupStatus.Terminated) { - ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(id, - appId, instanceId); - } else { - //Checking whether the child who notified is still active. - // If it is active(scale down case), no need to act upon it. - // Otherwise act upon Termination and see whether it is required to start - // instance again based on termination behavior - boolean active = verifyGroupStatus(childId, instanceId, GroupStatus.Active); - if (!active) { - onChildTerminatedEvent(childId, instanceId); + if (instance.getStatus() == GroupStatus.Terminating || + instance.getStatus() == GroupStatus.Terminated) { + ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(id, + appId, instanceId); } else { - log.info("[Group Instance] " + instanceId + " for [application] " + appId + - " is still active upon termination" + - " of the [child] " + childId); + //Checking whether the child who notified is still active. + // If it is active(scale down case), no need to act upon it. + // Otherwise act upon Termination and see whether it is required to start + // instance again based on termination behavior + boolean active = verifyGroupStatus(childId, instanceId, GroupStatus.Active); + if (!active) { + onChildTerminatedEvent(childId, instanceId); + } else { + log.info("[Group Instance] " + instanceId + " for [application] " + appId + + " is still active upon termination" + + " of the [child] " + childId); + } } + } else { + log.warn("The required [instance] " + instanceId + " for [application] " + appId + + " cannot be found in the the [GroupMonitor] " + + id + " upon termination of the [child] " + childId); } - } else { - log.warn("The required [instance] " + instanceId + " for [application] " + appId + - " cannot be found in the the [GroupMonitor] " + - id + " upon termination of the [child] " + childId); } + } http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/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 98e97cf..f05827a 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 @@ -1062,4 +1062,8 @@ public abstract class ParentComponentMonitor extends Monitor { return stringBuilder.toString(); } } + + public void removeMonitor(String id) { + this.aliasToActiveChildMonitorsMap.remove(id); + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java index d9023f7..605367f 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/services/impl/AutoscalerServiceImpl.java @@ -41,8 +41,10 @@ import org.apache.stratos.autoscaler.exception.application.InvalidApplicationPol import org.apache.stratos.autoscaler.exception.application.InvalidServiceGroupException; import org.apache.stratos.autoscaler.exception.application.UnremovableApplicationException; import org.apache.stratos.autoscaler.exception.policy.*; +import org.apache.stratos.autoscaler.monitor.Monitor; import org.apache.stratos.autoscaler.monitor.cluster.ClusterMonitor; import org.apache.stratos.autoscaler.monitor.component.ApplicationMonitor; +import org.apache.stratos.autoscaler.monitor.component.GroupMonitor; import org.apache.stratos.autoscaler.pojo.Dependencies; import org.apache.stratos.autoscaler.pojo.ServiceGroup; import org.apache.stratos.autoscaler.pojo.policy.PolicyManager; @@ -70,6 +72,7 @@ import org.apache.stratos.manager.service.stub.domain.application.signup.Artifac import org.apache.stratos.messaging.domain.application.Application; import org.apache.stratos.messaging.domain.application.ClusterDataHolder; import org.apache.stratos.messaging.domain.instance.ClusterInstance; +import org.apache.stratos.messaging.domain.instance.Instance; import org.apache.stratos.messaging.domain.topology.Cluster; import org.apache.stratos.messaging.domain.topology.Member; import org.apache.stratos.messaging.message.receiver.topology.TopologyManager; @@ -251,8 +254,7 @@ public class AutoscalerServiceImpl implements AutoscalerService { application = ApplicationHolder.getApplications().getApplication(applicationId); application.setApplicationPolicyId(applicationPolicyId); ApplicationHolder.persistApplication(application); - } - finally { + } finally { ApplicationHolder.releaseWriteLock(); } @@ -277,8 +279,7 @@ public class AutoscalerServiceImpl implements AutoscalerService { applicationId); return true; - } - catch (Exception e) { + } catch (Exception e) { ApplicationContext applicationContext = RegistryManager.getInstance(). getApplicationContext(applicationId); if (applicationContext != null) { @@ -359,8 +360,7 @@ public class AutoscalerServiceImpl implements AutoscalerService { applicationContext.getApplicationId())); } } - } - catch (Exception e) { + } catch (Exception e) { String message = "Could not add application signup: [application-id]" + applicationContext.getApplicationId(); log.error(message, e); @@ -410,8 +410,7 @@ public class AutoscalerServiceImpl implements AutoscalerService { } } - } - catch (Exception e) { + } catch (Exception e) { String message = "Could not remove application signup(s)"; log.error(message, e); throw new RuntimeException(message, e); @@ -481,10 +480,10 @@ public class AutoscalerServiceImpl implements AutoscalerService { return false; } - boolean applicationSignUpExists =false; + boolean applicationSignUpExists = false; ApplicationContext applicationContext = RegistryManager.getInstance().getApplicationContext(applicationId); - if(applicationContext.isMultiTenant()){ + if (applicationContext.isMultiTenant()) { StratosManagerServiceClient serviceClient = StratosManagerServiceClient.getInstance(); ApplicationSignUp applicationSignUps[] = serviceClient.getApplicationSignUps(applicationId); @@ -564,8 +563,7 @@ public class AutoscalerServiceImpl implements AutoscalerService { if (log.isInfoEnabled()) { log.info("Application undeployment process started: [application-id] " + applicationId); } - } - catch (Exception e) { + } catch (Exception e) { String message = "Could not start application undeployment process: [application-id] " + applicationId; log.error(message, e); throw new RuntimeException(message, e); @@ -600,8 +598,7 @@ public class AutoscalerServiceImpl implements AutoscalerService { ApplicationBuilder.handleApplicationRemoval(applicationId); log.info(String.format("Application deleted successfully: [application-id] %s", applicationId)); - } - catch (Exception e) { + } catch (Exception e) { String message = String.format("Could not delete application: [application-id] %s", applicationId); log.error(message, e); throw new RuntimeException(message, e); @@ -745,8 +742,7 @@ public class AutoscalerServiceImpl implements AutoscalerService { try { RegistryManager.getInstance().updateServiceGroup(cartridgeGroup); - } - catch (org.wso2.carbon.registry.core.exceptions.RegistryException e) { + } catch (org.wso2.carbon.registry.core.exceptions.RegistryException e) { String message = (String.format("Cannot update cartridge group: [group-name] %s", cartridgeGroup.getName())); throw new RuntimeException(message, e); @@ -777,8 +773,7 @@ public class AutoscalerServiceImpl implements AutoscalerService { } throw new CartridgeGroupNotFoundException(msg); } - } - catch (org.wso2.carbon.registry.core.exceptions.RegistryException e) { + } catch (org.wso2.carbon.registry.core.exceptions.RegistryException e) { String message = "Could not remove cartridge group: " + groupName; log.error(message, e); throw new RuntimeException(message, e); @@ -792,8 +787,7 @@ public class AutoscalerServiceImpl implements AutoscalerService { } try { return RegistryManager.getInstance().getServiceGroup(name); - } - catch (Exception e) { + } catch (Exception e) { throw new AutoScalerException("Error occurred while retrieving cartridge group", e); } } @@ -811,13 +805,11 @@ public class AutoscalerServiceImpl implements AutoscalerService { } } return null; - } - catch (Exception e) { + } catch (Exception e) { String message = String.format("Could not find cluster id: [application-id] %s [alias] %s", applicationId, alias); throw new AutoScalerException(message, e); - } - finally { + } finally { ApplicationHolder.releaseReadLock(); } } @@ -833,8 +825,7 @@ public class AutoscalerServiceImpl implements AutoscalerService { public boolean undeployServiceGroup(String name) throws AutoScalerException { try { RegistryManager.getInstance().removeServiceGroup(name); - } - catch (RegistryException e) { + } catch (RegistryException e) { throw new AutoScalerException("Error occurred while removing the cartridge groups", e); } return true; @@ -950,66 +941,102 @@ public class AutoscalerServiceImpl implements AutoscalerService { "[application-id] %s", applicationId)); return; } - } - finally { + } finally { ApplicationHolder.releaseReadLock(); } - Set<ClusterDataHolder> allClusters = application.getClusterDataRecursively(); - for (ClusterDataHolder clusterDataHolder : allClusters) { - String serviceType = clusterDataHolder.getServiceType(); - String clusterId = clusterDataHolder.getClusterId(); + //Stopping the application monitor thread + ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance(). + getAppMonitor(applicationId); + if (applicationMonitor != null) { + applicationMonitor.destroy(); - Cluster cluster; - try { - TopologyManager.acquireReadLockForCluster(serviceType, clusterId); - cluster = TopologyManager.getTopology().getService(serviceType).getCluster(clusterId); - } - finally { - TopologyManager.releaseReadLockForCluster(serviceType, clusterId); - } + if (applicationMonitor.hasInstance()) { + Map<String, Monitor> monitors = applicationMonitor. + getAliasToActiveChildMonitorsMap(); + AutoscalerUtil.handleForceTermination(monitors.values(), + applicationMonitor, applicationId); - //If there are no members in cluster Instance, send cluster Terminated Event - //Stopping the cluster monitor thread - ClusterMonitor clusterMonitor = AutoscalerContext.getInstance(). - getClusterMonitor(clusterId); - if (clusterMonitor != null) { - clusterMonitor.destroy(); - } else { - if (log.isDebugEnabled()) { - log.debug(String.format("Cluster monitor cannot be found for [application] %s " + - "[cluster] %s", applicationId, clusterId)); - } - } - if (cluster != null) { - Collection<ClusterInstance> allClusterInstances = cluster.getClusterInstances(); - for (ClusterInstance clusterInstance : allClusterInstances) { - ClusterStatusEventPublisher.sendClusterTerminatedEvent(applicationId, cluster.getServiceName(), - clusterId, clusterInstance.getInstanceId()); + Collection<Instance> applicationInstances = applicationMonitor.getInstances(); + for (Instance instance : applicationInstances) { + ApplicationBuilder.handleApplicationInstanceTerminatedEvent(applicationId, + instance.getInstanceId()); } - List<String> memberListToTerminate = new LinkedList<String>(); - for (Member member : cluster.getMembers()) { - memberListToTerminate.add(member.getMemberId()); - } + Set<ClusterDataHolder> allClusters = application.getClusterDataRecursively(); + for (ClusterDataHolder clusterDataHolder : allClusters) { + String serviceType = clusterDataHolder.getServiceType(); + String clusterId = clusterDataHolder.getClusterId(); - for (String memberIdToTerminate : memberListToTerminate) { + Cluster cluster; try { - log.info(String.format( - "Terminating member forcefully [member-id] %s of the cluster [cluster-id] %s " + - "[application-id] %s", memberIdToTerminate, clusterId, application)); - AutoscalerCloudControllerClient.getInstance().terminateInstanceForcefully(memberIdToTerminate); + TopologyManager.acquireReadLockForCluster(serviceType, clusterId); + cluster = TopologyManager.getTopology().getService(serviceType).getCluster(clusterId); + } finally { + TopologyManager.releaseReadLockForCluster(serviceType, clusterId); + } + + //If there are no members in cluster Instance, send cluster Terminated Event + //Stopping the cluster monitor thread + ClusterMonitor clusterMonitor = AutoscalerContext.getInstance(). + getClusterMonitor(clusterId); + if (clusterMonitor != null) { + clusterMonitor.destroy(); + } else { + if (log.isDebugEnabled()) { + log.debug(String.format("Cluster monitor cannot be found for [application] %s " + + "[cluster] %s", applicationId, clusterId)); + } } - catch (Exception e) { - log.error( - String.format("Forceful termination of member %s has failed, but continuing forceful " + - "deletion of other members", memberIdToTerminate)); + if (cluster != null) { + Collection<ClusterInstance> allClusterInstances = cluster.getClusterInstances(); + + if (allClusterInstances.isEmpty() && clusterMonitor != null) { + AutoscalerContext.getInstance().removeClusterMonitor(clusterId); + } + + List<String> memberListToTerminate = new LinkedList<String>(); + for (Member member : cluster.getMembers()) { + memberListToTerminate.add(member.getMemberId()); + } + + for (String memberIdToTerminate : memberListToTerminate) { + try { + log.info(String.format( + "Terminating member forcefully [member-id] %s of the cluster [cluster-id] %s " + + "[application-id] %s", memberIdToTerminate, clusterId, application)); + AutoscalerCloudControllerClient.getInstance().terminateInstanceForcefully(memberIdToTerminate); + } catch (Exception e) { + log.error( + String.format("Forceful termination of member %s has failed, but continuing forceful " + + "deletion of other members", memberIdToTerminate)); + } + } } + } - } + } else { + //There is no application instances. Need to directly un-deploy the application + // stopping application thread + ApplicationContext applicationContext = AutoscalerContext.getInstance(). + getApplicationContext(applicationId); + applicationMonitor.destroy(); + AutoscalerContext.getInstance().removeAppMonitor(applicationId); + // Remove network partition algorithm context + AutoscalerContext.getInstance().removeNetworkPartitionAlgorithmContext(applicationId); + // update application status in application context + applicationContext.setStatus(ApplicationContext.STATUS_CREATED); + AutoscalerContext.getInstance().updateApplicationContext(applicationContext); + RegistryManager.getInstance().persistApplicationContext(applicationContext); + log.info("Application un-deployed successfully: [application-id] " + applicationId); + } } + + + + } @@ -1137,7 +1164,7 @@ public class AutoscalerServiceImpl implements AutoscalerService { PartitionRef[] partitions = networkPartitionRef.getPartitionRefs(); if (null == partitions || partitions.length == 0) { String msg = String.format("Network partition does not have any partition references: " - + "[deployment-policy-id] %s [network-partition-id] %s", deploymentPolicyId, + + "[deployment-policy-id] %s [network-partition-id] %s", deploymentPolicyId, networkPartitionId); log.error(msg); throw new InvalidDeploymentPolicyException(msg); @@ -1190,23 +1217,20 @@ public class AutoscalerServiceImpl implements AutoscalerService { addNewPartitionsToClusterMonitor(clusterLevelNetworkPartitionContext, networkPartition, deploymentPolicy.getDeploymentPolicyID(), clusterMonitor.getClusterContext().getServiceId()); - } - catch (RemoteException e) { + } catch (RemoteException e) { String message = "Connection to cloud controller failed, Cluster monitor update failed for" + " [deployment-policy] " + deploymentPolicy.getDeploymentPolicyID(); log.error(message); throw new CloudControllerConnectionException(message, e); - } - catch (CloudControllerServiceInvalidPartitionExceptionException e) { + } catch (CloudControllerServiceInvalidPartitionExceptionException e) { String message = "Invalid partition, Cluster monitor update failed for [deployment-policy] " + deploymentPolicy.getDeploymentPolicyID(); log.error(message); throw new InvalidDeploymentPolicyException(message, e); - } - catch (CloudControllerServiceInvalidCartridgeTypeExceptionException e) { + } catch (CloudControllerServiceInvalidCartridgeTypeExceptionException e) { String message = "Invalid cartridge type, Cluster monitor update failed for [deployment-policy] " @@ -1325,8 +1349,7 @@ public class AutoscalerServiceImpl implements AutoscalerService { try { Collection<DeploymentPolicy> deploymentPolicies = PolicyManager.getInstance().getDeploymentPolicies(); return deploymentPolicies.toArray(new DeploymentPolicy[deploymentPolicies.size()]); - } - catch (Exception e) { + } catch (Exception e) { String message = "Could not get deployment policies"; log.error(message); throw new AutoScalerException(message, e); http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java index 3d80094..a639673 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java @@ -31,10 +31,12 @@ import org.apache.stratos.autoscaler.applications.pojo.ApplicationContext; import org.apache.stratos.autoscaler.applications.pojo.CartridgeContext; import org.apache.stratos.autoscaler.applications.pojo.ComponentContext; import org.apache.stratos.autoscaler.applications.pojo.GroupContext; +import org.apache.stratos.autoscaler.applications.topic.ApplicationBuilder; import org.apache.stratos.autoscaler.context.AutoscalerContext; import org.apache.stratos.autoscaler.context.InstanceContext; import org.apache.stratos.autoscaler.context.cluster.ClusterInstanceContext; import org.apache.stratos.autoscaler.context.partition.network.NetworkPartitionContext; +import org.apache.stratos.autoscaler.event.publisher.ClusterStatusEventPublisher; import org.apache.stratos.autoscaler.exception.AutoScalerException; import org.apache.stratos.autoscaler.exception.application.*; import org.apache.stratos.autoscaler.exception.policy.ApplicatioinPolicyNotExistsException; @@ -44,10 +46,12 @@ import org.apache.stratos.autoscaler.monitor.MonitorFactory; import org.apache.stratos.autoscaler.monitor.cluster.ClusterMonitor; import org.apache.stratos.autoscaler.monitor.component.ApplicationMonitor; import org.apache.stratos.autoscaler.monitor.component.GroupMonitor; +import org.apache.stratos.autoscaler.monitor.component.ParentComponentMonitor; import org.apache.stratos.autoscaler.pojo.policy.PolicyManager; import org.apache.stratos.autoscaler.pojo.policy.deployment.ApplicationPolicy; import org.apache.stratos.autoscaler.pojo.policy.deployment.DeploymentPolicy; import org.apache.stratos.autoscaler.registry.RegistryManager; +import org.apache.stratos.cloud.controller.stub.domain.MemberContext; import org.apache.stratos.common.Properties; import org.apache.stratos.common.Property; import org.apache.stratos.common.client.CloudControllerServiceClient; @@ -57,6 +61,7 @@ import org.apache.stratos.messaging.domain.application.Application; import org.apache.stratos.messaging.domain.application.Applications; import org.apache.stratos.messaging.domain.application.ClusterDataHolder; import org.apache.stratos.messaging.domain.application.Group; +import org.apache.stratos.messaging.domain.instance.Instance; import org.apache.stratos.messaging.domain.topology.Service; import org.apache.stratos.messaging.domain.topology.Topology; import org.apache.stratos.messaging.message.receiver.topology.TopologyManager; @@ -1017,4 +1022,37 @@ public class AutoscalerUtil { } } + + public static void handleForceTermination(Collection<Monitor> monitors, Monitor parentMonitor, String applicationId) { + Iterator<Monitor> monitorsIter = monitors.iterator(); + while(monitorsIter.hasNext()) { + Monitor monitor = monitorsIter.next(); + monitor.destroy(); + Iterator<Instance> instances = monitor.getInstances().iterator(); + while(instances.hasNext()) { + Instance instance = instances.next(); + if (monitor instanceof GroupMonitor) { + ApplicationBuilder.handleGroupInstanceTerminatedEvent(applicationId, + monitor.getId(), instance.getInstanceId()); + } else { + ClusterStatusEventPublisher.sendClusterTerminatedEvent(applicationId, + ((ClusterMonitor) monitor).getServiceId(), monitor.getId(), instance.getInstanceId()); + } + } + if(monitor instanceof ParentComponentMonitor) { + ParentComponentMonitor pMonitor = (ParentComponentMonitor)parentMonitor; + if (!monitor.hasInstance()) { + (pMonitor).removeMonitor(monitor.getId()); + } + Collection<Monitor> childMonitors = pMonitor. + getAliasToActiveChildMonitorsMap().values(); + if(!childMonitors.isEmpty()) { + handleForceTermination(childMonitors, monitor, applicationId); + } + } + + } + + } + } http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db-1.log ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db-1.log b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db-1.log new file mode 100644 index 0000000..f63147c Binary files /dev/null and b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db-1.log differ http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.data ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.data b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.data new file mode 100644 index 0000000..e3832b7 Binary files /dev/null and b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.data differ http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.redo ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.redo b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.redo new file mode 100644 index 0000000..b03cc50 Binary files /dev/null and b/components/org.apache.stratos.messaging/activemq-data/testBroker/KahaDB/db.redo differ http://git-wip-us.apache.org/repos/asf/stratos/blob/45228ba3/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java ---------------------------------------------------------------------- diff --git a/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java b/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java index 7148660..a7c1a89 100644 --- a/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java +++ b/products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java @@ -24,16 +24,11 @@ import org.apache.commons.logging.LogFactory; import org.apache.stratos.common.beans.application.ApplicationBean; import org.apache.stratos.common.beans.cartridge.CartridgeGroupBean; import org.apache.stratos.common.beans.policy.deployment.ApplicationPolicyBean; -<<<<<<< HEAD:products/stratos/modules/integration/test-integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java import org.apache.stratos.integration.common.RestConstants; import org.apache.stratos.integration.common.TopologyHandler; import org.apache.stratos.integration.tests.StratosIntegrationTest; -======= -import org.apache.stratos.integration.tests.RestConstants; -import org.apache.stratos.integration.tests.StratosTestServerManager; -import org.apache.stratos.integration.tests.TopologyHandler; +import org.apache.stratos.integration.common.TopologyHandler; import org.apache.stratos.messaging.domain.application.Application; ->>>>>>> Support application update in the Applications Topology:products/stratos/modules/integration/src/test/java/org/apache/stratos/integration/tests/application/ApplicationUpdateTest.java import org.apache.stratos.messaging.domain.application.ApplicationStatus; import org.apache.stratos.messaging.domain.application.ClusterDataHolder; import org.apache.stratos.messaging.domain.application.Group;
