adding support for group scaling
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/fc3238e0 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/fc3238e0 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/fc3238e0 Branch: refs/heads/master Commit: fc3238e041629b74517b0f46b0276e656e2e17e1 Parents: 586ab74 Author: reka <[email protected]> Authored: Tue Dec 16 17:24:14 2014 +0530 Committer: Udara Liyanage <[email protected]> Committed: Thu Dec 18 12:06:57 2014 +0530 ---------------------------------------------------------------------- .../dependency/DependencyBuilder.java | 55 +++---- .../autoscaler/context/InstanceContext.java | 10 ++ .../context/group/GroupInstanceContext.java | 8 + .../autoscaler/monitor/EventHandler.java | 7 - .../stratos/autoscaler/monitor/Monitor.java | 2 +- .../monitor/cluster/AbstractClusterMonitor.java | 5 - .../monitor/cluster/VMClusterMonitor.java | 14 +- .../monitor/component/ApplicationMonitor.java | 13 +- .../monitor/component/GroupMonitor.java | 158 +++++++++++++++---- .../component/ParentComponentMonitor.java | 2 +- .../autoscaler/monitor/events/ScalingEvent.java | 8 +- .../monitor/events/ScalingOverMaxEvent.java | 8 +- .../builder/MonitorStatusEventBuilder.java | 11 +- 13 files changed, 198 insertions(+), 103 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java index 7dd9c2a..98d2dc4 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java @@ -26,9 +26,7 @@ import org.apache.stratos.autoscaler.applications.dependency.context.Application import org.apache.stratos.autoscaler.exception.application.DependencyBuilderException; import org.apache.stratos.messaging.domain.applications.*; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; +import java.util.*; /** * This is to build the startup/termination dependencies @@ -161,30 +159,33 @@ public class DependencyBuilder { * Utility method to build scaling dependencies * */ -// public Set<String> buildScalingDependencies(ParentComponent component) { -// log.info(" ******* in build scaling dependencies ************ "); // TODO - remove -// Set<String> scalingDependencies = new HashSet<String>(); -// if(component.getDependencyOrder() != null && component.getDependencyOrder().getScalingDependents() != null) { -// log.info(" ******* in build scaling dependencies 22 ************ "); // TODO - remove -// for (String string : component.getDependencyOrder().getScalingDependents()) { -// -// log.info(" ******* in build scaling dependencies 33 ************ "); // TODO - remove -// if (string.startsWith(Constants.GROUP + ".")) { -// //getting the group alias -// scalingDependencies.add(getGroupFromStartupOrder(string)); -// } else if (string.startsWith(Constants.CARTRIDGE + ".")) { -// //getting the cluster alias -// String id = getClusterFromStartupOrder(string); -// //getting the cluster-id from cluster alias -// ClusterDataHolder clusterDataHolder = (ClusterDataHolder) component.getClusterDataMap().get(id); -// scalingDependencies.add(clusterDataHolder.getClusterId()); -// } else { -// log.warn("[Scaling Dependency]: " + string + " contains unknown reference"); -// } -// } -// } -// return scalingDependencies; -// } + public Set<ScalingDependentList> buildScalingDependencies(ParentComponent component) { + Set<ScalingDependentList> scalingDependentLists = new HashSet<ScalingDependentList>(); + if(component.getDependencyOrder() != null && component.getDependencyOrder().getScalingDependents() != null) { + for (ScalingDependentList dependentList : component.getDependencyOrder().getScalingDependents()) { + List<String> scalingDependencies = new ArrayList<String>(); + for(String string : dependentList.getScalingDependentListComponents()) { + if (string.startsWith(Constants.GROUP + ".")) { + //getting the group alias + scalingDependencies.add(getGroupFromStartupOrder(string)); + } else if (string.startsWith(Constants.CARTRIDGE + ".")) { + //getting the cluster alias + String id = getClusterFromStartupOrder(string); + //getting the cluster-id from cluster alias + ClusterDataHolder clusterDataHolder = (ClusterDataHolder) component.getClusterDataMap().get(id); + scalingDependencies.add(clusterDataHolder.getClusterId()); + } else { + log.warn("[Scaling Dependency]: " + string + " contains unknown reference"); + } + } + ScalingDependentList scalingDependentList = new ScalingDependentList(scalingDependencies); + scalingDependentLists.add(scalingDependentList); + + + } + } + return scalingDependentLists; + } /** * Utility method to get the group alias from the startup order Eg: group.mygroup http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java index ce23ec3..8d4ef27 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java @@ -24,6 +24,8 @@ package org.apache.stratos.autoscaler.context; public abstract class InstanceContext { protected String id; + protected String parentInstanceId; + public InstanceContext(String id) { this.id = id; } @@ -35,4 +37,12 @@ public abstract class InstanceContext { public void setId(String id) { this.id = id; } + + public String getParentInstanceId() { + return parentInstanceId; + } + + public void setParentInstanceId(String parentInstanceId) { + this.parentInstanceId = parentInstanceId; + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java index c7cbbe6..1f4ae6f 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java @@ -111,6 +111,14 @@ public class GroupInstanceContext extends InstanceContext { this.idToScalingEvent.put(scalingEvent.getId(), scalingEvent); } + public ScalingEvent getScalingEvent(String id) { + return this.idToScalingEvent.get(id); + } + + public ScalingOverMaxEvent getScalingMaxEvent(String id) { + return this.idToScalingOverMaxEvent.get(id); + } + public void removeScalingOverMaxEvent(String id) { this.idToScalingOverMaxEvent.remove(id); } http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/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 7805a13..6cd48e1 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 @@ -62,11 +62,4 @@ public interface EventHandler { * @param scalingEvent */ public abstract void onParentScalingEvent(ScalingEvent scalingEvent); - - /** - * Triggered when scaling decision is made. - * - * @param scalingEvent - */ - public abstract void onEvent(ScalingEvent scalingEvent); } http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/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 25e54a1..5154b2b 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 @@ -43,7 +43,7 @@ public abstract class Monitor implements EventHandler { public abstract void destroy(); - public abstract void createInstanceOnDemand(String instanceId); + public abstract boolean createInstanceOnDemand(String instanceId); public Monitor() { this.instanceIdToInstanceMap = new HashMap<String, Instance>(); http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/AbstractClusterMonitor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/AbstractClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/AbstractClusterMonitor.java index 9d44b6c..eb94e8d 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/AbstractClusterMonitor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/AbstractClusterMonitor.java @@ -328,11 +328,6 @@ public abstract class AbstractClusterMonitor extends Monitor implements Runnable } - @Override - public void onEvent(ScalingEvent scalingEvent) { - - } - public boolean isHasFaultyMember() { return hasFaultyMember; } http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/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 3ee14d2..8bdbf0a 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 @@ -442,13 +442,13 @@ public class VMClusterMonitor extends AbstractClusterMonitor { public void sendClusterScalingEvent(String networkPartitionId, String instanceId, float factor) { - MonitorStatusEventBuilder.handleClusterScalingEvent(this.parent, networkPartitionId, instanceId, factor, this.id, serviceType); + MonitorStatusEventBuilder.handleClusterScalingEvent(this.parent, networkPartitionId, instanceId, factor, this.id); } public void sendScalingOverMaxEvent(String networkPartitionId, String instanceId) { MonitorStatusEventBuilder.handleScalingOverMaxEvent(this.parent, networkPartitionId, instanceId, - this.id, serviceType); + this.id); } @Override @@ -1119,11 +1119,11 @@ public class VMClusterMonitor extends AbstractClusterMonitor { } - public void createInstanceOnDemand(String instanceId) { + public boolean createInstanceOnDemand(String instanceId) { Cluster cluster = TopologyManager.getTopology().getService(this.serviceType). getCluster(this.clusterId); try { - createInstance(instanceId, cluster); + return createInstance(instanceId, cluster); //TODO exception } catch (PolicyValidationException e) { log.error("Error while creating the cluster instance", e); @@ -1131,10 +1131,11 @@ public class VMClusterMonitor extends AbstractClusterMonitor { log.error("Error while creating the cluster instance", e); } + return false; } - private void createInstance(String parentInstanceId, Cluster cluster) + private boolean createInstance(String parentInstanceId, Cluster cluster) throws PolicyValidationException, PartitionValidationException { Instance parentMonitorInstance = this.parent.getInstance(parentInstanceId); String partitionId = null; @@ -1178,9 +1179,12 @@ public class VMClusterMonitor extends AbstractClusterMonitor { } else { createClusterInstance(cluster.getServiceName(), cluster.getClusterId(), null, parentInstanceId, partitionId, parentMonitorInstance.getNetworkPartitionId()); + } + return true; } else { + return false; } http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/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 3184e81..69eb68e 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 @@ -188,7 +188,7 @@ public class ApplicationMonitor extends ParentComponentMonitor { //find the child context of this group, //Notifying children, if this group has scaling dependencies - if(scalingDependencies != null && !scalingDependencies.isEmpty()) { + /*if(scalingDependencies != null && !scalingDependencies.isEmpty()) { // has dependencies. Notify children if (aliasToActiveMonitorsMap != null && !aliasToActiveMonitorsMap.values().isEmpty()) { @@ -217,11 +217,12 @@ public class ApplicationMonitor extends ParentComponentMonitor { } } } - } + }*/ } @Override public void onChildScalingOverMaxEvent(ScalingOverMaxEvent scalingOverMaxEvent) { + //TODO to check for the capability of cloud bursting } @@ -230,11 +231,6 @@ public class ApplicationMonitor extends ParentComponentMonitor { } - @Override - public void onEvent(ScalingEvent scalingEvent) { - - } - public boolean startMinimumDependencies(Application application) throws TopologyInConsistentException, PolicyValidationException { @@ -417,7 +413,8 @@ public class ApplicationMonitor extends ParentComponentMonitor { } @Override - public void createInstanceOnDemand(String instanceId) { + public boolean createInstanceOnDemand(String instanceId) { + return false; } http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/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 500a0ff..62b33c2 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,10 +48,7 @@ import org.apache.stratos.messaging.domain.instance.Instance; import org.apache.stratos.messaging.domain.topology.ClusterStatus; import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -82,7 +79,8 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable { * @throws DependencyBuilderException throws when couldn't build the Topology * @throws TopologyInConsistentException throws when topology is inconsistent */ - public GroupMonitor(Group group, String appId, List<String> parentInstanceId, boolean hasScalingDependents) throws DependencyBuilderException, + public GroupMonitor(Group group, String appId, List<String> parentInstanceId, + boolean hasScalingDependents) throws DependencyBuilderException, TopologyInConsistentException { super(group); this.groupScalingEnabled = group.isGroupScalingEnabled(); @@ -112,21 +110,107 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable { } public void monitor() { + final Collection<GroupLevelNetworkPartitionContext> networkPartitionContexts = + this.networkPartitionCtxts.values(); Runnable monitoringRunnable = new Runnable() { @Override public void run() { - float finalFactor = 1; if (log.isDebugEnabled()) { log.debug("Group monitor is running====== : " + this.toString()); } + for (GroupLevelNetworkPartitionContext networkPartitionContext : networkPartitionContexts) { + + for (GroupInstanceContext instanceContext : networkPartitionContext. + getInstanceIdToInstanceContextMap().values()) { + GroupInstance instance = (GroupInstance) instanceIdToInstanceMap. + get(instanceContext.getId()); + //stopping the monitoring when the group is inactive/Terminating/Terminated + if (instance.getStatus().getCode() <= GroupStatus.Active.getCode()) { + //Gives priority to scaling max out rather than dependency scaling + if (!instanceContext.getIdToScalingOverMaxEvent().isEmpty()) { + //handling the group scaling + if (groupScalingEnabled) { + //one of the child is loaded and max out. + // Hence creating new group instance + boolean createOnDemand = createInstanceOnDemand(instanceContext. + getParentInstanceId()); + if (!createOnDemand) { + //couldn't create new instance. Hence notifying the parent + MonitorStatusEventBuilder.handleScalingOverMaxEvent(parent, + networkPartitionContext.getId(), + instanceContext.getId(), + appId); + } else { + //Resetting the max events + instanceContext.setIdToScalingOverMaxEvent( + new HashMap<String, ScalingOverMaxEvent>()); + } + } else { + //notifying the parent if no group scaling enabled here + MonitorStatusEventBuilder.handleScalingOverMaxEvent(parent, + networkPartitionContext.getId(), + instanceContext.getId(), + appId); + } + } else { + /** + * Dependency scaling handling + * Finding out the highest scaling events within the scaling dependencies + */ + List<ScalingEvent> highestScalingEventOfDependencies = new ArrayList<ScalingEvent>(); + for (ScalingDependentList scalingDependentList : scalingDependencies) { + ScalingEvent highestFactorEvent = null; + for (String scalingDependentListComponent : scalingDependentList. + getScalingDependentListComponents()) { + ScalingEvent scalingEvent = instanceContext. + getScalingEvent(scalingDependentListComponent); + if (highestFactorEvent == null) { + highestFactorEvent = scalingEvent; + } else { + if (scalingEvent.getFactor() > highestFactorEvent.getFactor()) { + highestFactorEvent = scalingEvent; + } + } + } + highestScalingEventOfDependencies.add(highestFactorEvent); + } + + for (ScalingEvent highestScalingEventOfChild : highestScalingEventOfDependencies) { + //find the child context of this group, + //Notifying children, if this group has scaling dependencies + if (scalingDependencies != null && !scalingDependencies.isEmpty()) { + for (ScalingDependentList scalingDependentList : scalingDependencies) { + if (scalingDependentList.getScalingDependentListComponents(). + contains(highestScalingEventOfChild.getId())) { + for (String scalingDependentListComponent : scalingDependentList + .getScalingDependentListComponents()) { + Monitor monitor = aliasToActiveMonitorsMap.get( + scalingDependentListComponent); + if (monitor instanceof GroupMonitor || + monitor instanceof VMClusterMonitor) { + ScalingEvent scalingEvent = new ScalingEvent(monitor.getId(), + networkPartitionContext.getId(), + instanceContext.getId(), + highestScalingEventOfChild.getFactor()); + monitor.onParentScalingEvent(scalingEvent); + } + } + } + break; + } + } + } + //Resetting the events + instanceContext.setIdToScalingEvent(new HashMap<String, ScalingEvent>()); + } + } + + + } + - /*Collection<ScalingEvent> events = mapScalingEvent.values(); - for (ScalingEvent event : events) { - log.info("Monitor Scaling Event"+event.getId()); } - //TODO : call the on demand group scaling - mapScalingEvent.clear();*/ } }; monitoringRunnable.run(); @@ -171,13 +255,12 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable { ApplicationHolder.releaseReadLock(); } } else { - // notify parent + // notifying the parent log.info("[Group] " + this.id + "is notifying the [parent] " + this.parent.getId() + " [instance] " + instanceId); MonitorStatusEventBuilder.handleGroupStatusEvent(this.parent, status, this.id, instanceId); } - //} //notify the children about the state change try { MonitorStatusEventBuilder.notifyChildren(this, new GroupStatusEvent(status, this.id, instanceId)); @@ -193,7 +276,6 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable { String instanceId = statusEvent.getInstanceId(); LifeCycleState status1 = statusEvent.getStatus(); //Events coming from parent are In_Active(in faulty detection), Scaling events, termination - if (status1 == GroupStatus.Active) { //Verifying whether all the minimum no of instances of child // became active to take next action @@ -208,13 +290,9 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable { onChildActivatedEvent(childId, instanceId); } else if (status1 == ClusterStatus.Inactive || status1 == GroupStatus.Inactive) { - //TODO handling restart of stratos - /*if (!aliasToActiveMonitorsMap.get(childId).hasStartupDependents()) { - onChildActivatedEvent(childId, instanceId); - } else {*/ + //TODO handling restart of stratos when group is inactive markInstanceAsInactive(childId, instanceId); onChildInactiveEvent(childId, instanceId); - //} } else if (status1 == ClusterStatus.Terminating || status1 == GroupStatus.Terminating) { //mark the child monitor as inactive in the map @@ -309,7 +387,8 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable { //find the child context of this group, //Notifying children, if this group has scaling dependencies - if (scalingDependencies != null && !scalingDependencies.isEmpty()) { + //TODO will be handled by the periodic task + /*if (scalingDependencies != null && !scalingDependencies.isEmpty()) { // has dependencies. Notify children if (aliasToActiveMonitorsMap != null && !aliasToActiveMonitorsMap.values().isEmpty()) { @@ -336,7 +415,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable { } } } - +*/ String networkPartitionId = scalingEvent.getNetworkPartitionId(); String instanceId = scalingEvent.getInstanceId(); String id = scalingEvent.getId(); @@ -382,13 +461,28 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable { @Override public void onParentScalingEvent(ScalingEvent scalingEvent) { - - //Notify all children about scaling - } - - @Override - public void onEvent(ScalingEvent scalingEvent) { - + //Notifying children, if this group has scaling dependencies + if (scalingDependencies != null && !scalingDependencies.isEmpty()) { + for (ScalingDependentList scalingDependentList : scalingDependencies) { + if (scalingDependentList.getScalingDependentListComponents(). + contains(scalingEvent.getId())) { + for (String scalingDependentListComponent : scalingDependentList + .getScalingDependentListComponents()) { + Monitor monitor = aliasToActiveMonitorsMap.get( + scalingDependentListComponent); + if (monitor instanceof GroupMonitor || + monitor instanceof VMClusterMonitor) { + ScalingEvent childScalingEvent = new ScalingEvent(monitor.getId(), + monitor.getId(), + scalingEvent.getInstanceId(), + scalingEvent.getFactor()); + monitor.onParentScalingEvent(childScalingEvent); + } + } + } + break; + } + } } public boolean isGroupScalingEnabled() { @@ -545,6 +639,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable { String instanceId = groupInstance.getInstanceId(); GroupInstanceContext groupInstanceContext = new GroupInstanceContext(instanceId); + groupInstanceContext.setParentInstanceId(groupInstance.getParentId()); groupInstanceContext.addPartitionContext((GroupLevelPartitionContext) partitionContext); groupLevelNetworkPartitionContext.addInstanceContext(groupInstanceContext); @@ -659,7 +754,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable { * @param parentInstanceId * @throws org.apache.stratos.autoscaler.exception.application.MonitorNotFoundException */ - public void createInstanceOnDemand(String parentInstanceId) { + public boolean createInstanceOnDemand(String parentInstanceId) { // Get parent instance context Instance parentInstanceContext = getParentInstanceContext(parentInstanceId); List<String> instanceIdsToStart = new ArrayList<String>(); @@ -715,6 +810,10 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable { "[max] " + groupMax + ". Hence trying to notify the parent."); } } + boolean startedOnDemand = false; + if (!instanceIdsToStart.isEmpty()) { + startedOnDemand = true; + } //TODO Starting all the instances, can do in parallel for (String instanceId : instanceIdsToStart) { try { @@ -724,6 +823,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable { log.error("Error while creating the group/cluster instance", e); } } + return startedOnDemand; } http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/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 e9f20c9..00ec33a 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 @@ -89,7 +89,7 @@ public abstract class ParentComponentMonitor extends Monitor { startupDependencyTree = DependencyBuilder.getInstance().buildDependency(component); //Building the scaling dependencies for this monitor within the immediate children if(component.getDependencyOrder() != null) { - scalingDependencies = component.getDependencyOrder().getScalingDependents(); + scalingDependencies = DependencyBuilder.getInstance().buildScalingDependencies(component); } //Create the executor service with identifier and thread pool size executorService = StratosThreadPool.getExecutorService(IDENTIFIER, THREAD_POOL_SIZE); http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingEvent.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingEvent.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingEvent.java index f5141cf..da96ecd 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingEvent.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingEvent.java @@ -25,13 +25,11 @@ public class ScalingEvent extends MonitorEvent { private float factor; private String networkPartitionId; - private String serviceName; - public ScalingEvent(String id, String networkPartitionId, String instanceId, float factor, String serviceName) { + public ScalingEvent(String id, String networkPartitionId, String instanceId, float factor) { super(id, instanceId); this.factor = factor; this.networkPartitionId = networkPartitionId; - this.serviceName = serviceName; } public float getFactor() { @@ -49,8 +47,4 @@ public class ScalingEvent extends MonitorEvent { public void setNetworkPartitionId(String networkPartitionId) { this.networkPartitionId = networkPartitionId; } - - public String getServiceName() { - return serviceName; - } } http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingOverMaxEvent.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingOverMaxEvent.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingOverMaxEvent.java index dc5409d..cee7909 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingOverMaxEvent.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingOverMaxEvent.java @@ -24,12 +24,10 @@ package org.apache.stratos.autoscaler.monitor.events; public class ScalingOverMaxEvent extends MonitorEvent { private String networkPartitionId; - private String serviceName; - public ScalingOverMaxEvent(String id, String networkPartitionId, String instanceId, String serviceName) { + public ScalingOverMaxEvent(String id, String networkPartitionId, String instanceId) { super(id, instanceId); this.networkPartitionId = networkPartitionId; - this.serviceName = serviceName; } public String getNetworkPartitionId() { @@ -39,8 +37,4 @@ public class ScalingOverMaxEvent extends MonitorEvent { public void setNetworkPartitionId(String networkPartitionId) { this.networkPartitionId = networkPartitionId; } - - public String getServiceName() { - return serviceName; - } } http://git-wip-us.apache.org/repos/asf/stratos/blob/fc3238e0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/builder/MonitorStatusEventBuilder.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/builder/MonitorStatusEventBuilder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/builder/MonitorStatusEventBuilder.java index a46114a..3c1c665 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/builder/MonitorStatusEventBuilder.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/builder/MonitorStatusEventBuilder.java @@ -54,21 +54,20 @@ public class MonitorStatusEventBuilder { public static void handleClusterScalingEvent(ParentComponentMonitor parent, String networkPartitionId, String instanceId, float factor, - String appId, String serviceName) { + String appId) { //Send notifications to parent of the cluster monitor - ScalingEvent scalingEvent = new ScalingEvent(appId, networkPartitionId, instanceId, factor, - serviceName) ; + ScalingEvent scalingEvent = new ScalingEvent(appId, networkPartitionId, instanceId, factor) ; notifyParent(parent, scalingEvent); } public static void handleScalingOverMaxEvent(ParentComponentMonitor parent, String networkPartitionId, String instanceId, - String appId, String serviceName) { + String appId) { //Send notifications to parent of the cluster monitor - ScalingOverMaxEvent scalingOverMaxEvent = new ScalingOverMaxEvent(appId, networkPartitionId, instanceId, - serviceName) ; + ScalingOverMaxEvent scalingOverMaxEvent = new ScalingOverMaxEvent(appId, networkPartitionId, + instanceId) ; notifyParent(parent, scalingOverMaxEvent); }
