Repository: stratos Updated Branches: refs/heads/master 412d5c8da -> b59adf8f9
fixing instance id handling in processor and improving monitor startup to check whether clusters are there Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/95dd1542 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/95dd1542 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/95dd1542 Branch: refs/heads/master Commit: 95dd15426542dfc114afc39c87f26542e6311808 Parents: 563fd43 Author: reka <[email protected]> Authored: Wed Dec 3 17:53:24 2014 +0530 Committer: reka <[email protected]> Committed: Wed Dec 3 17:53:35 2014 +0530 ---------------------------------------------------------------------- .../autoscaler/api/AutoScalerServiceImpl.java | 1 + .../autoscaler/context/AutoscalerContext.java | 2 ++ .../ClusterLevelNetworkPartitionContext.java | 7 +++- .../monitor/cluster/VMClusterMonitor.java | 4 ++- .../monitor/component/ApplicationMonitor.java | 31 ++++++++---------- .../monitor/component/GroupMonitor.java | 34 ++++++-------------- .../ClusterStatusTerminatedProcessor.java | 19 ++++++----- 7 files changed, 47 insertions(+), 51 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/95dd1542/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java index 8270ab0..5fc9a3a 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java @@ -123,6 +123,7 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface { Application application = ApplicationHolder.getApplications(). getApplication(deploymentPolicy.getApplicationId()); if(application != null) { + allClusterInitialized = AutoscalerUtil.allClustersInitialized(application); } } finally { http://git-wip-us.apache.org/repos/asf/stratos/blob/95dd1542/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/AutoscalerContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/AutoscalerContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/AutoscalerContext.java index ca6efb4..51fad05 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/AutoscalerContext.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/AutoscalerContext.java @@ -20,6 +20,7 @@ */ package org.apache.stratos.autoscaler.context; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -44,6 +45,7 @@ public class AutoscalerContext { private AutoscalerContext() { setClusterMonitors(new HashMap<String, AbstractClusterMonitor>()); setApplicationMonitors(new HashMap<String, ApplicationMonitor>()); + pendingApplicationMonitors = new ArrayList<String>(); } public static AutoscalerContext getInstance() { http://git-wip-us.apache.org/repos/asf/stratos/blob/95dd1542/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ClusterLevelNetworkPartitionContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ClusterLevelNetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ClusterLevelNetworkPartitionContext.java index 45dd636..036228d 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ClusterLevelNetworkPartitionContext.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/ClusterLevelNetworkPartitionContext.java @@ -103,10 +103,15 @@ public class ClusterLevelNetworkPartitionContext extends NetworkPartitionContext return instanceIdToClusterInstanceContextMap; } - public void setInstanceIdToClusterInstanceContextMap(Map<String, ClusterInstanceContext> instanceIdToClusterInstanceContextMap) { + public void setInstanceIdToClusterInstanceContextMap( + Map<String, ClusterInstanceContext> instanceIdToClusterInstanceContextMap) { this.instanceIdToClusterInstanceContextMap = instanceIdToClusterInstanceContextMap; } + public boolean containsClusterInstanceContext(String instanceId) { + return this.instanceIdToClusterInstanceContextMap.containsKey(instanceId); + } + public int getMin() { return min; } http://git-wip-us.apache.org/repos/asf/stratos/blob/95dd1542/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 5162d4c..e55377b 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 @@ -34,6 +34,7 @@ import org.apache.stratos.autoscaler.monitor.events.MonitorScalingEvent; import org.apache.stratos.autoscaler.monitor.events.MonitorStatusEvent; import org.apache.stratos.autoscaler.monitor.events.builder.MonitorStatusEventBuilder; import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator; +import org.apache.stratos.autoscaler.status.processor.cluster.ClusterStatusTerminatedProcessor; import org.apache.stratos.autoscaler.util.StatusChecker; import org.apache.stratos.autoscaler.status.processor.cluster.ClusterStatusActiveProcessor; import org.apache.stratos.autoscaler.status.processor.cluster.ClusterStatusInActiveProcessor; @@ -916,7 +917,8 @@ public class VMClusterMonitor extends AbstractClusterMonitor { + "[member] %s", memberId)); } //Checking whether the cluster state can be changed either from in_active to created/terminating to terminated - StatusChecker.getInstance().onMemberTermination(clusterId, instanceId); + ServiceReferenceHolder.getInstance().getClusterStatusProcessorChain().process( + ClusterStatusTerminatedProcessor.class.getName(), clusterId, instanceId); } @Override http://git-wip-us.apache.org/repos/asf/stratos/blob/95dd1542/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 e174560..ca70ba5 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 @@ -36,10 +36,12 @@ import org.apache.stratos.autoscaler.monitor.events.builder.MonitorStatusEventBu import org.apache.stratos.autoscaler.pojo.policy.PolicyManager; import org.apache.stratos.autoscaler.pojo.policy.deployment.DeploymentPolicy; import org.apache.stratos.autoscaler.pojo.policy.deployment.partition.network.ApplicationLevelNetworkPartition; +import org.apache.stratos.autoscaler.util.ServiceReferenceHolder; import org.apache.stratos.messaging.domain.applications.Application; import org.apache.stratos.messaging.domain.applications.ApplicationStatus; import org.apache.stratos.messaging.domain.applications.GroupStatus; import org.apache.stratos.messaging.domain.instance.ApplicationInstance; +import org.apache.stratos.messaging.domain.instance.GroupInstance; import org.apache.stratos.messaging.domain.topology.ClusterStatus; import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState; @@ -137,18 +139,6 @@ public class ApplicationMonitor extends ParentComponentMonitor { //mark the child monitor as inActive in the map this.markMonitorAsTerminating(id); - } else if (status1 == ClusterStatus.Created || status1 == GroupStatus.Created) { - if (this.terminatingMonitorsList.contains(id)) { - this.terminatingMonitorsList.remove(id); - this.aliasToActiveMonitorsMap.remove(id); - } - //TODO - /*if (this.status == ApplicationStatus.Terminating) { - StatusChecker.getInstance().onChildStatusChange(id, this.id, this.appId); - } else { - onChildTerminatedEvent(id); - }*/ - } else if (status1 == ClusterStatus.Terminated || status1 == GroupStatus.Terminated) { //Check whether all dependent goes Terminated and then start them in parallel. if (this.terminatingMonitorsList.contains(id)) { @@ -157,11 +147,18 @@ public class ApplicationMonitor extends ParentComponentMonitor { } else { log.warn("[monitor] " + id + " cannot be found in the inActive monitors list"); } - //TODO - /*if (this.status == ApplicationStatus.Terminating || this.status == ApplicationStatus.Terminated) { - StatusChecker.getInstance().onChildStatusChange(id, this.id, this.appId); - log.info("Executing the un-subscription request for the [monitor] " + id); - }*/ + ApplicationInstance instance = (ApplicationInstance)instanceIdToInstanceMap.get(instanceId); + if (instance != null) { + if(instance.getStatus() == ApplicationStatus.Terminating) { + ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(this.id, + appId, instanceId); + } else { + onChildTerminatedEvent(id, instanceId); + } + } else { + log.warn("The required instance cannot be found in the the [GroupMonitor] " + + this.id); + } } } http://git-wip-us.apache.org/repos/asf/stratos/blob/95dd1542/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 63d0295..2334916 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 @@ -181,14 +181,6 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable { this.markMonitorAsInactive(instanceId); onChildInactiveEvent(id, instanceId); - } else if (status1 == ClusterStatus.Created || status1 == GroupStatus.Created) { - if (this.terminatingMonitorsList.contains(instanceId)) { - this.terminatingMonitorsList.remove(instanceId); - this.aliasToActiveMonitorsMap.remove(instanceId); - if (AutoscalerContext.getInstance().getClusterMonitors().containsKey(id)) { - AutoscalerContext.getInstance().removeClusterMonitor(id); - } - } } else if (status1 == ClusterStatus.Terminating || status1 == GroupStatus.Terminating) { //mark the child monitor as inActive in the map this.markMonitorAsTerminating(instanceId); @@ -201,23 +193,17 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable { } else { log.warn("[monitor] " + id + " cannot be found in the inActive monitors list"); } - //If cluster monitor, need to terminate the existing one - ApplicationHolder.releaseReadLock(); - GroupStatus instanceStatus; - try { - Group group = ApplicationHolder.getApplications(). - getApplication(appId).getGroupRecursively(this.id); - instanceStatus = group.getInstanceContexts(instanceId).getStatus(); - - } finally { - ApplicationHolder.releaseReadLock(); - } - - if (instanceStatus == GroupStatus.Terminating) { - ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(this.id, - appId, instanceId); + GroupInstance instance = (GroupInstance)this.instanceIdToInstanceMap.get(instanceId); + if (instance != null) { + if(instance.getStatus() == GroupStatus.Terminating) { + ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(this.id, + appId, instanceId); + } else { + onChildTerminatedEvent(id, instanceId); + } } else { - onChildTerminatedEvent(id, instanceId); + log.warn("The required instance cannot be found in the the [GroupMonitor] " + + this.id); } } } http://git-wip-us.apache.org/repos/asf/stratos/blob/95dd1542/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 00abe34..52b5f36 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 @@ -71,7 +71,7 @@ public class ClusterStatusTerminatedProcessor extends ClusterStatusProcessor { private boolean doProcess(String clusterId, String instanceId) { VMClusterMonitor monitor = (VMClusterMonitor) AutoscalerContext.getInstance(). getClusterMonitor(clusterId); - boolean clusterMonitorHasMembers = clusterMonitorHasMembers(monitor); + boolean clusterMonitorHasMembers = clusterInstanceHasMembers(monitor, instanceId); boolean clusterTerminated = false; try { TopologyManager.acquireReadLockForCluster(monitor.getServiceId(), monitor.getClusterId()); @@ -83,10 +83,11 @@ public class ClusterStatusTerminatedProcessor extends ClusterStatusProcessor { if (cluster != null) { try { ApplicationHolder.acquireReadLock(); - Application application = ApplicationHolder.getApplications().getApplication(appId); - //if all members removed from the cluster and cluster is in terminating, - // either it has to be terminated or Reset - if (!clusterMonitorHasMembers && cluster.getStatus(null) == ClusterStatus.Terminating) { + /** + * if all members removed from the cluster and cluster is in terminating, + * either it has to be terminated or Reset + */ + if (!clusterMonitorHasMembers) { if (log.isInfoEnabled()) { log.info("Publishing Cluster terminated event for [application]: " + appId + " [cluster]: " + clusterId); @@ -119,17 +120,19 @@ public class ClusterStatusTerminatedProcessor extends ClusterStatusProcessor { * @param monitor the cluster monitor * @return whether has members or not */ - private boolean clusterMonitorHasMembers(VMClusterMonitor monitor) { + private boolean clusterInstanceHasMembers(VMClusterMonitor monitor, String instanceId) { boolean hasMember = false; for (ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext : monitor.getAllNetworkPartitionCtxts().values()) { //minimum check per partition - for(ClusterInstanceContext clusterInstanceContext : - clusterLevelNetworkPartitionContext.getClusterInstanceContextMap().values()) { + if(clusterLevelNetworkPartitionContext.containsClusterInstanceContext(instanceId)) { + ClusterInstanceContext clusterInstanceContext = clusterLevelNetworkPartitionContext. + getClusterInstanceContext(instanceId); for (ClusterLevelPartitionContext partitionContext : clusterInstanceContext.getPartitionCtxts()) { if (partitionContext.getNonTerminatedMemberCount() > 0) { hasMember = true; + return hasMember; } else { hasMember = false; }
