Handling application policy upadte in application monitor
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/ab5d4470 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/ab5d4470 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/ab5d4470 Branch: refs/heads/master Commit: ab5d447087794d3a176116a3424ac0b6a5df09c5 Parents: d227bb4 Author: reka <[email protected]> Authored: Mon Jun 29 15:55:03 2015 +0530 Committer: reka <[email protected]> Committed: Tue Jun 30 11:23:49 2015 +0530 ---------------------------------------------------------------------- .../autoscaler/monitor/MonitorFactory.java | 10 +- .../monitor/cluster/ClusterMonitor.java | 4 +- .../monitor/component/ApplicationMonitor.java | 114 ++++++++++++++++++- .../monitor/component/GroupMonitor.java | 2 +- .../services/impl/AutoscalerServiceImpl.java | 3 - 5 files changed, 117 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/ab5d4470/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java index 0ceac21..ed00369 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java @@ -140,7 +140,6 @@ public class MonitorFactory { } else { groupMonitor.setHasStartupDependents(false); } - groupMonitor.startScheduler(); } finally { ApplicationHolder.releaseReadLock(); } @@ -155,9 +154,10 @@ public class MonitorFactory { instanceIds.add(instance.getInstanceId()); } } - // Starting the minimum dependencies groupMonitor.createInstanceAndStartDependencyAtStartup(group, instanceIds); + //Starting the scheduler for the group monitor + groupMonitor.startScheduler(); return groupMonitor; @@ -188,13 +188,13 @@ public class MonitorFactory { applicationMonitor = new ApplicationMonitor(application); applicationMonitor.setHasStartupDependents(false); - // Starting the scheduler of the application monitor - applicationMonitor.startScheduler(); } finally { ApplicationHolder.releaseReadLock(); } - + //Creating the immediate dependencies applicationMonitor.startMinimumDependencies(application); + // Starting the scheduler of the application monitor + applicationMonitor.startScheduler(); return applicationMonitor; } http://git-wip-us.apache.org/repos/asf/stratos/blob/ab5d4470/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java index 309fe12..a92edde 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/ClusterMonitor.java @@ -520,7 +520,9 @@ public class ClusterMonitor extends Monitor { @Override public void destroy() { //shutting down the scheduler - schedulerFuture.cancel(true); + if(schedulerFuture != null) { + schedulerFuture.cancel(true); + } if (log.isDebugEnabled()) { log.debug("ClusterMonitor task has been stopped " + this.toString()); http://git-wip-us.apache.org/repos/asf/stratos/blob/ab5d4470/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 df972f0..87e035f 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 @@ -48,7 +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.GroupStatus; import org.apache.stratos.messaging.domain.instance.ApplicationInstance; -import org.apache.stratos.messaging.domain.instance.ClusterInstance; +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; @@ -78,7 +78,7 @@ public class ApplicationMonitor extends ParentComponentMonitor { TopologyInConsistentException { super(application); - int threadPoolSize = Integer.getInteger(AutoscalerConstants.MONITOR_THREAD_POOL_ID, 100); + int threadPoolSize = Integer.getInteger(AutoscalerConstants.MONITOR_THREAD_POOL_SIZE, 100); this.executorService = StratosThreadPool.getExecutorService( AutoscalerConstants.MONITOR_THREAD_POOL_ID, threadPoolSize); @@ -146,6 +146,18 @@ public class ApplicationMonitor extends ParentComponentMonitor { new ConcurrentHashMap<String, ScalingUpBeyondMaxEvent>()); } } + + Application application = ApplicationHolder.getApplications().getApplication(appId); + if (application != null) { + List<String> defaultNetworkPartitions = getDefaultNetworkPartitions(application); + //Checking for whether minimum application instances are there. + checkForMinimumApplicationInstances(application, defaultNetworkPartitions); + + //Checking for whether any application instances need to be terminated. + checkForApplicationInstanceTermination(application, defaultNetworkPartitions); + } + + } }; executorService.execute(monitoringRunnable); @@ -250,6 +262,95 @@ public class ApplicationMonitor extends ParentComponentMonitor { } } + public List<String> getDefaultNetworkPartitions(Application application) { + //Minimum check, Need to get the network partition + NetworkPartitionAlgorithmContext algorithmContext = AutoscalerContext.getInstance(). + getNetworkPartitionAlgorithmContext(appId); + ApplicationPolicy applicationPolicy = PolicyManager.getInstance(). + getApplicationPolicy(application.getApplicationPolicyId()); + List<String> defaultNetworkPartitions = new ArrayList<String>(); + + if (applicationPolicy != null) { + String networkPartitionAlgorithmName = applicationPolicy.getAlgorithm(); + if (log.isDebugEnabled()) { + String msg = String.format("Network partition algorithm is %s [application-id] %s", + networkPartitionAlgorithmName, appId); + log.debug(msg); + } + + NetworkPartitionAlgorithm algorithm = getNetworkPartitionAlgorithm( + networkPartitionAlgorithmName); + if (algorithm == null) { + String msg = String.format("Couldn't create network partition algorithm " + + "[application-id] %s", appId); + log.error(msg); + throw new RuntimeException(msg); + } + + + // Check whether the network-partition of the application + // instance belongs to default set of network-partitions. + // If it is default set, then application instance cannot be terminated. + defaultNetworkPartitions = algorithm. + getDefaultNetworkPartitions(algorithmContext); + } + + return defaultNetworkPartitions; + } + + private void checkForMinimumApplicationInstances(Application application, + List<String> defaultNetworkPartitions) { + List<String> instanceIds = new ArrayList<String>(); + for (String networkPartitionId : defaultNetworkPartitions) { + if (!networkPartitionContextsMap.containsKey(networkPartitionId)) { + String instanceId; + log.info("Detected a newly updated [network-partition] " + networkPartitionId + + " for [application] " + appId + ". Hence new application instance " + + "creation is going to start now!"); + ParentLevelNetworkPartitionContext context = + new ParentLevelNetworkPartitionContext(networkPartitionId); + //If application instances found in the ApplicationsTopology, + // then have to add them first before creating new one + ApplicationInstance appInstance = (ApplicationInstance) application. + getInstanceByNetworkPartitionId(context.getId()); + if (appInstance != null) { + log.warn("The [application] " + appId + " already has the " + + "[application-instance] " + appInstance.getInstanceId() + " for the " + + "[network-partition] " + networkPartitionId); + return; + } + instanceId = handleApplicationInstanceCreation(application, context, null); + instanceIds.add(instanceId); + + } + } + //Starting the dependencies + if(!instanceIds.isEmpty()) { + startDependency(application, instanceIds); + } + + } + + private void checkForApplicationInstanceTermination(Application application, + List<String> defaultNetworkPartitions) { + + for (NetworkPartitionContext networkPartitionContext : networkPartitionContextsMap.values()) { + String nPartitionId = networkPartitionContext.getId(); + if(!defaultNetworkPartitions.contains(nPartitionId)) { + log.info("The [application] " + appId + " runtime cannot be in [network-partition] " + + nPartitionId + " as it is removed from the [application-policy]...!"); + for(InstanceContext instanceContext: networkPartitionContext. + getInstanceIdToInstanceContextMap().values()) { + //Handling application instance termination + ApplicationBuilder.handleApplicationInstanceTerminatingEvent(this.appId, + instanceContext.getId()); + } + + } + } + + } + /** * Find the group monitor by traversing recursively in the hierarchical monitors. @@ -479,8 +580,8 @@ public class ApplicationMonitor extends ParentComponentMonitor { //Find whether any other instances exists in cluster // which has not been added to in-memory model in the restart Map<String, ApplicationInstance> instanceMap = application.getInstanceIdToInstanceContextMap(); - for(ApplicationInstance instance : instanceMap.values()) { - if(!instanceIds.contains(instance.getInstanceId())) { + for (ApplicationInstance instance : instanceMap.values()) { + if (!instanceIds.contains(instance.getInstanceId())) { ParentLevelNetworkPartitionContext context = new ParentLevelNetworkPartitionContext(instance.getNetworkPartitionId()); //If application instances found in the ApplicationsTopology, @@ -495,8 +596,9 @@ public class ApplicationMonitor extends ParentComponentMonitor { " [appInstanceId] " + instance.getInstanceId()); } } - - startDependency(application, instanceIds); + if(!instanceIds.isEmpty()) { + startDependency(application, instanceIds); + } } catch (Exception e) { log.error(String.format("Application instance creation failed [applcaition-id] %s", appId), e); http://git-wip-us.apache.org/repos/asf/stratos/blob/ab5d4470/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 7ef8ce4..4f60af9 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 @@ -187,7 +187,7 @@ public class GroupMonitor extends ParentComponentMonitor { if (log.isDebugEnabled()) { log.debug("Creating a group instance of [application] " + appId + " [group] " + id + - " as the the minimum required instances not met"); + " as the the minimum required instances are not met"); } createInstanceOnDemand(parentInstanceContext.getId()); http://git-wip-us.apache.org/repos/asf/stratos/blob/ab5d4470/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 963136f..6d40cf6 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 @@ -887,9 +887,6 @@ public class AutoscalerServiceImpl implements AutoscalerService { // validating application policy AutoscalerUtil.validateApplicationPolicy(applicationPolicy); - //Update application Monitor - - // updating application policy PolicyManager.getInstance().updateApplicationPolicy(applicationPolicy); return true;
