Updated Branches: refs/heads/master 20612592e -> 36c403a7f
Removing old rules scheduler and adding delegator class for utility tasks done by rules Project: http://git-wip-us.apache.org/repos/asf/incubator-stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-stratos/commit/71ac3524 Tree: http://git-wip-us.apache.org/repos/asf/incubator-stratos/tree/71ac3524 Diff: http://git-wip-us.apache.org/repos/asf/incubator-stratos/diff/71ac3524 Branch: refs/heads/master Commit: 71ac352405a5f4f1ba19fdb30d1182e9d830a408 Parents: 9c1afd0 Author: Lahiru Sandaruwan <[email protected]> Authored: Thu Dec 12 09:16:50 2013 +0530 Committer: Lahiru Sandaruwan <[email protected]> Committed: Thu Dec 12 09:16:50 2013 +0530 ---------------------------------------------------------------------- .../autoscaler/NetworkPartitionContext.java | 24 ++-- .../internal/AutoscalerServerComponent.java | 13 +-- .../rule/AutoscalerRuleEvaluator.java | 111 +----------------- .../autoscaler/rule/ExecutorTaskScheduler.java | 89 --------------- .../autoscaler/rule/RuleTasksDelegator.java | 114 +++++++++++++++++++ .../distribution/src/main/conf/mincheck.drl | 6 +- .../distribution/src/main/conf/scaling.drl | 22 ++-- 7 files changed, 155 insertions(+), 224 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/71ac3524/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java index a41d332..b4595f6 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/NetworkPartitionContext.java @@ -51,7 +51,7 @@ public class NetworkPartitionContext { //details required for partition selection algorithms private int currentPartitionIndex; - private Map<String, Integer> partitionCountMap; + private Map<String, Integer> partitionToMemberCountMap; //partitions of this network partition private Map<String, PartitionContext> partitionCtxts; @@ -62,6 +62,7 @@ public class NetworkPartitionContext { this.id = id; this.setServiceToLBClusterId(new HashMap<String, String>()); this.setClusterIdToLBClusterIdMap(new HashMap<String, String>()); + partitionToMemberCountMap = new HashMap<String, Integer>(); } @@ -235,30 +236,30 @@ public class NetworkPartitionContext { public void increaseMemberCountInPartitionBy(String partitionId, int count){ - partitionCountMap.put(partitionId, getMemberCount(partitionId) + count); + partitionToMemberCountMap.put(partitionId, getMemberCount(partitionId) + count); } public void decreaseMemberCountInPartitionBy(String partitionId, int count){ - partitionCountMap.put(partitionId, getMemberCount(partitionId) - count); + partitionToMemberCountMap.put(partitionId, getMemberCount(partitionId) - count); } public void addPartitionCount(String partitionId, int count){ - partitionCountMap.put(partitionId, count); + partitionToMemberCountMap.put(partitionId, count); } public void removePartitionCount(String partitionId){ - partitionCountMap.remove(partitionId); + partitionToMemberCountMap.remove(partitionId); } public boolean partitionCountExists(String partitionId){ - return partitionCountMap.containsKey(partitionId); + return partitionToMemberCountMap.containsKey(partitionId); } public int getMemberCount(String partitionId){ - if(partitionCountMap.containsKey(partitionId)) { - return partitionCountMap.get(partitionId); + if(partitionToMemberCountMap.containsKey(partitionId)) { + return partitionToMemberCountMap.get(partitionId); } return 0; } @@ -293,5 +294,12 @@ public class NetworkPartitionContext { public void setPartitions(Partition[] partitions) { this.partitions = partitions; + for (Partition partition: partitions){ + partitionToMemberCountMap.put(partition.getId(), 0); + } + } + + public void setPartitionToMemberCountMap(Map<String, Integer> partitionToMemberCountMap) { + this.partitionToMemberCountMap = partitionToMemberCountMap; } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/71ac3524/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java index 3bd037e..a9631f2 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/internal/AutoscalerServerComponent.java @@ -28,7 +28,6 @@ import org.apache.stratos.autoscaler.partition.PartitionManager; import org.apache.stratos.autoscaler.policy.PolicyManager; import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy; import org.apache.stratos.autoscaler.registry.RegistryManager; -import org.apache.stratos.autoscaler.rule.ExecutorTaskScheduler; import org.apache.stratos.autoscaler.topology.AutoscalerTopologyReceiver; import org.apache.stratos.autoscaler.util.AutoScalerConstants; import org.apache.stratos.autoscaler.util.Deserializer; @@ -103,12 +102,12 @@ public class AutoscalerServerComponent { log.debug("Health message processor thread started"); } // Start scheduler for running rules - ExecutorTaskScheduler executor = new ExecutorTaskScheduler(); - Thread executorThread = new Thread(executor); - executorThread.start(); - if (log.isDebugEnabled()) { - log.debug("Rules executor thread started"); - } +// ExecutorTaskScheduler executor = new ExecutorTaskScheduler(); +// Thread executorThread = new Thread(executor); +// executorThread.start(); +// if (log.isDebugEnabled()) { +// log.debug("Rules executor thread started"); +// } this.registryManager = RegistryManager.getInstance(); // Adding the registry stored partitions to the information model. ArrayList<Partition> partitions = this.retreivePartitions(); http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/71ac3524/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 4589efa..e96b7c9 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 @@ -21,17 +21,8 @@ package org.apache.stratos.autoscaler.rule; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.stratos.autoscaler.Constants; import org.apache.stratos.autoscaler.NetworkPartitionContext; import org.apache.stratos.autoscaler.PartitionContext; -import org.apache.stratos.autoscaler.algorithm.AutoscaleAlgorithm; -import org.apache.stratos.autoscaler.algorithm.OneAfterAnother; -import org.apache.stratos.autoscaler.algorithm.RoundRobin; -import org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient; -import org.apache.stratos.autoscaler.partition.PartitionManager; -import org.apache.stratos.cloud.controller.deployment.partition.Partition; -import org.apache.stratos.cloud.controller.pojo.MemberContext; -import org.apache.stratos.messaging.message.receiver.topology.TopologyManager; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseFactory; import org.drools.builder.*; @@ -42,7 +33,6 @@ import org.drools.runtime.rule.FactHandle; import org.wso2.carbon.utils.CarbonUtils; import java.io.File; -import java.util.Enumeration; import java.util.Properties; /** @@ -60,11 +50,6 @@ public class AutoscalerRuleEvaluator { private static KnowledgeBase minCheckKbase; private static KnowledgeBase scaleCheckKbase; - - public static double scaleUpFactor = 0.8; //get from config - public static double scaleDownFactor = 0.2; - public static double scaleDownLowerRate = 0.8; - public AutoscalerRuleEvaluator(){ minCheckKbase = readKnowledgeBase(DRL_FILE_NAME); @@ -86,7 +71,7 @@ public class AutoscalerRuleEvaluator { if (handle == null) { - ksession.setGlobal("$evaluator", new AutoscalerRuleEvaluator()); + ksession.setGlobal("$delegator", new RuleTasksDelegator()); handle = ksession.insert(obj); } else { ksession.update(handle, obj); @@ -100,14 +85,16 @@ public class AutoscalerRuleEvaluator { public static FactHandle evaluateScaleCheck(StatefulKnowledgeSession ksession, FactHandle handle, Object obj) { if (handle == null) { - ksession.setGlobal("$evaluator", new AutoscalerRuleEvaluator()); + ksession.setGlobal("$delegator", new RuleTasksDelegator()); handle = ksession.insert(obj); } else { ksession.update(handle, obj); } ksession.fireAllRules(); - log.info("fired all rules "+obj); + if(log.isDebugEnabled()){ + log.debug(String.format("Rules executed for : %s ", obj)); + } return handle; } @@ -123,34 +110,6 @@ public class AutoscalerRuleEvaluator { ksession = scaleCheckKbase.newStatefulKnowledgeSession(); return ksession; } - - public void delegateSpawn(PartitionContext partitionContext, String clusterId) { - try { - - String nwPartitionId = partitionContext.getNetworkPartitionId(); - NetworkPartitionContext ctxt = - PartitionManager.getInstance() - .getNetworkPartition(nwPartitionId); - - String lbClusterId = getLbClusterId(partitionContext, ctxt); - - MemberContext memberContext = - CloudControllerClient.getInstance() - .spawnAnInstance(partitionContext.getPartition(), - clusterId, - lbClusterId); - if (memberContext != null) { - partitionContext.addPendingMember(memberContext); - } - - } catch (Throwable e) { - String message = "Cannot spawn an instance"; - log.error(message, e); - throw new RuntimeException(message, e); - } - } - - public static String getLbClusterId(PartitionContext partitionContext, NetworkPartitionContext ctxt) { Properties props = partitionContext.getProperties(); @@ -167,45 +126,6 @@ public class AutoscalerRuleEvaluator { return lbClusterId; } - public void delegateTerminate(Partition partition, String clusterId) { - log.info("terminate from partition " + partition.getId() + " cluster " + clusterId ); - } - - public void delegateTerminate(String memberId) { - try { - - CloudControllerClient.getInstance().terminate(memberId); - } catch (Throwable e) { - log.error("Cannot terminate instance", e); - } - } - - public void delegateTerminateAll(String clusterId) { - try { - - CloudControllerClient.getInstance().terminateAllInstances(clusterId); - } catch (Throwable e) { - log.error("Cannot terminate instance", e); - } - } - -// public boolean delegateSpawn(Partition partition, String clusterId, int memberCountToBeIncreased) { -// CloudControllerClient cloudControllerClient = new CloudControllerClient(); -// try { -// int currentMemberCount = AutoscalerContext.getInstance().getClusterMonitor(clusterId).getMemberCount(); -// log.info("Current member count is " + currentMemberCount ); -// -// if(currentMemberCount < partition.getPartitionMembersMax()) { -// AutoscalerContext.getInstance().getClusterMonitor(clusterId).increaseMemberCount(memberCountToBeIncreased); -// cloudControllerClient.spawnInstances(partition, clusterId, memberCountToBeIncreased); -// } -// return true; -// } catch (Throwable e) { -// log.error("Cannot spawn an instance", e); -// } -// return false; -// } - private static KnowledgeBase readKnowledgeBase(String drlFileName) { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); @@ -224,27 +144,6 @@ public class AutoscalerRuleEvaluator { return kbase; } - public AutoscaleAlgorithm getAutoscaleAlgorithm(String partitionAlgorithm){ - AutoscaleAlgorithm autoscaleAlgorithm = null; - if(Constants.ROUND_ROBIN_ALGORITHM_ID.equals(partitionAlgorithm)){ - - autoscaleAlgorithm = new RoundRobin(); - } else if(Constants.ONE_AFTER_ANOTHER_ALGORITHM_ID.equals(partitionAlgorithm)){ - - autoscaleAlgorithm = new OneAfterAnother(); - } - return autoscaleAlgorithm; - } - - public double getPredictedValueForNextMinute(float average, float gradient, float secondDerivative){ - double predictedValue; -// s = u * t + 0.5 * a * t * t - if(log.isDebugEnabled()) { - log.debug((String.format("Calculating predicted value, gradient %s ", gradient))); - } - predictedValue = average + gradient + 0.5 * secondDerivative; - return predictedValue; - } } http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/71ac3524/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/ExecutorTaskScheduler.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/ExecutorTaskScheduler.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/ExecutorTaskScheduler.java deleted file mode 100644 index 869058e..0000000 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/ExecutorTaskScheduler.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.stratos.autoscaler.rule; - -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -import org.apache.commons.configuration.XMLConfiguration; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.stratos.autoscaler.Constants; -import org.apache.stratos.autoscaler.util.ConfUtil; - -/** - * This class is responsible for scheduling the task of evaluating the current details of topology, statistics, and health - * status against the rules set(written in Drools) - */ -public class ExecutorTaskScheduler implements Runnable { - private static final Log log = LogFactory.getLog(ExecutorTaskScheduler.class); - - private static int initialDelay; - private static int period; - - public ExecutorTaskScheduler() { - XMLConfiguration conf = ConfUtil.getInstance().getConfiguration(); - initialDelay = conf.getInt("autoscaler.rulesEvaluator.schedule.initialDelay", Constants.SCHEDULE_DEFAULT_INITIAL_DELAY); - period = conf.getInt("autoscaler.rulesEvaluator.schedule.period", Constants.SCHEDULE_DEFAULT_PERIOD); - } - - @Override - public void run() { - final ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor(); - final Runnable rulesEvaluator = new Runnable() { - public void run() { - -// try { -// for (Service service : TopologyManager.getTopology().getServices()) { -// -// AutoscalerRuleEvaluator.getInstance().evaluate(service); -// } -// -// // Remove cluster context if its already removed from Topology -// for (String clusterContextId : AutoscalerContext.getInstance().getClusterContexes().keySet()) { -// boolean clusterAvailable = false; -// for (Service service : TopologyManager.getTopology().getServices()) { -// for (Cluster cluster : service.getClusters()) { -// if (cluster.getClusterId().equals(clusterContextId)) { -// -// clusterAvailable = true; -// } -// } -// } -// -// if (!clusterAvailable) { -// AutoscalerContext.getInstance().removeClusterContext(clusterContextId); -// } -// } -// -// } catch (Exception e) { -// String msg = "Error while evaluating rules."; -// log.error(msg, e); -// throw new RuntimeException(msg, e); -//// log.debug("Shutting down rule scheduler"); -//// ex.shutdownNow(); -// } - } - }; - - ex.scheduleWithFixedDelay(rulesEvaluator, initialDelay, period, TimeUnit.SECONDS); - } -} http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/71ac3524/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 new file mode 100644 index 0000000..1a82239 --- /dev/null +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java @@ -0,0 +1,114 @@ +package org.apache.stratos.autoscaler.rule; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.stratos.autoscaler.Constants; +import org.apache.stratos.autoscaler.NetworkPartitionContext; +import org.apache.stratos.autoscaler.PartitionContext; +import org.apache.stratos.autoscaler.algorithm.AutoscaleAlgorithm; +import org.apache.stratos.autoscaler.algorithm.OneAfterAnother; +import org.apache.stratos.autoscaler.algorithm.RoundRobin; +import org.apache.stratos.autoscaler.client.cloud.controller.CloudControllerClient; +import org.apache.stratos.autoscaler.partition.PartitionManager; +import org.apache.stratos.cloud.controller.deployment.partition.Partition; +import org.apache.stratos.cloud.controller.pojo.MemberContext; + +import java.util.Properties; + +/** + * This will have utility methods that need to be executed from rule file... + */ +public class RuleTasksDelegator { + + public static final double SCALE_UP_FACTOR = 0.8; //get from config + public static final double SCALE_DOWN_FACTOR = 0.2; + + private static final Log log = LogFactory.getLog(RuleTasksDelegator.class); + + public double getPredictedValueForNextMinute(float average, float gradient, float secondDerivative, int timeInterval){ + double predictedValue; +// s = u * t + 0.5 * a * t * t + predictedValue = average + gradient * timeInterval + 0.5 * secondDerivative * timeInterval * timeInterval; + return predictedValue; + } + + public AutoscaleAlgorithm getAutoscaleAlgorithm(String partitionAlgorithm){ + AutoscaleAlgorithm autoscaleAlgorithm = null; + if(Constants.ROUND_ROBIN_ALGORITHM_ID.equals(partitionAlgorithm)){ + + autoscaleAlgorithm = new RoundRobin(); + } else if(Constants.ONE_AFTER_ANOTHER_ALGORITHM_ID.equals(partitionAlgorithm)){ + + autoscaleAlgorithm = new OneAfterAnother(); + } + return autoscaleAlgorithm; + } + + public void delegateSpawn(PartitionContext partitionContext, String clusterId) { + try { + + String nwPartitionId = partitionContext.getNetworkPartitionId(); + NetworkPartitionContext ctxt = + PartitionManager.getInstance() + .getNetworkPartition(nwPartitionId); + + String lbClusterId = getLbClusterId(partitionContext, ctxt); + + MemberContext memberContext = + CloudControllerClient.getInstance() + .spawnAnInstance(partitionContext.getPartition(), + clusterId, + lbClusterId); + if (memberContext != null) { + partitionContext.addPendingMember(memberContext); + } + + } catch (Throwable e) { + String message = "Cannot spawn an instance"; + log.error(message, e); + throw new RuntimeException(message, e); + } + } + + + + public static String getLbClusterId(PartitionContext partitionContext, NetworkPartitionContext ctxt) { + Properties props = partitionContext.getProperties(); + String value = + (String) props.get(org.apache.stratos.messaging.util.Constants.LOAD_BALANCER_REF); + String lbClusterId = null; + + if (value.equals(org.apache.stratos.messaging.util.Constants.DEFAULT_LOAD_BALANCER)) { + lbClusterId = ctxt.getDefaultLbClusterId(); + } else if (value.equals(org.apache.stratos.messaging.util.Constants.SERVICE_AWARE_LOAD_BALANCER)) { + String serviceName = partitionContext.getServiceName(); + lbClusterId = ctxt.getLBClusterIdOfService(serviceName); + } + return lbClusterId; + } + + public void delegateTerminate(Partition partition, String clusterId) { + log.info("terminate from partition " + partition.getId() + " cluster " + clusterId ); + } + + public void delegateTerminate(String memberId) { + try { + + CloudControllerClient.getInstance().terminate(memberId); + } catch (Throwable e) { + log.error("Cannot terminate instance", e); + } + } + + public void delegateTerminateAll(String clusterId) { + try { + + CloudControllerClient.getInstance().terminateAllInstances(clusterId); + } catch (Throwable e) { + log.error("Cannot terminate instance", e); + } + } + + + +} http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/71ac3524/products/autoscaler/modules/distribution/src/main/conf/mincheck.drl ---------------------------------------------------------------------- diff --git a/products/autoscaler/modules/distribution/src/main/conf/mincheck.drl b/products/autoscaler/modules/distribution/src/main/conf/mincheck.drl index b5f8791..4ca2edc 100755 --- a/products/autoscaler/modules/distribution/src/main/conf/mincheck.drl +++ b/products/autoscaler/modules/distribution/src/main/conf/mincheck.drl @@ -44,7 +44,7 @@ import org.apache.stratos.cloud.controller.pojo.MemberContext; global org.apache.stratos.autoscaler.policy.PolicyManager $manager; global org.apache.stratos.autoscaler.AutoscalerContext $context; global org.apache.commons.logging.Log log; -global org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator $evaluator; +global org.apache.stratos.autoscaler.rule.RuleTasksDelegator $delegator; global org.apache.stratos.messaging.domain.topology.Topology $topology; global java.util.Map partitionCtxts; global java.lang.String clusterId; @@ -56,7 +56,7 @@ dialect "mvel" eval($ctxt.getCurrentMemberCount() < $ctxt.getMinimumMemberCount()) then - $evaluator.delegateSpawn($ctxt, clusterId); + $delegator.delegateSpawn($ctxt, clusterId); end @@ -68,6 +68,6 @@ dialect "mvel" memberId : String() from $ctxt.getObsoletedMembers() eval($ctxt.removeObsoleteMember(memberId)) then - $evaluator.delegateTerminate(memberId); + $delegator.delegateTerminate(memberId); end http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/71ac3524/products/autoscaler/modules/distribution/src/main/conf/scaling.drl ---------------------------------------------------------------------- diff --git a/products/autoscaler/modules/distribution/src/main/conf/scaling.drl b/products/autoscaler/modules/distribution/src/main/conf/scaling.drl index 2252d84..42cf1e9 100644 --- a/products/autoscaler/modules/distribution/src/main/conf/scaling.drl +++ b/products/autoscaler/modules/distribution/src/main/conf/scaling.drl @@ -45,7 +45,7 @@ import org.apache.stratos.cloud.controller.pojo.MemberContext; import org.apache.stratos.autoscaler.policy.model.LoadAverage import org.apache.stratos.autoscaler.policy.model.MemoryConsumption -global org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator $evaluator; +global org.apache.stratos.autoscaler.rule.RuleTasksDelegator $delegator; global org.apache.stratos.autoscaler.deployment.policy.DeploymentPolicy $deploymentPolicy; global org.apache.stratos.autoscaler.policy.model.AutoscalePolicy $autoscalePolicy; global java.lang.String clusterId; @@ -56,21 +56,21 @@ dialect "mvel" when $networkPartitionContext : NetworkPartitionContext () $loadThresholds : LoadThresholds() from $autoscalePolicy.getLoadThresholds() - autoscaleAlgorithm : AutoscaleAlgorithm() from $evaluator.getAutoscaleAlgorithm($networkPartitionContext.getPartitionAlgorithm()) + autoscaleAlgorithm : AutoscaleAlgorithm() from $delegator.getAutoscaleAlgorithm($networkPartitionContext.getPartitionAlgorithm()) lbStatAverage : Float() from $networkPartitionContext.getAverageRequestsInFlight() lbStatGradient : Float() from $networkPartitionContext.getRequestsInFlightGradient() lbStatSecondDerivative : Float() from $networkPartitionContext.getRequestsInFlightSecondDerivative() averageLimit : Float() from $loadThresholds.getRequestsInFlight().getAverage() partition : Partition() from autoscaleAlgorithm.getNextScaleUpPartition($networkPartitionContext, clusterId) - predictedValue : Float() from $evaluator.getPredictedValueForNextMinute(lbStatAverage, lbStatGradient, lbStatSecondDerivative) - eval(predictedValue > averageLimit * $evaluator.scaleUpFactor) + predictedValue : Float() from $delegator.getPredictedValueForNextMinute(lbStatAverage, lbStatGradient, lbStatSecondDerivative, 1) + eval(predictedValue > averageLimit * $delegator.SCALE_UP_FACTOR) then // if (predictedValue*scaleUpFactor > averageLimit){ //scale up NetworkPartitionContext networkPartitionContext; - $evaluator.delegateSpawn($networkPartitionContext.getPartitionCtxt(partition.getId()), clusterId); + $delegator.delegateSpawn($networkPartitionContext.getPartitionCtxt(partition.getId()), clusterId); // } @@ -82,15 +82,15 @@ dialect "mvel" when $networkPartitionContext : NetworkPartitionContext () $loadThresholds : LoadThresholds() from $autoscalePolicy.getLoadThresholds() - autoscaleAlgorithm : AutoscaleAlgorithm() from $evaluator.getAutoscaleAlgorithm($networkPartitionContext.getPartitionAlgorithm()) + autoscaleAlgorithm : AutoscaleAlgorithm() from $delegator.getAutoscaleAlgorithm($networkPartitionContext.getPartitionAlgorithm()) lbStatAverage : Float() from $networkPartitionContext.getAverageRequestsInFlight() lbStatGradient : Float() from $networkPartitionContext.getRequestsInFlightGradient() lbStatSecondDerivative : Float() from $networkPartitionContext.getRequestsInFlightSecondDerivative() averageLimit : Float() from $loadThresholds.getRequestsInFlight().getAverage() partition : Partition() from autoscaleAlgorithm.getNextScaleDownPartition($networkPartitionContext, clusterId) - predictedValue : Float() from $evaluator.getPredictedValueForNextMinute(lbStatAverage, lbStatGradient, lbStatSecondDerivative) - eval(predictedValue* $evaluator.scaleDownFactor* $evaluator.scaleDownLowerRate < averageLimit) + predictedValue : Float() from $delegator.getPredictedValueForNextMinute(lbStatAverage, lbStatGradient, lbStatSecondDerivative, 1) + eval(predictedValue < averageLimit * $delegator.SCALE_DOWN_FACTOR) then MemberStatsContext selectedMemberStatsContext = null; @@ -102,9 +102,9 @@ dialect "mvel" LoadAverage loadAverage = memberStatsContext.getLoadAverage(); MemoryConsumption memoryConsumption = memberStatsContext.getMemoryConsumption(); double predictedCpu - = $evaluator.getPredictedValueForNextMinute(loadAverage.getAverage(),loadAverage.getGradient(),loadAverage.getSecondDerivative()); + = $delegator.getPredictedValueForNextMinute(loadAverage.getAverage(),loadAverage.getGradient(),loadAverage.getSecondDerivative(), 1); double predictedMemoryConsumption - = $evaluator.getPredictedValueForNextMinute(memoryConsumption.getAverage(),memoryConsumption.getGradient(),memoryConsumption.getSecondDerivative()); + = $delegator.getPredictedValueForNextMinute(memoryConsumption.getAverage(),memoryConsumption.getGradient(),memoryConsumption.getSecondDerivative(), 1); double overallLoad = (predictedCpu + predictedMemoryConsumption) / 2; if(!foundAValue){ foundAValue = true; @@ -119,7 +119,7 @@ dialect "mvel" } } if(selectedMemberStatsContext != null) - $evaluator.delegateTerminate(selectedMemberStatsContext.getMemberId()); + $delegator.delegateTerminate(selectedMemberStatsContext.getMemberId()); end
