Updated Branches: refs/heads/master ba20d4b6f -> 4316ae2ea
Autoscalling algorithm refactor Some method refac in autoscaler Project: http://git-wip-us.apache.org/repos/asf/incubator-stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-stratos/commit/4316ae2e Tree: http://git-wip-us.apache.org/repos/asf/incubator-stratos/tree/4316ae2e Diff: http://git-wip-us.apache.org/repos/asf/incubator-stratos/diff/4316ae2e Branch: refs/heads/master Commit: 4316ae2ea97674eccb5d89026ee6e7eb1d84f648 Parents: ba20d4b Author: Udara Liyanage <[email protected]> Authored: Mon Nov 25 13:53:07 2013 -0500 Committer: Udara Liyanage <[email protected]> Committed: Mon Nov 25 13:53:07 2013 -0500 ---------------------------------------------------------------------- .../autoscaler/algorithm/OneAfterAnother.java | 34 ++++++++++++--- .../PartitionGroupOneAfterAnother.java | 39 ++++++++++------- .../autoscaler/algorithm/RoundRobin.java | 45 ++++++++++++++------ .../rule/AutoscalerRuleEvaluator.java | 11 ++++- .../stratos/autoscaler/util/AutoscalerUtil.java | 2 +- .../messaging/domain/topology/Cluster.java | 10 ++--- 6 files changed, 99 insertions(+), 42 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4316ae2e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/OneAfterAnother.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/OneAfterAnother.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/OneAfterAnother.java index 54a2d26..3c06c13 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/OneAfterAnother.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/OneAfterAnother.java @@ -21,6 +21,8 @@ package org.apache.stratos.autoscaler.algorithm; import java.util.List; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.stratos.autoscaler.AutoscalerContext; import org.apache.stratos.autoscaler.ClusterContext; import org.apache.stratos.autoscaler.policy.model.Partition; @@ -30,16 +32,19 @@ import org.apache.stratos.autoscaler.policy.model.PartitionGroup; * Completes partitions in the order defined in autoscaler policy, go to next if current one reached the max limit */ public class OneAfterAnother implements AutoscaleAlgorithm { + + private static final Log log = LogFactory.getLog(OneAfterAnother.class); public Partition getNextScaleUpPartition(PartitionGroup partitionGrp, String clusterId) { ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId); int currentPartitionIndex = clusterContext.getCurrentPartitionIndex(); List<Partition> partitions = partitionGrp.getPartitions(); - int noOfPartitions = partitions.size(); + int noOfPartitions = partitions.size(); for(int i=currentPartitionIndex; i< noOfPartitions; i++) { + currentPartitionIndex = clusterContext.getCurrentPartitionIndex(); Partition currentPartition = partitions.get(currentPartitionIndex); String currentPartitionId = currentPartition.getId(); @@ -50,16 +55,26 @@ public class OneAfterAnother implements AutoscaleAlgorithm { if(clusterContext.getMemberCount(currentPartitionId) < currentPartition.getPartitionMembersMax()){ // current partition is free clusterContext.increaseMemberCountInPartitionBy(currentPartitionId, 1); + if(log.isDebugEnabled()) + log.debug("Free space found in partition " + currentPartition.getId()); + return currentPartition; }else { // last partition is reached which is not free - if(currentPartitionIndex == noOfPartitions - 1) + if(currentPartitionIndex == noOfPartitions - 1){ + if(log.isDebugEnabled()) + log.debug("Last partition also has no space"); return null; - + } + clusterContext.setCurrentPartitionIndex(currentPartitionIndex + 1); } } + + if(log.isDebugEnabled()) + log.debug("No free partition found at partition group" + partitionGrp); + return null; } @@ -68,10 +83,10 @@ public class OneAfterAnother implements AutoscaleAlgorithm { ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId); int currentPartitionIndex = clusterContext.getCurrentPartitionIndex(); List<Partition> partitions = partitionGrp.getPartitions(); - int noOfPartitions = partitions.size(); for(int i = currentPartitionIndex; i >= 0; i--) { + currentPartitionIndex = clusterContext.getCurrentPartitionIndex(); Partition currentPartition = partitions.get(currentPartitionIndex); String currentPartitionId = currentPartition.getId(); @@ -79,16 +94,23 @@ public class OneAfterAnother implements AutoscaleAlgorithm { if(clusterContext.getMemberCount(currentPartitionId) > currentPartition.getPartitionMembersMin()){ // current partition is free clusterContext.decreaseMemberCountInPartitionBy(currentPartitionId, 1); + if(log.isDebugEnabled()) + log.debug("A free space found for scale down in partition" + currentPartition.getId()); return currentPartition; }else{ - if (currentPartitionIndex == 0) + if (currentPartitionIndex == 0){ + if(log.isDebugEnabled()) + log.debug("First partition reached with no space to scale down"); return null; - + } //Set next partition as current partition in Autoscaler Context currentPartitionIndex = currentPartitionIndex - 1; clusterContext.setCurrentPartitionIndex(currentPartitionIndex); } + } + if(log.isDebugEnabled()) + log.debug("No space found in this partition group " + partitionGrp.getId()); return null; } http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4316ae2e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/PartitionGroupOneAfterAnother.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/PartitionGroupOneAfterAnother.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/PartitionGroupOneAfterAnother.java index fa7723a..dd47678 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/PartitionGroupOneAfterAnother.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/PartitionGroupOneAfterAnother.java @@ -21,6 +21,8 @@ package org.apache.stratos.autoscaler.algorithm; import java.util.List; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.stratos.autoscaler.AutoscalerContext; import org.apache.stratos.autoscaler.ClusterContext; import org.apache.stratos.messaging.message.receiver.topology.TopologyManager; @@ -34,36 +36,42 @@ import org.apache.stratos.autoscaler.rule.AutoscalerRuleEvaluator; */ public class PartitionGroupOneAfterAnother implements AutoscaleAlgorithm { + private static final Log log = LogFactory.getLog(PartitionGroupOneAfterAnother.class); + public Partition getNextScaleUpPartition(String clusterId) { ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId); String serviceId = AutoscalerContext.getInstance().getClusterContext(clusterId).getServiceId(); //Find relevant policyId using topology - String policyId = TopologyManager.getTopology().getService(serviceId).getCluster(clusterId).getDeploymentPolicy(); - int currentPartitionGroupIndex = clusterContext.getCurrentPartitionGroupIndex(); - + String policyId = TopologyManager.getTopology().getService(serviceId).getCluster(clusterId).getDeploymentPolicyName(); + List<PartitionGroup> partitionGroups = PolicyManager.getInstance().getDeploymentPolicy(policyId).getPartitionGroups(); - - //int noOfPartitions = PolicyManager.getInstance().getPolicy(policyId).getHAPolicy().getPartitions().size(); + int currentPartitionGroupIndex = clusterContext.getCurrentPartitionGroupIndex(); for(int i= currentPartitionGroupIndex; i< partitionGroups.size(); i++) { - int currentPartitionIndex = clusterContext.getCurrentPartitionIndex(); - PartitionGroup currentPartitionGroup = partitionGroups.get(currentPartitionIndex); + currentPartitionGroupIndex = clusterContext.getCurrentPartitionGroupIndex(); + PartitionGroup currentPartitionGroup = partitionGroups.get(currentPartitionGroupIndex); String alogirthm = currentPartitionGroup.getPartitionAlgo(); + if(log.isDebugEnabled()) + log.debug("Trying current partition group " + currentPartitionGroup.getId()); // search withing the partition group Partition partition = AutoscalerRuleEvaluator.getInstance().getAutoscaleAlgorithm(alogirthm).getNextScaleUpPartition(currentPartitionGroup, clusterId); if(partition != null){ + if(log.isDebugEnabled()) + log.debug("No partition found in partition group" +currentPartitionGroup.getId()); return partition; }else{ clusterContext.setCurrentPartitionIndex(0); //last partition group has reached - if(currentPartitionGroupIndex == partitionGroups.size() - 1) + if(currentPartitionGroupIndex == partitionGroups.size() - 1){ + if(log.isDebugEnabled()) + log.debug("First partition group has reached wihtout space "); return null; - + } // current partition group is filled clusterContext.setCurrentPartitionGroupIndex(currentPartitionGroupIndex + 1); } @@ -78,23 +86,24 @@ public class PartitionGroupOneAfterAnother implements AutoscaleAlgorithm { String serviceId = AutoscalerContext.getInstance().getClusterContext(clusterId).getServiceId(); //Find relevant policyId using topology - String policyId = TopologyManager.getTopology().getService(serviceId).getCluster(clusterId).getDeploymentPolicy(); + String policyId = TopologyManager.getTopology().getService(serviceId).getCluster(clusterId).getDeploymentPolicyName(); int currentPartitionGroupIndex = clusterContext.getCurrentPartitionGroupIndex(); List<PartitionGroup> partitionGroups = PolicyManager.getInstance().getDeploymentPolicy(policyId).getPartitionGroups(); - //int noOfPartitions = PolicyManager.getInstance().getPolicy(policyId).getHAPolicy().getPartitions().size(); - for(int i = currentPartitionGroupIndex; i >= 0; i--) { - int currentPartitionIndex = clusterContext.getCurrentPartitionIndex(); - PartitionGroup currentPartitionGroup = partitionGroups.get(currentPartitionIndex); + currentPartitionGroupIndex = clusterContext.getCurrentPartitionGroupIndex(); + PartitionGroup currentPartitionGroup = partitionGroups.get(currentPartitionGroupIndex); String alogirthm = currentPartitionGroup.getPartitionAlgo(); - + if(log.isDebugEnabled()) + log.debug("Trying scale down in partition group " + currentPartitionGroup.getId()); // search within the partition group Partition partition = AutoscalerRuleEvaluator.getInstance().getAutoscaleAlgorithm(alogirthm).getNextScaleDownPartition(currentPartitionGroup, clusterId); if(partition != null){ + if(log.isDebugEnabled()) + log.debug("No free partition in partition group" + currentPartitionGroup.getId()); return partition; }else{ clusterContext.setCurrentPartitionIndex(0); http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4316ae2e/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java index 6cab42e..d75f11a 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/RoundRobin.java @@ -19,6 +19,8 @@ package org.apache.stratos.autoscaler.algorithm; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.stratos.autoscaler.AutoscalerContext; import org.apache.stratos.autoscaler.ClusterContext; import org.apache.stratos.autoscaler.policy.model.Partition; @@ -30,22 +32,24 @@ import java.util.List; * Select partition in round robin manner and return */ public class RoundRobin implements AutoscaleAlgorithm{ + + private static final Log log = LogFactory.getLog(RoundRobin.class); public Partition getNextScaleUpPartition(PartitionGroup partitionGrp, String clusterId){ - ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId); - int currentPartitionIndex = clusterContext.getCurrentPartitionIndex(); + ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId); List<Partition> partitions = partitionGrp.getPartitions(); int noOfPartitions = partitions.size(); - + for(int i=0; i < noOfPartitions; i++) { + int currentPartitionIndex = clusterContext.getCurrentPartitionIndex(); Partition currentPartition = partitions.get(currentPartitionIndex); String currentPartitionId = currentPartition.getId(); // point to next partition - int nextPartitionIndex = currentPartitionIndex + 1 == noOfPartitions ? 0 : currentPartitionIndex+1; - AutoscalerContext.getInstance().getClusterContext(clusterId).setCurrentPartitionIndex(nextPartitionIndex); + int nextPartitionIndex = currentPartitionIndex == noOfPartitions - 1 ? 0 : currentPartitionIndex+1; + clusterContext.setCurrentPartitionIndex(nextPartitionIndex); // current partition has no partitionid-instanceid info in cluster context if(!clusterContext.partitionCountExists(currentPartitionId)) @@ -54,12 +58,17 @@ public class RoundRobin implements AutoscaleAlgorithm{ if(clusterContext.getMemberCount(currentPartitionId) < currentPartition.getPartitionMembersMax()){ // current partition is free clusterContext.increaseMemberCountInPartitionBy(currentPartitionId, 1); + if(log.isDebugEnabled()) + log.debug("Free space found in partition " + currentPartition.getId()); return currentPartition; } - + if(log.isDebugEnabled()) + log.debug("No free space for a new instance in partition " + currentPartition.getId()); } // none of the partitions were free. + if(log.isDebugEnabled()) + log.debug("No free partition found at partition group " + partitionGrp); return null; } @@ -68,16 +77,14 @@ public class RoundRobin implements AutoscaleAlgorithm{ public Partition getNextScaleDownPartition(PartitionGroup partitionGrp , String clusterId) { ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId); - int currentPartitionIndex = clusterContext.getCurrentPartitionIndex(); + List<Partition> partitions = partitionGrp.getPartitions(); int noOfPartitions = partitions.size(); for(int i=0; i < noOfPartitions; i++) { - Partition currentPartition = partitions.get(currentPartitionIndex); - String currentPartitionId = currentPartition.getId(); - - // point to next partition + int currentPartitionIndex = clusterContext.getCurrentPartitionIndex(); + // point to next partition if (currentPartitionIndex == 0) { currentPartitionIndex = noOfPartitions - 1; @@ -85,19 +92,29 @@ public class RoundRobin implements AutoscaleAlgorithm{ currentPartitionIndex = currentPartitionIndex - 1; } - + //Set next partition as current partition in Autoscaler Context clusterContext.setCurrentPartitionIndex(currentPartitionIndex); - + + Partition currentPartition = partitions.get(currentPartitionIndex); + String currentPartitionId = currentPartition.getId(); + + if(!clusterContext.partitionCountExists(currentPartitionId)) + AutoscalerContext.getInstance().getClusterContext(clusterId).addPartitionCount(currentPartitionId, 0); // has more than minimum instances. if(clusterContext.getMemberCount(currentPartitionId) > currentPartition.getPartitionMembersMin()){ // current partition is free clusterContext.decreaseMemberCountInPartitionBy(currentPartitionId, 1); + if(log.isDebugEnabled()) + log.debug("Returning partition for scaling down " + currentPartition.getId()); return currentPartition; } - + if(log.isDebugEnabled()) + log.debug("Found no members to scale down at partition" + currentPartition.getId()); } + if(log.isDebugEnabled()) + log.debug("No partition found for scale down at partition group " + partitionGrp.getId()); // none of the partitions were free. return null; } http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4316ae2e/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 3d23e95..8113083 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 @@ -42,6 +42,7 @@ import org.apache.stratos.autoscaler.algorithm.OneAfterAnother; import org.apache.stratos.autoscaler.algorithm.RoundRobin; import org.apache.stratos.autoscaler.util.AutoscalerUtil; import org.apache.stratos.messaging.domain.topology.Cluster; +import org.apache.stratos.autoscaler.algorithm.PartitionGroupOneAfterAnother; /** * This class is responsible for evaluating the current details of topology, statistics, and health @@ -173,5 +174,13 @@ public class AutoscalerRuleEvaluator { return autoscaleAlgorithm; } - + public Partition getNextScaleUpPartition(String clusterID) + { + return new PartitionGroupOneAfterAnother().getNextScaleUpPartition(clusterID); + } + + public Partition getNextScaleDownPartition(String clusterID) + { + return new PartitionGroupOneAfterAnother().getNextScaleDownPartition(clusterID); + } } http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4316ae2e/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 8a0ad2e..16143f9 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 @@ -64,7 +64,7 @@ public class AutoscalerUtil { clusterContext.setRequestsInFlightGradient(gradientLimit); clusterContext.setRequestsInFlightSecondDerivative(secondDerivative); clusterContext.setAverageRequestsInFlight(averageLimit); - DeploymentPolicy deploymentPolicy = PolicyManager.getInstance().getDeploymentPolicy(cluster.getDeploymentPolicy()); + DeploymentPolicy deploymentPolicy = PolicyManager.getInstance().getDeploymentPolicy(cluster.getDeploymentPolicyName()); if(deploymentPolicy!=null){ for(PartitionGroup group :deploymentPolicy.getPartitionGroups()){ for (Partition partition : group.getPartitions()) { http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/4316ae2e/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java index 538cc6b..a3fd9e8 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java @@ -37,7 +37,7 @@ public class Cluster implements Serializable { private String hostName; private String tenantRange; private String autoscalePolicyName; - private String deploymentPolicy; + private String deploymentPolicyName; private Cloud cloud; private Region region; private Zone zone; @@ -156,12 +156,12 @@ public class Cluster implements Serializable { return this.membertoNodeIdMap.containsKey(iaasNodeId); } - public String getDeploymentPolicy() { - return deploymentPolicy; + public String getDeploymentPolicyName() { + return deploymentPolicyName; } - public void setHaPolicyName(String haPolicyName) { - this.deploymentPolicy = haPolicyName; + public void setDeploymentPolicyName(String deploymentPolicy) { + this.deploymentPolicyName = deploymentPolicy; } }
