fixing group scaling issue and adding comments
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/29ac5f0a Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/29ac5f0a Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/29ac5f0a Branch: refs/heads/master Commit: 29ac5f0ae5a76cd2b8b708018d4911acb93ccf46 Parents: 885c752 Author: reka <[email protected]> Authored: Tue Apr 28 16:07:10 2015 +0530 Committer: reka <[email protected]> Committed: Wed Apr 29 00:05:46 2015 +0530 ---------------------------------------------------------------------- .../dependency/DependencyBuilder.java | 1 + .../applications/dependency/DependencyTree.java | 7 +- .../context/ApplicationChildContext.java | 9 ++ .../stratos/autoscaler/monitor/Monitor.java | 40 ++++--- .../monitor/component/ApplicationMonitor.java | 112 +++++++++++++++---- .../monitor/component/GroupMonitor.java | 14 ++- 6 files changed, 140 insertions(+), 43 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/29ac5f0a/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 fe14f7f..8df87c3 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 @@ -111,6 +111,7 @@ public class DependencyBuilder { applicationChildContext.getId(), parentContext.getId(), dependencyTree)); } parentContext = applicationChildContext; + applicationChildContext.setParent(parentContext); } else { // This is the first element, add it as the root dependencyTree.addPrimaryApplicationContext(applicationChildContext); http://git-wip-us.apache.org/repos/asf/stratos/blob/29ac5f0a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyTree.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyTree.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyTree.java index 8d97542..f489158 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyTree.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyTree.java @@ -114,13 +114,16 @@ public class DependencyTree { List<ApplicationChildContext> contexts) { for (ApplicationChildContext context : contexts) { //TODO check for the status - if (context.getId().equals(id)) { + if (context.getParent() != null && context.getParent().equals(id)) { return context; } } //if not found in the top level search recursively for (ApplicationChildContext context : this.primaryApplicationContextList) { - return findParentContextWithId(context, id, context.getApplicationChildContextList()); + if(context.getApplicationChildContextList() != null && + !context.getApplicationChildContextList().isEmpty()) { + return findParentContextWithId(context, id, context.getApplicationChildContextList()); + } } return null; } http://git-wip-us.apache.org/repos/asf/stratos/blob/29ac5f0a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ApplicationChildContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ApplicationChildContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ApplicationChildContext.java index b5a4a39..1e4f3fd 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ApplicationChildContext.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ApplicationChildContext.java @@ -35,6 +35,7 @@ public abstract class ApplicationChildContext { private ClusterStatus status; private Stack<ClusterStatus> statusLifeCycle; private List<ApplicationChildContext> applicationChildContextList; + private ApplicationChildContext parent; protected boolean hasStartupDependents; protected boolean isGroupScalingEnabled; @@ -117,4 +118,12 @@ public abstract class ApplicationChildContext { public void setGroupScalingEnabled(boolean isDependent) { this.isGroupScalingEnabled = isDependent; } + + public ApplicationChildContext getParent() { + return parent; + } + + public void setParent(ApplicationChildContext parent) { + this.parent = parent; + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/29ac5f0a/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 d13ae4c..0a9d7f1 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 @@ -27,11 +27,13 @@ import java.util.List; import java.util.Map; /** - * Abstract class for the monitoring functionality in autoscaler. + * Abstract class for the monitoring functionality in Autoscaler. */ public abstract class Monitor implements EventHandler { - - public enum MonitorType {Application, Group, Cluster} + //Monitor types + public enum MonitorType { + Application, Group, Cluster + } //Id of the monitor, cluster=clusterId, group=group-alias, application=app-alias protected String id; @@ -44,13 +46,23 @@ public abstract class Monitor implements EventHandler { //monitors map, key=InstanceId and value=ClusterInstance/GroupInstance/ApplicationInstance protected Map<String, Instance> instanceIdToInstanceMap; + public Monitor() { + this.instanceIdToInstanceMap = new HashMap<String, Instance>(); + } + + /** + * This will destroy the monitor thread + */ public abstract void destroy(); + /** + * This will create Instance on demand as requested by monitors + * + * @param instanceId instance Id of the instance to be created + * @return whether it is created or not + */ public abstract boolean createInstanceOnDemand(String instanceId); - public Monitor() { - this.instanceIdToInstanceMap = new HashMap<String, Instance>(); - } /** * Return the id of the monitor @@ -64,14 +76,14 @@ public abstract class Monitor implements EventHandler { /** * Return the type of the monitor. * - * @return + * @return monitor type */ public abstract MonitorType getMonitorType(); /** * Set the id of the monitor * - * @param id + * @param id id of the monitor */ public void setId(String id) { this.id = id; @@ -89,7 +101,7 @@ public abstract class Monitor implements EventHandler { /** * To set the app id of the monitor * - * @param appId + * @param appId application id */ public void setAppId(String appId) { this.appId = appId; @@ -107,7 +119,7 @@ public abstract class Monitor implements EventHandler { /** * To set the parent of the monitor * - * @param parent + * @param parent parent of the monitor */ public void setParent(ParentComponentMonitor parent) { this.parent = parent; @@ -126,7 +138,7 @@ public abstract class Monitor implements EventHandler { /** * To set whether monitor has any startup dependencies * - * @param hasDependent + * @param hasDependent whether monitor has dependent or not */ public void setHasStartupDependents(boolean hasDependent) { this.hasStartupDependents = hasDependent; @@ -183,10 +195,6 @@ public abstract class Monitor implements EventHandler { * @return true/false */ public boolean hasInstance() { - if (this.instanceIdToInstanceMap.isEmpty()) { - return false; - } else { - return true; - } + return !instanceIdToInstanceMap.isEmpty(); } } http://git-wip-us.apache.org/repos/asf/stratos/blob/29ac5f0a/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 68b4d28..84f82e3 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 @@ -241,7 +241,8 @@ public class ApplicationMonitor extends ParentComponentMonitor { get(instanceId); if (applicationInstance == null) { - log.warn("The required application [instance] " + instanceId + " not found in the AppMonitor"); + log.warn("The required application [instance] " + instanceId + " not found " + + "in the AppMonitor"); } else { if (applicationInstance.getStatus() != status) { applicationInstance.setStatus(status); @@ -250,7 +251,8 @@ public class ApplicationMonitor extends ParentComponentMonitor { //notify the children about the state change try { - MonitorStatusEventBuilder.notifyChildren(this, new ApplicationStatusEvent(status, appId, instanceId)); + MonitorStatusEventBuilder.notifyChildren(this, new ApplicationStatusEvent(status, + appId, instanceId)); } catch (MonitorNotFoundException e) { log.error("Error while notifying the children from [application] " + appId, e); //TODO revert siblings @@ -305,48 +307,72 @@ public class ApplicationMonitor extends ParentComponentMonitor { } + /** + * This will start the minimum dependencies + * + * @param application the application which used to create monitors + * @return whether monitor created or not + * @throws TopologyInConsistentException + * @throws PolicyValidationException + */ public boolean startMinimumDependencies(Application application) throws TopologyInConsistentException, PolicyValidationException { return createInstanceAndStartDependency(application); } + /** + * Utility to create application instance by parsing the deployment policy for a monitor + * + * @param application the application + * @return whether the instance created or not + * @throws TopologyInConsistentException + * @throws PolicyValidationException + */ private boolean createInstanceAndStartDependency(Application application) throws TopologyInConsistentException, PolicyValidationException { boolean initialStartup = true; List<String> instanceIds = new ArrayList<String>(); String instanceId; - ApplicationPolicy applicationPolicy = PolicyManager.getInstance().getApplicationPolicy(application.getApplicationPolicyId()); + ApplicationPolicy applicationPolicy = PolicyManager.getInstance(). + getApplicationPolicy(application.getApplicationPolicyId()); if (applicationPolicy == null) { - String msg = String.format("Application policy not found in registry or in-memory [application-id] %s", appId); + String msg = String.format("Application policy not found in registry or " + + "in-memory [application-id] %s", appId); log.error(msg); throw new RuntimeException(msg); } - NetworkPartitionAlgorithmContext algorithmContext = AutoscalerContext.getInstance().getNetworkPartitionAlgorithmContext(appId); + NetworkPartitionAlgorithmContext algorithmContext = AutoscalerContext.getInstance(). + getNetworkPartitionAlgorithmContext(appId); if (algorithmContext == null) { - String msg = String.format("Network partition algorithm context not found in registry or in-memory [application-id] %s", appId); + String msg = String.format("Network partition algorithm context not found " + + "in registry or in-memory [application-id] %s", appId); log.error(msg); throw new RuntimeException(msg); } String networkPartitionAlgorithmName = applicationPolicy.getAlgorithm(); if (log.isDebugEnabled()) { - String msg = String.format("Network partition algorithm is %s [application-id] %s", networkPartitionAlgorithmName, appId); + String msg = String.format("Network partition algorithm is %s [application-id] %s", + networkPartitionAlgorithmName, appId); log.debug(msg); } - NetworkPartitionAlgorithm algorithm = getNetworkPartitionAlgorithm(networkPartitionAlgorithmName); + NetworkPartitionAlgorithm algorithm = getNetworkPartitionAlgorithm( + networkPartitionAlgorithmName); if (algorithm == null) { - String msg = String.format("Coudln't create network partition algorithm [application-id] %s", appId); + String msg = String.format("Coudln't create network partition algorithm " + + "[application-id] %s", appId); log.error(msg); throw new RuntimeException(msg); } List<String> nextNetworkPartitions = algorithm.getNextNetworkPartitions(algorithmContext); if (nextNetworkPartitions == null || nextNetworkPartitions.isEmpty()) { - String msg = String.format("No network partitions available for application bursting [application-id] %s", appId); + String msg = String.format("No network partitions available for application bursting " + + "[application-id] %s", appId); log.warn(msg); return false; } @@ -376,6 +402,15 @@ public class ApplicationMonitor extends ParentComponentMonitor { return initialStartup; } + /** + * Utility method to create application instance inside a network partition and + * add data structure to monitor + * + * @param application the application where the application instance needs to be created + * @param context networkPartition where instance needs to be created + * @param instanceExist whether application instance exists or not + * @return instance Id + */ private String handleApplicationInstanceCreation(Application application, ApplicationLevelNetworkPartitionContext context, ApplicationInstance instanceExist) { @@ -405,6 +440,13 @@ public class ApplicationMonitor extends ParentComponentMonitor { return instanceId; } + /** + * Handling the application bursting into available network partition + * + * @throws TopologyInConsistentException + * @throws PolicyValidationException + * @throws MonitorNotFoundException + */ public void handleApplicationBursting() throws TopologyInConsistentException, PolicyValidationException, MonitorNotFoundException { @@ -418,36 +460,44 @@ public class ApplicationMonitor extends ParentComponentMonitor { boolean burstNPFound = false; String instanceId = null; - ApplicationPolicy applicationPolicy = PolicyManager.getInstance().getApplicationPolicy(application.getApplicationPolicyId()); + ApplicationPolicy applicationPolicy = PolicyManager.getInstance(). + getApplicationPolicy(application.getApplicationPolicyId()); if (applicationPolicy == null) { - String msg = String.format("Application policy not found in registry or in-memory [application-id] %s", appId); + String msg = String.format("Application policy not found in registry or in-memory " + + "[application-id] %s", appId); log.error(msg); throw new RuntimeException(msg); } - NetworkPartitionAlgorithmContext algorithmContext = AutoscalerContext.getInstance().getNetworkPartitionAlgorithmContext(appId); + NetworkPartitionAlgorithmContext algorithmContext = AutoscalerContext.getInstance(). + getNetworkPartitionAlgorithmContext(appId); if (algorithmContext == null) { - String msg = String.format("Network partition algorithm context not found in registry or in-memory [application-id] %s", appId); + String msg = String.format("Network partition algorithm context not found in" + + " registry or in-memory [application-id] %s", appId); log.error(msg); throw new RuntimeException(msg); } String networkPartitionAlgorithmName = applicationPolicy.getAlgorithm(); if (log.isDebugEnabled()) { - String msg = String.format("Network partition algorithm is %s [application-id] %s", networkPartitionAlgorithmName, appId); + String msg = String.format("Network partition algorithm is %s [application-id] %s", + networkPartitionAlgorithmName, appId); log.debug(msg); } - NetworkPartitionAlgorithm algorithm = getNetworkPartitionAlgorithm(networkPartitionAlgorithmName); + NetworkPartitionAlgorithm algorithm = getNetworkPartitionAlgorithm( + networkPartitionAlgorithmName); if (algorithm == null) { - String msg = String.format("Coudln't create network partition algorithm [application-id] %s", appId); + String msg = String.format("Coudln't create network partition algorithm " + + "[application-id] %s", appId); log.error(msg); throw new RuntimeException(msg); } List<String> nextNetworkPartitions = algorithm.getNextNetworkPartitions(algorithmContext); if (nextNetworkPartitions == null || nextNetworkPartitions.isEmpty()) { - String msg = String.format("No network partitions available for application bursting [application-id] %s", appId); + String msg = String.format("No network partitions available for application " + + "bursting [application-id] %s", appId); log.warn(msg); return; } @@ -455,7 +505,8 @@ public class ApplicationMonitor extends ParentComponentMonitor { for (String networkPartitionId : nextNetworkPartitions) { if (!this.getNetworkPartitionCtxts().containsKey(networkPartitionId)) { - ApplicationLevelNetworkPartitionContext context = new ApplicationLevelNetworkPartitionContext(networkPartitionId); + ApplicationLevelNetworkPartitionContext context = new + ApplicationLevelNetworkPartitionContext(networkPartitionId); //Setting flags saying that it has been created by burst context.setCreatedOnBurst(true); @@ -481,13 +532,25 @@ public class ApplicationMonitor extends ParentComponentMonitor { } } - private ApplicationInstance createApplicationInstance(Application application, String networkPartitionId) { + /** + * Creating application instance into applications Topology + * + * @param application application where instance needs to be added + * @param networkPartitionId network partition of the application Instance + * @return the create application instance in the topology + */ + private ApplicationInstance createApplicationInstance(Application application, + String networkPartitionId) { //String instanceId = this.generateInstanceId(application); ApplicationInstance instance = ApplicationBuilder.handleApplicationInstanceCreatedEvent( appId, networkPartitionId); return instance; } + /** + * Whether application is in-terminating or not + * @return application state + */ public boolean isTerminating() { return isTerminating; } @@ -515,14 +578,16 @@ public class ApplicationMonitor extends ParentComponentMonitor { if (algorithmName.equals(StratosConstants.NETWORK_PARTITION_ONE_AFTER_ANOTHER_ALGORITHM_ID)) { if (log.isDebugEnabled()) { - String msg = String.format("Network partition algorithm is set to %s in applicatioin policy", + String msg = String.format("Network partition algorithm is set to %s in " + + "applicatioin policy", StratosConstants.NETWORK_PARTITION_ONE_AFTER_ANOTHER_ALGORITHM_ID); log.debug(msg); } return new OneAfterAnotherAlgorithm(); } else if (algorithmName.equals(StratosConstants.NETWORK_PARTITION_ALL_AT_ONCE_ALGORITHM_ID)) { if (log.isDebugEnabled()) { - String msg = String.format("Network partition algorithm is set to %s in applicatioin policy", + String msg = String.format("Network partition algorithm is set to %s " + + "in applicatioin policy", StratosConstants.NETWORK_PARTITION_ALL_AT_ONCE_ALGORITHM_ID); log.debug(msg); } @@ -530,7 +595,8 @@ public class ApplicationMonitor extends ParentComponentMonitor { } if (log.isDebugEnabled()) { - String msg = String.format("Invalid network partition algorithm %s found in applicatioin policy", + String msg = String.format("Invalid network partition algorithm %s found " + + "in applicatioin policy", StratosConstants.NETWORK_PARTITION_ALL_AT_ONCE_ALGORITHM_ID); log.debug(msg); } http://git-wip-us.apache.org/repos/asf/stratos/blob/29ac5f0a/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 e8da232..426c169 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 @@ -23,6 +23,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.stratos.autoscaler.algorithms.PartitionAlgorithm; import org.apache.stratos.autoscaler.applications.ApplicationHolder; 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.group.GroupInstanceContext; import org.apache.stratos.autoscaler.context.partition.GroupLevelPartitionContext; @@ -47,6 +48,7 @@ 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; @@ -151,8 +153,16 @@ public class GroupMonitor extends ParentComponentMonitor { for (InstanceContext parentInstanceContext : parent. getNetworkPartitionContext(networkPartitionContext.getId()). getInstanceIdToInstanceContextMap().values()) { - //Creating new group instance based on the existing parent instances - createInstanceOnDemand(parentInstanceContext.getId()); + //keep on scaleup/scaledown only if the application is active + ApplicationMonitor appMonitor = AutoscalerContext.getInstance(). + getAppMonitor(appId); + int activeAppInstances = appMonitor. + getNetworkPartitionContext(networkPartitionContext.getId()). + getActiveInstancesCount(); + if(activeAppInstances > 0) { + //Creating new group instance based on the existing parent instances + createInstanceOnDemand(parentInstanceContext.getId()); + } } }
