Repository: stratos Updated Branches: refs/heads/master 4b5a381bb -> a2749a9ec
http://git-wip-us.apache.org/repos/asf/stratos/blob/a2749a9e/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 105d3aa..98e97cf 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 @@ -70,8 +70,6 @@ public abstract class ParentComponentMonitor extends Monitor { //Scheduler executor service to execute this monitor in a thread private final ScheduledExecutorService scheduler = StratosThreadPool.getScheduledExecutorService( "autoscaler.monitor.scheduler.thread.pool", 100); - // future to cancel it when destroying monitors - private ScheduledFuture<?> schedulerFuture; //The monitors dependency tree with all the start-able/kill-able dependencies protected DependencyTree startupDependencyTree; //The monitors dependency tree with all the scaling dependencies @@ -86,6 +84,8 @@ public abstract class ParentComponentMonitor extends Monitor { protected Map<String, List<String>> terminatingInstancesMap; //network partition contexts protected Map<String, NetworkPartitionContext> networkPartitionContextsMap; + // future to cancel it when destroying monitors + private ScheduledFuture<?> schedulerFuture; //Executor service to maintain the thread pool private ExecutorService executorService; @@ -207,7 +207,7 @@ public abstract class ParentComponentMonitor extends Monitor { //starting a new instance of the child Monitor monitor = aliasToActiveChildMonitorsMap.get(context.getId()); //Creating the new instance - if(monitor instanceof ParentComponentMonitor) { + if (monitor instanceof ParentComponentMonitor) { ((ParentComponentMonitor) monitor).createInstanceOnTermination(instanceId); } else { monitor.createInstanceOnDemand(instanceId); @@ -244,12 +244,12 @@ public abstract class ParentComponentMonitor extends Monitor { Monitor monitor = aliasToActiveChildMonitorsMap.get(context.getId()); // Creating new instance for (String instanceId : parentInstanceIds) { - if(monitor.getInstancesByParentInstanceId(instanceId) == null || + if (monitor.getInstancesByParentInstanceId(instanceId) == null || monitor.getInstancesByParentInstanceId(instanceId).isEmpty()) { monitor.createInstanceOnDemand(instanceId); } else { log.info(String.format("Instance has already exists for [application] " + - "%s [component] %s [instance-id] %s", getAppId(), + "%s [component] %s [instance-id] %s", getAppId(), context.getId(), instanceId)); } } @@ -275,7 +275,7 @@ public abstract class ParentComponentMonitor extends Monitor { if (networkPartitionContext != null) { InstanceContext instanceContext = networkPartitionContext. getInstanceContext(instanceId); - ParentInstanceContext parentInstanceContext = (ParentInstanceContext)instanceContext; + ParentInstanceContext parentInstanceContext = (ParentInstanceContext) instanceContext; if (instanceContext != null) { if (parentInstanceContext.containsScalingEvent(id)) { parentInstanceContext.removeScalingEvent(id); @@ -302,7 +302,7 @@ public abstract class ParentComponentMonitor extends Monitor { String instanceId = scalingDownBeyondMinEvent.getInstanceId(); InstanceContext instanceContext = getNetworkPartitionContext(networkPartitionId). getInstanceContext(instanceId); - ((ParentInstanceContext)instanceContext).addScalingDownBeyondMinEvent(scalingDownBeyondMinEvent); + ((ParentInstanceContext) instanceContext).addScalingDownBeyondMinEvent(scalingDownBeyondMinEvent); } @Override @@ -323,7 +323,7 @@ public abstract class ParentComponentMonitor extends Monitor { InstanceContext instanceContext = networkPartitionContext. getInstanceContext(instanceId); if (instanceContext != null) { - ParentInstanceContext parentInstanceContext = (ParentInstanceContext)instanceContext; + ParentInstanceContext parentInstanceContext = (ParentInstanceContext) instanceContext; if (parentInstanceContext.containsScalingEvent(id)) { parentInstanceContext.removeScalingOverMaxEvent(id); parentInstanceContext.addScalingOverMaxEvent(scalingUpBeyondMaxEvent); @@ -362,18 +362,18 @@ public abstract class ParentComponentMonitor extends Monitor { // no need to invoke start dependencies. Monitor childMonitor = aliasToActiveChildMonitorsMap.get(childId); - if(childMonitor != null) { + if (childMonitor != null) { Instance instance = childMonitor.getInstance(instanceId); boolean firstIteration = false; - if(instance != null) { - if(instance instanceof GroupInstance) { - GroupInstance groupInstance = (GroupInstance)instance; + if (instance != null) { + if (instance instanceof GroupInstance) { + GroupInstance groupInstance = (GroupInstance) instance; firstIteration = groupInstance.getPreviousState() == GroupStatus.Created; - } else if(instance instanceof ClusterInstance) { - ClusterInstance clusterInstance = (ClusterInstance)instance; + } else if (instance instanceof ClusterInstance) { + ClusterInstance clusterInstance = (ClusterInstance) instance; firstIteration = clusterInstance.getPreviousState() == ClusterStatus.Created; } - if(firstIteration || childMonitor.hasStartupDependents()) { + if (firstIteration || childMonitor.hasStartupDependents()) { startDep = startDependency(childId, instanceId); } } else { @@ -666,9 +666,9 @@ public abstract class ParentComponentMonitor extends Monitor { } } - if(log.isDebugEnabled()) { + if (log.isDebugEnabled()) { log.debug(String.format("Calculating the group instances status for [application] " + - "%s [group] %s [group-instance] %s [required-status] %s [no-of-instances] %s", + "%s [group] %s [group-instance] %s [required-status] %s [no-of-instances] %s", appId, childId, instanceId, requiredStatus.toString(), noOfInstancesOfRequiredStatus)); } @@ -681,14 +681,14 @@ public abstract class ParentComponentMonitor extends Monitor { //if terminated all the instances in this instances map should be in terminated state if (noOfInstancesOfRequiredStatus == this.inactiveInstancesMap.size() && requiredStatus == GroupStatus.Terminated) { - if(log.isDebugEnabled()) { + if (log.isDebugEnabled()) { log.debug(String.format("Group instances in required status for [application] " + "%s [group] %s [group-instance] %s [required-status] %s", appId, childId, instanceId, GroupStatus.Terminated.toString())); } return true; } else if (noOfInstancesOfRequiredStatus >= minInstances) { - if(log.isDebugEnabled()) { + if (log.isDebugEnabled()) { log.debug(String.format("Group instances in required status for [application] " + "%s [group] %s [group-instance] %s [required-status] %s", appId, childId, instanceId, requiredStatus.toString())); @@ -697,7 +697,7 @@ public abstract class ParentComponentMonitor extends Monitor { } else { //of only one is inActive implies that the whole group is Inactive if (requiredStatus == GroupStatus.Inactive && noOfInstancesOfRequiredStatus >= 1) { - if(log.isDebugEnabled()) { + if (log.isDebugEnabled()) { log.debug(String.format("Group instances in required status for [application] " + "%s [group] %s [group-instance] %s [required-status] %s", appId, childId, instanceId, GroupStatus.Inactive.toString())); http://git-wip-us.apache.org/repos/asf/stratos/blob/a2749a9e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/PolicyManager.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/PolicyManager.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/PolicyManager.java index e7fc57c..3336776 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/PolicyManager.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/policy/PolicyManager.java @@ -55,8 +55,12 @@ public class PolicyManager { private static Map<String, ApplicationPolicy> applicationPolicyListMap; - public Collection<DeploymentPolicy> getDeploymentPolicies() { - return deploymentPolicyListMap.values(); + private PolicyManager() { + // Initialize distributed object provider + DistributedObjectProvider distributedObjectProvider = ServiceReferenceHolder.getInstance().getDistributedObjectProvider(); + autoscalePolicyListMap = distributedObjectProvider.getMap(AS_POLICY_ID_TO_AUTOSCALE_POLICY_MAP); + deploymentPolicyListMap = distributedObjectProvider.getMap(DEPLOYMENT_POLICY_ID_TO_DEPLOYMENT_POLICY_MAP); + applicationPolicyListMap = distributedObjectProvider.getMap(APPLICATION_ID_TO_APPLICATION_POLICY_MAP); } /* An instance of a PolicyManager is created when the class is loaded. @@ -64,20 +68,12 @@ public class PolicyManager { * PolicyManager is created only once. Hence it is singleton. */ - private static class InstanceHolder { - private static final PolicyManager INSTANCE = new PolicyManager(); - } - public static PolicyManager getInstance() { return InstanceHolder.INSTANCE; } - private PolicyManager() { - // Initialize distributed object provider - DistributedObjectProvider distributedObjectProvider = ServiceReferenceHolder.getInstance().getDistributedObjectProvider(); - autoscalePolicyListMap = distributedObjectProvider.getMap(AS_POLICY_ID_TO_AUTOSCALE_POLICY_MAP); - deploymentPolicyListMap = distributedObjectProvider.getMap(DEPLOYMENT_POLICY_ID_TO_DEPLOYMENT_POLICY_MAP); - applicationPolicyListMap = distributedObjectProvider.getMap(APPLICATION_ID_TO_APPLICATION_POLICY_MAP); + public Collection<DeploymentPolicy> getDeploymentPolicies() { + return deploymentPolicyListMap.values(); } // Add the policy to information model and persist. @@ -120,7 +116,6 @@ public class PolicyManager { return true; } - /** * Add deployment policy to in memory map and persist. * @@ -276,7 +271,6 @@ public class PolicyManager { return autoscalePolicyListMap.get(id); } - private void addDeploymentPolicyToPolicyListMap(DeploymentPolicy policy) { if (StringUtils.isEmpty(policy.getDeploymentPolicyID())) { throw new RuntimeException("Application id is not found in the deployment policy"); @@ -347,7 +341,6 @@ public class PolicyManager { return deploymentPolicyListMap.get(id); } - public void addApplicationPolicy(ApplicationPolicy applicationPolicy) throws InvalidApplicationPolicyException { String applicationPolicyId = applicationPolicy.getId(); if (log.isInfoEnabled()) { @@ -426,4 +419,8 @@ public class PolicyManager { public ApplicationPolicy[] getApplicationPolicies() { return applicationPolicyListMap.values().toArray(new ApplicationPolicy[0]); } + + private static class InstanceHolder { + private static final PolicyManager INSTANCE = new PolicyManager(); + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/a2749a9e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/AutoscalerRuleEvaluator.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/AutoscalerRuleEvaluator.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/AutoscalerRuleEvaluator.java index 3688c6b..b871e97 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/AutoscalerRuleEvaluator.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/AutoscalerRuleEvaluator.java @@ -41,9 +41,8 @@ import java.util.Map; public class AutoscalerRuleEvaluator { private static final Log log = LogFactory.getLog(AutoscalerRuleEvaluator.class); - - private Map<String, KnowledgeBase> knowledgeBases; private static volatile AutoscalerRuleEvaluator instance; + private Map<String, KnowledgeBase> knowledgeBases; private AutoscalerRuleEvaluator() { knowledgeBases = new HashMap<String, KnowledgeBase>(); @@ -67,6 +66,24 @@ public class AutoscalerRuleEvaluator { return instance; } + private static KnowledgeBase readKnowledgeBase(String drlFileName) { + KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); + String configDir = CarbonUtils.getCarbonConfigDirPath(); + String droolsDir = configDir + File.separator + StratosConstants.DROOLS_DIR_NAME; + Resource resource = ResourceFactory.newFileResource(droolsDir + File.separator + drlFileName); + kbuilder.add(resource, ResourceType.DRL); + KnowledgeBuilderErrors errors = kbuilder.getErrors(); + if (errors.size() > 0) { + for (KnowledgeBuilderError error : errors) { + log.error(error.getMessage()); + } + throw new IllegalArgumentException("Could not parse knowledge"); + } + KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); + kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); + return kbase; + } + public void parseAndBuildKnowledgeBaseForDroolsFile(String drlFileName) { KnowledgeBase knowledgeBase = readKnowledgeBase(drlFileName); if (knowledgeBase == null) { @@ -87,22 +104,4 @@ public class AutoscalerRuleEvaluator { ksession.setGlobal("log", RuleLog.getInstance()); return ksession; } - - private static KnowledgeBase readKnowledgeBase(String drlFileName) { - KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); - String configDir = CarbonUtils.getCarbonConfigDirPath(); - String droolsDir = configDir + File.separator + StratosConstants.DROOLS_DIR_NAME; - Resource resource = ResourceFactory.newFileResource(droolsDir + File.separator + drlFileName); - kbuilder.add(resource, ResourceType.DRL); - KnowledgeBuilderErrors errors = kbuilder.getErrors(); - if (errors.size() > 0) { - for (KnowledgeBuilderError error : errors) { - log.error(error.getMessage()); - } - throw new IllegalArgumentException("Could not parse knowledge"); - } - KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); - kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); - return kbase; - } } http://git-wip-us.apache.org/repos/asf/stratos/blob/a2749a9e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java index 89633f7..1a8bfc9 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java @@ -43,9 +43,8 @@ import org.apache.stratos.common.constants.StratosConstants; */ public class RuleTasksDelegator { - private static boolean arspiIsSet = false; - private static final Log log = LogFactory.getLog(RuleTasksDelegator.class); + private static boolean arspiIsSet = false; public double getPredictedValueForNextMinute(float average, float gradient, float secondDerivative, int timeInterval) { double predictedValue; http://git-wip-us.apache.org/repos/asf/stratos/blob/a2749a9e/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 52c8dbe..f75fbc5 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 @@ -491,7 +491,7 @@ public class AutoscalerServiceImpl implements AutoscalerService { return false; } else { log.info(String.format("Previous graceful un-deployment is in progress for " + - "[application-id] %s , thus terminating instances directly", + "[application-id] %s , thus terminating instances directly", applicationId)); appMonitor.setForce(true); terminateAllMembersAndClustersForcefully(applicationId); @@ -926,15 +926,15 @@ public class AutoscalerServiceImpl implements AutoscalerService { //Stopping the cluster monitor thread ClusterMonitor clusterMonitor = AutoscalerContext.getInstance(). getClusterMonitor(clusterId); - if(clusterMonitor != null) { + if (clusterMonitor != null) { clusterMonitor.destroy(); } else { - if(log.isDebugEnabled()) { + if (log.isDebugEnabled()) { log.debug(String.format("Cluster monitor cannot be found for [application] %s " + "[cluster] %s", applicationId, clusterId)); } } - if(cluster != null) { + if (cluster != null) { Collection<ClusterInstance> allClusterInstances = cluster.getClusterInstances(); for (ClusterInstance clusterInstance : allClusterInstances) { ClusterStatusEventPublisher.sendClusterTerminatedEvent(applicationId, cluster.getServiceName(), @@ -1132,7 +1132,7 @@ public class AutoscalerServiceImpl implements AutoscalerService { for (NetworkPartitionRef networkPartition : deploymentPolicy.getNetworkPartitionRefs()) { NetworkPartitionContext clusterLevelNetworkPartitionContext = clusterMonitor.getClusterContext().getNetworkPartitionCtxt(networkPartition.getId()); - if(clusterLevelNetworkPartitionContext != null) { + if (clusterLevelNetworkPartitionContext != null) { try { addNewPartitionsToClusterMonitor(clusterLevelNetworkPartitionContext, networkPartition, deploymentPolicy.getDeploymentPolicyID(), clusterMonitor.getClusterContext().getServiceId()); http://git-wip-us.apache.org/repos/asf/stratos/blob/a2749a9e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java index b76322c..24a4e07 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java @@ -80,10 +80,6 @@ public class AutoscalerUtil { return Holder.INSTANCE; } - private static class Holder { - private static final AutoscalerUtil INSTANCE = new AutoscalerUtil(); - } - public static Applications getApplications() { Applications applications; @@ -266,80 +262,6 @@ public class AutoscalerUtil { return toCommonProperties(properties); } - public synchronized void startApplicationMonitor(String applicationId) { - - AutoscalerContext autoscalerContext = AutoscalerContext.getInstance(); - if (autoscalerContext.getAppMonitor(applicationId) == null) { - autoscalerContext.addApplicationPendingMonitor(applicationId); - ServiceReferenceHolder.getInstance().getExecutorService().submit(new ApplicationMonitorAdder(applicationId)); - - log.info(String.format("Monitor scheduled: [application] %s ", applicationId)); - } else { - if (log.isDebugEnabled()) { - log.debug(String.format("Application monitor thread already exists: " + - "[application] %s ", applicationId)); - } - } - } - - private class ApplicationMonitorAdder implements Runnable { - private String applicationId; - - public ApplicationMonitorAdder(String applicationId) { - this.applicationId = applicationId; - } - - public void run() { - long startTime = System.currentTimeMillis(); - long endTime = startTime; - int retries = 5; - boolean success = false; - ApplicationMonitor applicationMonitor = null; - while (!success && retries != 0) { - - try { - startTime = System.currentTimeMillis(); - log.info("Starting monitor: [application] " + applicationId); - try { - applicationMonitor = MonitorFactory.getApplicationMonitor(applicationId); - } catch (PolicyValidationException e) { - String msg = "Monitor creation failed: [application] " + applicationId; - log.warn(msg, e); - retries--; - } - success = true; - endTime = System.currentTimeMillis(); - } catch (DependencyBuilderException e) { - String msg = "Monitor creation failed: [application] " + applicationId; - log.warn(msg, e); - retries--; - } catch (TopologyInConsistentException e) { - String msg = "Monitor creation failed: [application] " + applicationId; - log.warn(msg, e); - retries--; - } - } - - if (applicationMonitor == null) { - String msg = "Monitor creation failed, even after retrying for 5 times: " - + "[application] " + applicationId; - log.error(msg); - throw new RuntimeException(msg); - } - AutoscalerContext autoscalerContext = AutoscalerContext.getInstance(); - autoscalerContext.removeApplicationPendingMonitor(applicationId); - autoscalerContext.removeAppMonitor(applicationId); - autoscalerContext.addAppMonitor(applicationMonitor); - - long startupTime = ((endTime - startTime) / 1000); - if (log.isInfoEnabled()) { - log.info(String.format("Monitor started successfully: [application] %s [dependents] %s " + - "[startup-time] %d seconds", applicationMonitor.getId(), - applicationMonitor.getStartupDependencyTree(), startupTime)); - } - } - } - public static Monitor.MonitorType findMonitorType(ApplicationChildContext context) { if (context instanceof GroupChildContext) { return Monitor.MonitorType.Group; @@ -711,7 +633,6 @@ public class AutoscalerUtil { } } - /** * Validates an application policy against the application * @@ -787,6 +708,150 @@ public class AutoscalerUtil { return false; } + public static void validateStartupOrders(String groupName, String[] startupOrders) throws InvalidServiceGroupException { + + if (startupOrders == null || startupOrders.length == 0) { + if (log.isDebugEnabled()) { + log.debug("No Startup Order defined for group " + groupName); + } + return; + } + + for (String startupOrder : startupOrders) { + // split comma separated startup orders + String[] splittedStartupOrders = startupOrder.split(","); + for (String splittedStartupOrder : splittedStartupOrders) { + if (!splittedStartupOrder.trim().startsWith("cartridge.") && !splittedStartupOrder.trim().startsWith("group.")) { + // invalid startup order; should prefixed by either 'cartridge.' or 'group.' + throw new InvalidServiceGroupException("Invalid cartridge group: startup order [" + startupOrder + + "] for group " + groupName + + ", should prefixed by either 'cartridge.' or 'group.'"); + } + } + } + } + + public static void validateScalingDependencies(String groupName, String[] scalingDependents) throws InvalidServiceGroupException { + + if (scalingDependents == null || scalingDependents.length == 0) { + if (log.isDebugEnabled()) { + log.debug("No Scaling Dependents defined for group " + groupName); + } + return; + } + + for (String scalingDependent : scalingDependents) { + // split comma separated scaling dependents + String[] splittedDependents = scalingDependent.split(","); + for (String splittedDependent : splittedDependents) { + if (!splittedDependent.trim().startsWith("cartridge.") && !splittedDependent.trim().startsWith("group.")) { + // invalid startup order; should prefixed by either 'cartridge.' or 'group.' + throw new InvalidServiceGroupException("Invalid cartridge group: Scaling Dependency [" + + scalingDependent + "] for group " + groupName + + ", should prefixed by either 'cartridge.' or 'group.'"); + } + } + } + } + + /** + * Validate the Auto Scalar policy removal + * + * @param autoscalePolicyId Auto Scalar policy id boolean + * @return + */ + public static boolean removableAutoScalerPolicy(String autoscalePolicyId) { + Collection<ApplicationContext> applicationContexts = AutoscalerContext.getInstance(). + getApplicationContexts(); + for (ApplicationContext applicationContext : applicationContexts) { + if (applicationContext.getComponents().getCartridgeContexts() != null) { + for (CartridgeContext cartridgeContext : applicationContext.getComponents(). + getCartridgeContexts()) { + if (autoscalePolicyId.equals(cartridgeContext.getSubscribableInfoContext(). + getAutoscalingPolicy())) { + return false; + } + } + } + + if (applicationContext.getComponents().getGroupContexts() != null) { + return findAutoscalingPolicyInGroup(applicationContext.getComponents().getGroupContexts(), + autoscalePolicyId); + } + } + return true; + } + + public static boolean findAutoscalingPolicyInGroup(GroupContext[] groupContexts, + String autoscalePolicyId) { + for (GroupContext groupContext : groupContexts) { + if (groupContext.getCartridgeContexts() != null) { + for (CartridgeContext cartridgeContext : groupContext.getCartridgeContexts()) { + if (autoscalePolicyId.equals(cartridgeContext.getSubscribableInfoContext(). + getAutoscalingPolicy())) { + return false; + } + } + + } + if (groupContext.getGroupContexts() != null) { + return findAutoscalingPolicyInGroup(groupContext.getGroupContexts(), + autoscalePolicyId); + } + } + return true; + } + + /** + * Validate the deployment policy removal + * + * @param deploymentPolicyId + * @return + */ + public static boolean removableDeploymentPolicy(String deploymentPolicyId) { + boolean canRemove = true; + Map<String, Application> applications = ApplicationHolder.getApplications().getApplications(); + for (Application application : applications.values()) { + List<String> deploymentPolicyIdsReferredInApplication = AutoscalerUtil. + getDeploymentPolicyIdsReferredInApplication(application.getUniqueIdentifier()); + for (String deploymentPolicyIdInApp : deploymentPolicyIdsReferredInApplication) { + if (deploymentPolicyId.equals(deploymentPolicyIdInApp)) { + canRemove = false; + } + } + } + return canRemove; + } + + public static void readApplicationContextsFromRegistry() { + String[] resourcePaths = RegistryManager.getInstance().getApplicationContextResourcePaths(); + if ((resourcePaths == null) || (resourcePaths.length == 0)) { + return; + } + + for (String resourcePath : resourcePaths) { + ApplicationContext applicationContext = RegistryManager.getInstance(). + getApplicationContextByResourcePath(resourcePath); + AutoscalerContext.getInstance().addApplicationContext(applicationContext); + } + } + + public synchronized void startApplicationMonitor(String applicationId) { + + AutoscalerContext autoscalerContext = AutoscalerContext.getInstance(); + if (autoscalerContext.getAppMonitor(applicationId) == null) { + autoscalerContext.addApplicationPendingMonitor(applicationId); + ServiceReferenceHolder.getInstance().getExecutorService().submit(new ApplicationMonitorAdder(applicationId)); + + log.info(String.format("Monitor scheduled: [application] %s ", applicationId)); + } else { + if (log.isDebugEnabled()) { + log.debug(String.format("Application monitor thread already exists: " + + "[application] %s ", applicationId)); + } + } + } + public void updateApplicationsTopology(Application application) throws ApplicationDefinitionException { Application existingApplication = ApplicationHolder.getApplications(). @@ -889,133 +954,66 @@ public class AutoscalerUtil { } } - public static void validateStartupOrders(String groupName, String[] startupOrders) throws InvalidServiceGroupException { - - if (startupOrders == null || startupOrders.length == 0) { - if (log.isDebugEnabled()) { - log.debug("No Startup Order defined for group " + groupName); - } - return; - } - - for (String startupOrder : startupOrders) { - // split comma separated startup orders - String[] splittedStartupOrders = startupOrder.split(","); - for (String splittedStartupOrder : splittedStartupOrders) { - if (!splittedStartupOrder.trim().startsWith("cartridge.") && !splittedStartupOrder.trim().startsWith("group.")) { - // invalid startup order; should prefixed by either 'cartridge.' or 'group.' - throw new InvalidServiceGroupException("Invalid cartridge group: startup order [" + startupOrder + - "] for group " + groupName + - ", should prefixed by either 'cartridge.' or 'group.'"); - } - } - } + private static class Holder { + private static final AutoscalerUtil INSTANCE = new AutoscalerUtil(); } - public static void validateScalingDependencies(String groupName, String[] scalingDependents) throws InvalidServiceGroupException { + private class ApplicationMonitorAdder implements Runnable { + private String applicationId; - if (scalingDependents == null || scalingDependents.length == 0) { - if (log.isDebugEnabled()) { - log.debug("No Scaling Dependents defined for group " + groupName); - } - return; + public ApplicationMonitorAdder(String applicationId) { + this.applicationId = applicationId; } - for (String scalingDependent : scalingDependents) { - // split comma separated scaling dependents - String[] splittedDependents = scalingDependent.split(","); - for (String splittedDependent : splittedDependents) { - if (!splittedDependent.trim().startsWith("cartridge.") && !splittedDependent.trim().startsWith("group.")) { - // invalid startup order; should prefixed by either 'cartridge.' or 'group.' - throw new InvalidServiceGroupException("Invalid cartridge group: Scaling Dependency [" + - scalingDependent + "] for group " + groupName + - ", should prefixed by either 'cartridge.' or 'group.'"); - } - } - } - } + public void run() { + long startTime = System.currentTimeMillis(); + long endTime = startTime; + int retries = 5; + boolean success = false; + ApplicationMonitor applicationMonitor = null; + while (!success && retries != 0) { - /** - * Validate the Auto Scalar policy removal - * - * @param autoscalePolicyId Auto Scalar policy id boolean - * @return - */ - public static boolean removableAutoScalerPolicy(String autoscalePolicyId) { - Collection<ApplicationContext> applicationContexts = AutoscalerContext.getInstance(). - getApplicationContexts(); - for (ApplicationContext applicationContext : applicationContexts) { - if(applicationContext.getComponents().getCartridgeContexts() != null) { - for(CartridgeContext cartridgeContext : applicationContext.getComponents(). - getCartridgeContexts()) { - if(autoscalePolicyId.equals(cartridgeContext.getSubscribableInfoContext(). - getAutoscalingPolicy())) { - return false; + try { + startTime = System.currentTimeMillis(); + log.info("Starting monitor: [application] " + applicationId); + try { + applicationMonitor = MonitorFactory.getApplicationMonitor(applicationId); + } catch (PolicyValidationException e) { + String msg = "Monitor creation failed: [application] " + applicationId; + log.warn(msg, e); + retries--; } + success = true; + endTime = System.currentTimeMillis(); + } catch (DependencyBuilderException e) { + String msg = "Monitor creation failed: [application] " + applicationId; + log.warn(msg, e); + retries--; + } catch (TopologyInConsistentException e) { + String msg = "Monitor creation failed: [application] " + applicationId; + log.warn(msg, e); + retries--; } } - if(applicationContext.getComponents().getGroupContexts() != null) { - return findAutoscalingPolicyInGroup(applicationContext.getComponents().getGroupContexts(), - autoscalePolicyId); - } - } - return true; - } - - public static boolean findAutoscalingPolicyInGroup(GroupContext[] groupContexts, - String autoscalePolicyId) { - for(GroupContext groupContext : groupContexts) { - if(groupContext.getCartridgeContexts() != null) { - for(CartridgeContext cartridgeContext : groupContext.getCartridgeContexts()) { - if(autoscalePolicyId.equals(cartridgeContext.getSubscribableInfoContext(). - getAutoscalingPolicy())) { - return false; - } - } - - } - if(groupContext.getGroupContexts() != null) { - return findAutoscalingPolicyInGroup(groupContext.getGroupContexts(), - autoscalePolicyId); + if (applicationMonitor == null) { + String msg = "Monitor creation failed, even after retrying for 5 times: " + + "[application] " + applicationId; + log.error(msg); + throw new RuntimeException(msg); } - } - return true; - } - + AutoscalerContext autoscalerContext = AutoscalerContext.getInstance(); + autoscalerContext.removeApplicationPendingMonitor(applicationId); + autoscalerContext.removeAppMonitor(applicationId); + autoscalerContext.addAppMonitor(applicationMonitor); - /** - * Validate the deployment policy removal - * - * @param deploymentPolicyId - * @return - */ - public static boolean removableDeploymentPolicy(String deploymentPolicyId) { - boolean canRemove = true; - Map<String, Application> applications = ApplicationHolder.getApplications().getApplications(); - for (Application application : applications.values()) { - List<String> deploymentPolicyIdsReferredInApplication = AutoscalerUtil. - getDeploymentPolicyIdsReferredInApplication(application.getUniqueIdentifier()); - for (String deploymentPolicyIdInApp : deploymentPolicyIdsReferredInApplication) { - if (deploymentPolicyId.equals(deploymentPolicyIdInApp)) { - canRemove = false; - } + long startupTime = ((endTime - startTime) / 1000); + if (log.isInfoEnabled()) { + log.info(String.format("Monitor started successfully: [application] %s [dependents] %s " + + "[startup-time] %d seconds", applicationMonitor.getId(), + applicationMonitor.getStartupDependencyTree(), startupTime)); } } - return canRemove; - } - - public static void readApplicationContextsFromRegistry() { - String[] resourcePaths = RegistryManager.getInstance().getApplicationContextResourcePaths(); - if ((resourcePaths == null) || (resourcePaths.length == 0)) { - return; - } - - for (String resourcePath : resourcePaths) { - ApplicationContext applicationContext = RegistryManager.getInstance(). - getApplicationContextByResourcePath(resourcePath); - AutoscalerContext.getInstance().addApplicationContext( applicationContext); - } } } http://git-wip-us.apache.org/repos/asf/stratos/blob/a2749a9e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/ConfUtil.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/ConfUtil.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/ConfUtil.java index 28c5f66..969490e 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/ConfUtil.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/ConfUtil.java @@ -34,12 +34,10 @@ import java.util.HashMap; public class ConfUtil { private static Log log = LogFactory.getLog(ConfUtil.class); - - private XMLConfiguration config; - //To maintain the map of config files private static HashMap<String, ConfUtil> instanceMap = new HashMap<String, ConfUtil>(); private static Object mutex = new Object(); + private XMLConfiguration config; private ConfUtil(String configFilePath) { try { http://git-wip-us.apache.org/repos/asf/stratos/blob/a2749a9e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/ServiceReferenceHolder.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/ServiceReferenceHolder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/ServiceReferenceHolder.java index 36b048e..4cc175c 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/ServiceReferenceHolder.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/ServiceReferenceHolder.java @@ -60,38 +60,38 @@ public class ServiceReferenceHolder { return instance; } - public void setAxisConfiguration(AxisConfiguration axisConfiguration) { - this.axisConfiguration = axisConfiguration; - } - public AxisConfiguration getAxisConfiguration() { return axisConfiguration; } - public void setDistributedObjectProvider(DistributedObjectProvider distributedObjectProvider) { - this.distributedObjectProvider = distributedObjectProvider; + public void setAxisConfiguration(AxisConfiguration axisConfiguration) { + this.axisConfiguration = axisConfiguration; } public DistributedObjectProvider getDistributedObjectProvider() { return distributedObjectProvider; } - public void setHazelcastInstance(HazelcastInstance hazelcastInstance) { - this.hazelcastInstance = hazelcastInstance; + public void setDistributedObjectProvider(DistributedObjectProvider distributedObjectProvider) { + this.distributedObjectProvider = distributedObjectProvider; } public HazelcastInstance getHazelcastInstance() { return hazelcastInstance; } - public void setRegistry(UserRegistry governanceSystemRegistry) { - registry = governanceSystemRegistry; + public void setHazelcastInstance(HazelcastInstance hazelcastInstance) { + this.hazelcastInstance = hazelcastInstance; } public Registry getRegistry() { return registry; } + public void setRegistry(UserRegistry governanceSystemRegistry) { + registry = governanceSystemRegistry; + } + public TaskService getTaskService() { return taskService; } @@ -116,19 +116,19 @@ public class ServiceReferenceHolder { this.groupStatusProcessorChain = groupStatusProcessorChain; } - public void setExecutorService(ExecutorService executorService) { - this.executorService = executorService; - } - public ExecutorService getExecutorService() { return executorService; } - public void setComponentStartUpSynchronizer(ComponentStartUpSynchronizer componentStartUpSynchronizer) { - this.componentStartUpSynchronizer = componentStartUpSynchronizer; + public void setExecutorService(ExecutorService executorService) { + this.executorService = executorService; } public ComponentStartUpSynchronizer getComponentStartUpSynchronizer() { return componentStartUpSynchronizer; } + + public void setComponentStartUpSynchronizer(ComponentStartUpSynchronizer componentStartUpSynchronizer) { + this.componentStartUpSynchronizer = componentStartUpSynchronizer; + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/a2749a9e/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/AutoscalerUtilTest.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/AutoscalerUtilTest.java b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/AutoscalerUtilTest.java index 2f65281..c676ed1 100644 --- a/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/AutoscalerUtilTest.java +++ b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/AutoscalerUtilTest.java @@ -79,7 +79,7 @@ public class AutoscalerUtilTest { @Test public void testRemovalOfAutoscalingPolicy() { List<CartridgeContext> cartridgeContexts = new ArrayList<CartridgeContext>(); - for(int i = 0; i < 12; i++) { + for (int i = 0; i < 12; i++) { CartridgeContext cartridgeContext = new CartridgeContext(); SubscribableInfoContext subscribableContext = new SubscribableInfoContext(); subscribableContext.setAlias("cart-" + i); @@ -89,12 +89,12 @@ public class AutoscalerUtilTest { cartridgeContexts.add(cartridgeContext); } List<GroupContext> groupContextList = new ArrayList<GroupContext>(); - for(int i = 0; i < 5; i++) { + for (int i = 0; i < 5; i++) { GroupContext groupContext = new GroupContext(); groupContext.setAlias("group-" + i); CartridgeContext[] cartridgeContexts1 = new CartridgeContext[2]; cartridgeContexts1[0] = cartridgeContexts.get(i); - cartridgeContexts1[1] = cartridgeContexts.get(i+5); + cartridgeContexts1[1] = cartridgeContexts.get(i + 5); groupContext.setCartridgeContexts(cartridgeContexts1); groupContextList.add(groupContext); @@ -123,7 +123,7 @@ public class AutoscalerUtilTest { canRemove = AutoscalerUtil.removableAutoScalerPolicy("test"); assertEquals(canRemove, true); - for(int i = 0; i < 12; i ++) { + for (int i = 0; i < 12; i++) { canRemove = AutoscalerUtil.removableAutoScalerPolicy("auto-" + i); assertEquals(canRemove, false); http://git-wip-us.apache.org/repos/asf/stratos/blob/a2749a9e/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestMinimumRule.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestMinimumRule.java b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestMinimumRule.java index 2928d2d..e140209 100644 --- a/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestMinimumRule.java +++ b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestMinimumRule.java @@ -45,6 +45,10 @@ public class TestMinimumRule { private StatefulKnowledgeSession ksession; private XMLConfiguration conf; + public static String get() { + return "null"; + } + @Before public void setUp() { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); @@ -95,8 +99,4 @@ public class TestMinimumRule { assertEquals(true, TestDelegator.isMinRuleFired()); } - - public static String get() { - return "null"; - } } http://git-wip-us.apache.org/repos/asf/stratos/blob/a2749a9e/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestObsoletedMemberRule.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestObsoletedMemberRule.java b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestObsoletedMemberRule.java index 2654529..bd75a63 100644 --- a/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestObsoletedMemberRule.java +++ b/components/org.apache.stratos.autoscaler/src/test/java/org/apache/stratos/autoscaler/TestObsoletedMemberRule.java @@ -46,6 +46,10 @@ public class TestObsoletedMemberRule { private StatefulKnowledgeSession ksession; private XMLConfiguration conf; + public static String get() { + return "null"; + } + @Before public void setUp() { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); @@ -171,8 +175,4 @@ public class TestObsoletedMemberRule { } - - public static String get() { - return "null"; - } }
