fixing scale down issue with Groups and refactoring
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/5e79bbfa Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/5e79bbfa Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/5e79bbfa Branch: refs/heads/master Commit: 5e79bbfa4a7b7f9f01d237bd59cfba403631ad5e Parents: 6087244 Author: reka <[email protected]> Authored: Tue Apr 28 23:54:08 2015 +0530 Committer: reka <[email protected]> Committed: Wed Apr 29 00:05:46 2015 +0530 ---------------------------------------------------------------------- .../autoscaler/monitor/EventHandler.java | 3 +- .../stratos/autoscaler/monitor/Monitor.java | 12 ++-- .../monitor/component/ApplicationMonitor.java | 21 ++++-- .../monitor/component/GroupMonitor.java | 68 +++----------------- .../component/ParentComponentMonitor.java | 56 +++++++++++++++- 5 files changed, 87 insertions(+), 73 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/5e79bbfa/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/EventHandler.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/EventHandler.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/EventHandler.java index d5be50d..e7edd1e 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/EventHandler.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/EventHandler.java @@ -38,6 +38,7 @@ public interface EventHandler { * Triggered when a status event is received from the parent. * * @param statusEvent + * @throws MonitorNotFoundException */ public abstract void onParentStatusEvent(MonitorStatusEvent statusEvent) throws MonitorNotFoundException; @@ -45,7 +46,7 @@ public interface EventHandler { /** * Triggered when a scaling event is received from a child. * - * @param scalingEvent + * @param scalingEvent the event which passed when scaling */ public abstract void onChildScalingEvent(ScalingEvent scalingEvent); http://git-wip-us.apache.org/repos/asf/stratos/blob/5e79bbfa/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 0a9d7f1..b5f5997 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 @@ -51,7 +51,7 @@ public abstract class Monitor implements EventHandler { } /** - * This will destroy the monitor thread + * Implement this method to destroy the monitor thread */ public abstract void destroy(); @@ -141,7 +141,7 @@ public abstract class Monitor implements EventHandler { * @param hasDependent whether monitor has dependent or not */ public void setHasStartupDependents(boolean hasDependent) { - this.hasStartupDependents = hasDependent; + hasStartupDependents = hasDependent; } /** @@ -150,7 +150,7 @@ public abstract class Monitor implements EventHandler { * @param instance instance to be added */ public void addInstance(Instance instance) { - this.instanceIdToInstanceMap.put(instance.getInstanceId(), instance); + instanceIdToInstanceMap.put(instance.getInstanceId(), instance); } @@ -161,7 +161,7 @@ public abstract class Monitor implements EventHandler { * @return the instance */ public Instance getInstance(String instanceId) { - return this.instanceIdToInstanceMap.get(instanceId); + return instanceIdToInstanceMap.get(instanceId); } /** @@ -170,7 +170,7 @@ public abstract class Monitor implements EventHandler { * @param instanceId instance id */ public void removeInstance(String instanceId) { - this.instanceIdToInstanceMap.remove(instanceId); + instanceIdToInstanceMap.remove(instanceId); } /** @@ -181,7 +181,7 @@ public abstract class Monitor implements EventHandler { */ public List<String> getInstancesByParentInstanceId(String parentInstanceId) { List<String> instances = new ArrayList<String>(); - for (Instance instance : this.instanceIdToInstanceMap.values()) { + for (Instance instance : instanceIdToInstanceMap.values()) { if (instance.getParentId().equals(parentInstanceId)) { instances.add(instance.getInstanceId()); } http://git-wip-us.apache.org/repos/asf/stratos/blob/5e79bbfa/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 c097b2b..072ffbb 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 @@ -70,7 +70,7 @@ public class ApplicationMonitor extends ParentComponentMonitor { //Flag to set whether application is terminating private boolean isTerminating; - // Flag to set if forcefull undeployment is invoked for the application. + // Flag to set if forceful undeployment is invoked for the application. private boolean force; public ApplicationMonitor(Application application) throws DependencyBuilderException, @@ -221,10 +221,10 @@ public class ApplicationMonitor extends ParentComponentMonitor { for (Monitor monitor : monitors.values()) { if (monitor instanceof ParentComponentMonitor) { - Monitor monitor1 = findGroupMonitor(id, ((ParentComponentMonitor) monitor). + Monitor groupMonitor = findGroupMonitor(id, ((ParentComponentMonitor) monitor). getAliasToActiveMonitorsMap()); - if (monitor1 != null) { - return monitor1; + if (groupMonitor != null) { + return groupMonitor; } } } @@ -287,7 +287,17 @@ public class ApplicationMonitor extends ParentComponentMonitor { ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(this.id, appId, instanceId); } else { - onChildTerminatedEvent(childId, instanceId); + Monitor monitor = this.getMonitor(childId); + boolean active = false; + if (monitor instanceof GroupMonitor) { + 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] " + @@ -548,6 +558,7 @@ public class ApplicationMonitor extends ParentComponentMonitor { /** * Whether application is in-terminating or not + * * @return application state */ public boolean isTerminating() { http://git-wip-us.apache.org/repos/asf/stratos/blob/5e79bbfa/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 426c169..980503f 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 @@ -48,7 +48,6 @@ import org.apache.stratos.messaging.domain.application.Application; import org.apache.stratos.messaging.domain.application.ApplicationStatus; import org.apache.stratos.messaging.domain.application.Group; import org.apache.stratos.messaging.domain.application.GroupStatus; -import org.apache.stratos.messaging.domain.instance.ApplicationInstance; import org.apache.stratos.messaging.domain.instance.GroupInstance; import org.apache.stratos.messaging.domain.instance.Instance; import org.apache.stratos.messaging.domain.topology.ClusterStatus; @@ -159,7 +158,7 @@ public class GroupMonitor extends ParentComponentMonitor { int activeAppInstances = appMonitor. getNetworkPartitionContext(networkPartitionContext.getId()). getActiveInstancesCount(); - if(activeAppInstances > 0) { + if (activeAppInstances > 0) { //Creating new group instance based on the existing parent instances createInstanceOnDemand(parentInstanceContext.getId()); } @@ -413,16 +412,7 @@ public class GroupMonitor extends ParentComponentMonitor { } else if (status1 == ClusterStatus.Terminated || status1 == GroupStatus.Terminated) { //Verifying whether all the minimum no of instances of child // became active to take next action - if (status1 == GroupStatus.Terminated) { - /*boolean childTerminated = verifyGroupStatus(instanceId, (GroupStatus) status1); - if (childTerminated) {*/ - onTerminationOfInstance(childId, instanceId); - /*} else { - log.info("Waiting for other group instances to be terminated"); - }*/ - } else { - onTerminationOfInstance(childId, instanceId); - } + onTerminationOfInstance(childId, instanceId); } } @@ -438,7 +428,13 @@ public class GroupMonitor extends ParentComponentMonitor { ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(id, appId, instanceId); } else { - onChildTerminatedEvent(childId, instanceId); + boolean active = verifyGroupStatus(childId, instanceId, GroupStatus.Active); + if (!active) { + onTerminationOfInstance(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] " + @@ -916,52 +912,6 @@ public class GroupMonitor extends ParentComponentMonitor { } - public boolean verifyGroupStatus(String childId, String instanceId, GroupStatus requiredStatus) { - Monitor monitor = this.getMonitor(childId); - List<String> groupInstances; - GroupInstance groupInstance = (GroupInstance) monitor.getInstance(instanceId); - if (groupInstance == null) { - groupInstances = monitor.getInstancesByParentInstanceId(instanceId); - } else { - if (groupInstance.getStatus() == requiredStatus) { - return true; - } else { - return false; - } - } - - String networkPartitionId = null; - int noOfInstancesOfRequiredStatus = 0; - for (String childInstanceId : groupInstances) { - GroupInstance childGroupInstance = (GroupInstance) monitor.getInstance(childInstanceId); - networkPartitionId = childGroupInstance.getNetworkPartitionId(); - if (childGroupInstance.getStatus() == requiredStatus) { - noOfInstancesOfRequiredStatus++; - } - } - - if (!groupInstances.isEmpty()) { - GroupLevelNetworkPartitionContext networkPartitionContext = - (GroupLevelNetworkPartitionContext) this.getNetworkPartitionCtxts(). - get(networkPartitionId); - int minInstances = networkPartitionContext.getMinInstanceCount(); - //if terminated all the instances in this instances map should be in terminated state - //if terminated all the instances in this instances map should be in terminated state - if (noOfInstancesOfRequiredStatus == this.inactiveInstancesMap.size() && - requiredStatus == GroupStatus.Terminated) { - return true; - } else if (noOfInstancesOfRequiredStatus >= minInstances) { - return true; - } else { - //of only one is inActive implies that the whole group is Inactive - if (requiredStatus == GroupStatus.Inactive && noOfInstancesOfRequiredStatus >= 1) { - return true; - } - } - - } - return false; - } @Override http://git-wip-us.apache.org/repos/asf/stratos/blob/5e79bbfa/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 6b69065..8c25447 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 @@ -29,6 +29,7 @@ import org.apache.stratos.autoscaler.applications.dependency.DependencyTree; import org.apache.stratos.autoscaler.applications.dependency.context.ApplicationChildContext; import org.apache.stratos.autoscaler.applications.topic.ApplicationBuilder; import org.apache.stratos.autoscaler.context.InstanceContext; +import org.apache.stratos.autoscaler.context.partition.network.GroupLevelNetworkPartitionContext; import org.apache.stratos.autoscaler.context.partition.network.NetworkPartitionContext; import org.apache.stratos.autoscaler.event.publisher.ClusterStatusEventPublisher; import org.apache.stratos.autoscaler.exception.application.DependencyBuilderException; @@ -51,6 +52,7 @@ import org.apache.stratos.messaging.domain.application.GroupStatus; import org.apache.stratos.messaging.domain.application.ParentComponent; import org.apache.stratos.messaging.domain.application.ScalingDependentList; import org.apache.stratos.messaging.domain.instance.ClusterInstance; +import org.apache.stratos.messaging.domain.instance.GroupInstance; import org.apache.stratos.messaging.domain.topology.ClusterStatus; import org.apache.stratos.messaging.message.receiver.topology.TopologyManager; @@ -517,10 +519,9 @@ public abstract class ParentComponentMonitor extends Monitor implements Runnable Monitor monitor = this.aliasToActiveMonitorsMap.get(context1.getId()); if (monitor instanceof GroupMonitor) { - GroupMonitor monitor1 = (GroupMonitor) monitor; try { ApplicationHolder.acquireReadLock(); - if (monitor1.verifyGroupStatus(context1.getId(), instanceId, GroupStatus.Active)) { + if (verifyGroupStatus(context1.getId(), instanceId, GroupStatus.Active)) { parentsActive = true; } @@ -547,6 +548,57 @@ public abstract class ParentComponentMonitor extends Monitor implements Runnable return parentsActive; } + public boolean verifyGroupStatus(String childId, String instanceId, GroupStatus requiredStatus) { + Monitor monitor = this.getMonitor(childId); + if(!(monitor instanceof GroupMonitor)) { + return false; + } + List<String> groupInstances; + GroupInstance groupInstance = (GroupInstance) monitor.getInstance(instanceId); + if (groupInstance == null) { + groupInstances = monitor.getInstancesByParentInstanceId(instanceId); + } else { + if (groupInstance.getStatus() == requiredStatus) { + return true; + } else { + return false; + } + } + + String networkPartitionId = null; + int noOfInstancesOfRequiredStatus = 0; + for (String childInstanceId : groupInstances) { + GroupInstance childGroupInstance = (GroupInstance) monitor.getInstance(childInstanceId); + networkPartitionId = childGroupInstance.getNetworkPartitionId(); + if (childGroupInstance.getStatus() == requiredStatus) { + noOfInstancesOfRequiredStatus++; + } + } + + if (!groupInstances.isEmpty()) { + GroupLevelNetworkPartitionContext networkPartitionContext = + (GroupLevelNetworkPartitionContext) ((GroupMonitor)monitor). + getNetworkPartitionCtxts().get(networkPartitionId); + int minInstances = networkPartitionContext.getMinInstanceCount(); + //if terminated all the instances in this instances map should be in terminated state + //if terminated all the instances in this instances map should be in terminated state + if (noOfInstancesOfRequiredStatus == this.inactiveInstancesMap.size() && + requiredStatus == GroupStatus.Terminated) { + return true; + } else if (noOfInstancesOfRequiredStatus >= minInstances) { + return true; + } else { + //of only one is inActive implies that the whole group is Inactive + if (requiredStatus == GroupStatus.Inactive && noOfInstancesOfRequiredStatus >= 1) { + return true; + } + } + + } + return false; + } + + protected void handleDependentScaling(InstanceContext instanceContext, NetworkPartitionContext networkPartitionContext) { /**
