Updated Branches: refs/heads/master d57ee15fb -> bd279632c
Refactor one-after-other autoscaler algorithm by replacing the recursive call with a loop so both round-robing and one-after-other alogorithm are same fashion Project: http://git-wip-us.apache.org/repos/asf/incubator-stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-stratos/commit/bd279632 Tree: http://git-wip-us.apache.org/repos/asf/incubator-stratos/tree/bd279632 Diff: http://git-wip-us.apache.org/repos/asf/incubator-stratos/diff/bd279632 Branch: refs/heads/master Commit: bd279632cb1607e506605b6b304e3f3040ffd9f9 Parents: d57ee15 Author: Udara Liyanage <[email protected]> Authored: Sun Nov 17 13:18:04 2013 -0500 Committer: Udara Liyanage <[email protected]> Committed: Sun Nov 17 13:18:04 2013 -0500 ---------------------------------------------------------------------- .../stratos/autoscaler/ClusterContext.java | 5 +- .../algorithm/AutoscaleAlgorithm.java | 2 - .../autoscaler/algorithm/OneAfterAnother.java | 149 ++++++++----------- .../autoscaler/algorithm/RoundRobin.java | 8 +- 4 files changed, 65 insertions(+), 99 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/bd279632/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContext.java index 39b8c7e..7d7f8a2 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContext.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/ClusterContext.java @@ -139,8 +139,7 @@ public class ClusterContext { partitionCountMap.put(partitionId, partitionCountMap.get(partitionId) - count); } - public void addPartitionCount(String partitionId, int count){ - + public void addPartitionCount(String partitionId, int count){ partitionCountMap.put(partitionId, count); } @@ -153,7 +152,7 @@ public class ClusterContext { return partitionCountMap.containsKey(partitionId); } - public int getPartitionCount(String partitionId){ + public int getMemberCount(String partitionId){ return partitionCountMap.get(partitionId); } http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/bd279632/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/AutoscaleAlgorithm.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/AutoscaleAlgorithm.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/AutoscaleAlgorithm.java index 043fc7f..1effaa8 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/AutoscaleAlgorithm.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/algorithm/AutoscaleAlgorithm.java @@ -27,8 +27,6 @@ import org.apache.stratos.autoscaler.policy.model.Partition; public interface AutoscaleAlgorithm { public Partition getNextScaleUpPartition(String clusterId); public Partition getNextScaleDownPartition(String clusterId); -public Partition getScaleUpPartition(String clusterId); -public Partition getScaleDownPartition(String clusterId); public boolean scaleUpPartitionAvailable(String clusterId); public boolean scaleDownPartitionAvailable(String clusterId); } http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/bd279632/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 040a85f..e69d5e9 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 @@ -43,36 +43,39 @@ public class OneAfterAnother implements AutoscaleAlgorithm { // Find number of partitions int noOfPartitions = PolicyManager.getInstance().getPolicy(policyId).getHAPolicy().getPartitions().size(); - - // Here in "one after another" algorithm, next partition is also the current partition unless it reached its max - int nextPartitionIndex = clusterContext.getCurrentPartitionIndex();; - - //Find next partition - Partition nextPartition = PolicyManager.getInstance().getPolicy(policyId).getHAPolicy().getPartitions().get(nextPartitionIndex); - String nextPartitionId = nextPartition.getId(); - - if (clusterContext.partitionCountExists(nextPartitionId)) { - if (clusterContext.getPartitionCount(nextPartitionId) >= nextPartition.getPartitionMembersMax()) { - if(nextPartitionIndex == (noOfPartitions - 1)) { - // All partitions have reached their max - return null; + + for(int i=0; i<noOfPartitions;i++) + { + // Here in "one after another" algorithm, next partition is also the current partition unless it reached its max + int nextPartitionIndex = clusterContext.getCurrentPartitionIndex();; + + //Find next partition + Partition nextPartition = PolicyManager.getInstance().getPolicy(policyId).getHAPolicy().getPartitions().get(nextPartitionIndex); + String nextPartitionId = nextPartition.getId(); + + if (clusterContext.partitionCountExists(nextPartitionId)) { + if (clusterContext.getMemberCount(nextPartitionId) >= nextPartition.getPartitionMembersMax()) { + if(nextPartitionIndex == (noOfPartitions - 1)) { + // All partitions have reached their max + return null; + } + // Selected partition's max has reached, it will try next partition + AutoscalerContext.getInstance().getClusterContext(clusterId).setCurrentPartitionIndex(nextPartitionIndex + 1); } + else { + // Increase member partition member count by one + AutoscalerContext.getInstance().getClusterContext(clusterId).increaseMemberCountInPartition(nextPartitionId, 1); + return nextPartition; + } + } else { - // Selected partition's max has reached, it will try next partition - AutoscalerContext.getInstance().getClusterContext(clusterId).setCurrentPartitionIndex(nextPartitionIndex + 1); - - return getNextScaleUpPartition(clusterId); + // Add the partition count entry to cluster context + AutoscalerContext.getInstance().getClusterContext(clusterId).addPartitionCount(nextPartitionId, 1); } - else { - // Increase member partition member count by one - AutoscalerContext.getInstance().getClusterContext(clusterId).increaseMemberCountInPartition(nextPartitionId, 1); - } - } else { - // Add the partition count entry to cluster context - AutoscalerContext.getInstance().getClusterContext(clusterId).addPartitionCount(nextPartitionId, 1); } - return nextPartition; + + return null; } public Partition getNextScaleDownPartition(String clusterId) { @@ -88,56 +91,42 @@ public class OneAfterAnother implements AutoscaleAlgorithm { // Find number of partitions int noOfPartitions = PolicyManager.getInstance().getPolicy(policyId).getHAPolicy().getPartitions().size(); - - // Here in "one after another" algorithm, next partition is also the current partition unless it reached its max - int nextPartitionIndex = clusterContext.getCurrentPartitionIndex();; - - //Find next partition - Partition nextPartition = PolicyManager.getInstance().getPolicy(policyId).getHAPolicy().getPartitions().get(nextPartitionIndex); - String nextPartitionId = nextPartition.getId(); - - if (clusterContext.partitionCountExists(nextPartitionId)) { - if (clusterContext.getPartitionCount(nextPartitionId) >= nextPartition.getPartitionMembersMax()) { - if(nextPartitionIndex == 0) { - // All partitions have reached their max - return null; + + for(int i=0;i<noOfPartitions;i++) + { + + // Here in "one after another" algorithm, next partition is also the current partition unless it reached its max + int nextPartitionIndex = clusterContext.getCurrentPartitionIndex();; + + //Find next partition + Partition nextPartition = PolicyManager.getInstance().getPolicy(policyId).getHAPolicy().getPartitions().get(nextPartitionIndex); + String nextPartitionId = nextPartition.getId(); + + if (clusterContext.partitionCountExists(nextPartitionId)) { + if (clusterContext.getMemberCount(nextPartitionId) >= nextPartition.getPartitionMembersMax()) { + if(nextPartitionIndex == 0) { + // All partitions have reached their min + return null; + } + + // Selected partition's min has reached, it will try next partition + AutoscalerContext.getInstance().getClusterContext(clusterId).setCurrentPartitionIndex(nextPartitionIndex - 1); } + else { + // Increase member partition member count by one + AutoscalerContext.getInstance().getClusterContext(clusterId).increaseMemberCountInPartition(nextPartitionId, 1); + return nextPartition; + } + } else { - // Selected partition's max has reached, it will try next partition - AutoscalerContext.getInstance().getClusterContext(clusterId).setCurrentPartitionIndex(nextPartitionIndex - 1); - - return getNextScaleUpPartition(clusterId); + // Add the partition count entry to cluster context + AutoscalerContext.getInstance().getClusterContext(clusterId).addPartitionCount(nextPartitionId, 1); } - else { - // Increase member partition member count by one - AutoscalerContext.getInstance().getClusterContext(clusterId).increaseMemberCountInPartition(nextPartitionId, 1); - } - } else { - - // Add the partition count entry to cluster context - AutoscalerContext.getInstance().getClusterContext(clusterId).addPartitionCount(nextPartitionId, 1); } - return nextPartition; - } - - public Partition getScaleDownPartition(String clusterId) { - Partition partition = PolicyManager.getInstance().getPolicy("economyPolicy").getHAPolicy().getPartitions() - .get(0); - - ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId); - int currentPartitionMemberCount = 0; - - if (clusterContext.partitionCountExists(partition.getId())) { - - currentPartitionMemberCount = clusterContext.getPartitionCount(partition.getId()); - } - if (currentPartitionMemberCount <= partition.getPartitionMembersMin()) { - - partition = null; - } - - return partition; + + return null; } + @Override public boolean scaleUpPartitionAvailable(String clusterId) { @@ -148,24 +137,4 @@ public class OneAfterAnother implements AutoscaleAlgorithm { public boolean scaleDownPartitionAvailable(String clusterId) { return false; //To change body of implemented methods use File | Settings | File Templates. } - - - public Partition getScaleUpPartition(String clusterId) { - Partition partition = PolicyManager.getInstance().getPolicy("economyPolicy").getHAPolicy().getPartitions() - .get(0); - - ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId); - int currentPartitionMemberCount = 0; - - if (clusterContext.partitionCountExists(partition.getId())) { - - currentPartitionMemberCount = clusterContext.getPartitionCount(partition.getId()); - } - if (currentPartitionMemberCount >= partition.getPartitionMembersMax()) { - partition = null; - } - - return partition; - } - } http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/bd279632/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 6dc9d77..4ab56fd 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 @@ -52,7 +52,7 @@ public class RoundRobin implements AutoscaleAlgorithm{ AutoscalerContext.getInstance().getClusterContext(clusterId).setCurrentPartitionIndex(currentPartitionIndex); - if(clusterContext.getPartitionCount(currentPartitionId) < currentPartition.getPartitionMembersMax()){ + if(clusterContext.getMemberCount(currentPartitionId) < currentPartition.getPartitionMembersMax()){ // current partition is free AutoscalerContext.getInstance().getClusterContext(clusterId).addPartitionCount(currentPartitionId, 1); return currentPartition; @@ -98,7 +98,7 @@ public class RoundRobin implements AutoscaleAlgorithm{ .get(previousPartitionIndex); String previousPartitionId = previousPartition.getId(); if(clusterContext.partitionCountExists(previousPartitionId) - && (clusterContext.getPartitionCount(previousPartitionId) > previousPartition.getPartitionMembersMin())){ + && (clusterContext.getMemberCount(previousPartitionId) > previousPartition.getPartitionMembersMin())){ return previousPartition; } } @@ -113,7 +113,7 @@ public class RoundRobin implements AutoscaleAlgorithm{ .get(0); ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId); - int partitionMemberCount = clusterContext.getPartitionCount(partition.getId()); + int partitionMemberCount = clusterContext.getMemberCount(partition.getId()); if(partitionMemberCount >= partition.getPartitionMembersMin()) { @@ -142,7 +142,7 @@ public class RoundRobin implements AutoscaleAlgorithm{ .get(0); ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId); - int partitionMemberCount = clusterContext.getPartitionCount(partition.getId()); + int partitionMemberCount = clusterContext.getMemberCount(partition.getId()); if(partitionMemberCount <= partition.getPartitionMembersMax()) {
