Updated Branches: refs/heads/master 2954a0d0b -> 03ff87973
Fixing stackoverflow error of RoundRobin algorithmn Project: http://git-wip-us.apache.org/repos/asf/incubator-stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-stratos/commit/c237127e Tree: http://git-wip-us.apache.org/repos/asf/incubator-stratos/tree/c237127e Diff: http://git-wip-us.apache.org/repos/asf/incubator-stratos/diff/c237127e Branch: refs/heads/master Commit: c237127e236af4458156014fef54401f468020cb Parents: 9dc67d9 Author: Udara Liyanage <[email protected]> Authored: Thu Nov 14 11:33:36 2013 +0530 Committer: Udara Liyanage <[email protected]> Committed: Thu Nov 14 11:33:36 2013 +0530 ---------------------------------------------------------------------- .../stratos/autoscaler/ClusterContext.java | 2 +- .../autoscaler/algorithm/RoundRobin.java | 133 +++++++++---------- 2 files changed, 62 insertions(+), 73 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/c237127e/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 764d759..39b8c7e 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 @@ -40,7 +40,7 @@ public class ClusterContext { private int memberCount; - //This map will keep number of instance count against partitionId + //This map will keep number of currently spawned instance count against partitionId private Map<String, Integer> partitionCountMap; private int currentPartitionIndex; http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/c237127e/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 ebfcb2a..6dc9d77 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 @@ -31,95 +31,84 @@ import org.apache.stratos.autoscaler.policy.model.Partition; public class RoundRobin implements AutoscaleAlgorithm{ public Partition getNextScaleUpPartition(String clusterId){ - - String policyId; - int nextPartitionIndex; - ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId); - int currentPartitionIndex = clusterContext.getCurrentPartitionIndex(); - + + ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId); String serviceId = AutoscalerContext.getInstance().getClusterContext(clusterId).getServiceId(); - - //Find relevant policyId using topology - policyId = TopologyManager.getTopology().getService(serviceId).getCluster(clusterId).getAutoscalePolicyName(); - - - int noOfPartitions = PolicyManager.getInstance().getPolicy(policyId).getHAPolicy().getPartitions().size(); - - if (currentPartitionIndex + 1 >= noOfPartitions) { - - nextPartitionIndex = 0; - } else { - - nextPartitionIndex = currentPartitionIndex++; - } - - //Set next partition as current partition in Autoscaler Context - AutoscalerContext.getInstance().getClusterContext(clusterId).setCurrentPartitionIndex(nextPartitionIndex); - - //Find next partition - Partition nextPartition = PolicyManager.getInstance().getPolicy(policyId).getHAPolicy().getPartitions() - .get(nextPartitionIndex); - String nextPartitionId = nextPartition.getId(); - - if(clusterContext.partitionCountExists(nextPartitionId)){ - - //If the current partitions max is reached, it will try next partition - if(clusterContext.getPartitionCount(nextPartitionId) >= nextPartition.getPartitionMembersMax()){ - - nextPartition = getNextScaleUpPartition(clusterId); - } - } else { - - //Add the partition count entry to cluster context - AutoscalerContext.getInstance().getClusterContext(clusterId).addPartitionCount(nextPartitionId, 1); - } - return nextPartition; + //Find relevant policyId using topology + String policyId = TopologyManager.getTopology().getService(serviceId).getCluster(clusterId).getAutoscalePolicyName(); + int noOfPartitions = PolicyManager.getInstance().getPolicy(policyId).getHAPolicy().getPartitions().size(); + for(int i=0; i < noOfPartitions; i++) + { + + int currentPartitionIndex = clusterContext.getCurrentPartitionIndex(); + Partition currentPartition = PolicyManager.getInstance().getPolicy(policyId).getHAPolicy().getPartitions() + .get(currentPartitionIndex); + String currentPartitionId = currentPartition.getId(); + + // point to next partition + currentPartitionIndex = currentPartitionIndex + 1 == noOfPartitions ? 0 : currentPartitionIndex+1; + + //Set next partition as current partition in Autoscaler Context + AutoscalerContext.getInstance().getClusterContext(clusterId).setCurrentPartitionIndex(currentPartitionIndex); + + + if(clusterContext.getPartitionCount(currentPartitionId) < currentPartition.getPartitionMembersMax()){ + // current partition is free + AutoscalerContext.getInstance().getClusterContext(clusterId).addPartitionCount(currentPartitionId, 1); + return currentPartition; + } + + } + + // coming here means non of the partitions has space for another instance to be created. All partitions are full. + return null; } public Partition getNextScaleDownPartition(String clusterId){ - String policyId; - int nextPartitionIndex; - ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId); - int currentPartitionIndex = clusterContext.getCurrentPartitionIndex(); - - String serviceId = AutoscalerContext.getInstance().getClusterContext(clusterId).getServiceId(); - - //Find relevant policyId using topology - policyId = TopologyManager.getTopology().getService(serviceId).getCluster(clusterId).getAutoscalePolicyName(); - + String policyId; + int previousPartitionIndex; + ClusterContext clusterContext = AutoscalerContext.getInstance().getClusterContext(clusterId); + int currentPartitionIndex = clusterContext.getCurrentPartitionIndex(); - int noOfPartitions = PolicyManager.getInstance().getPolicy(policyId).getHAPolicy().getPartitions().size(); + String serviceId = AutoscalerContext.getInstance().getClusterContext(clusterId).getServiceId(); - if (currentPartitionIndex - 1 >= noOfPartitions) { + //Find relevant policyId using topology + policyId = TopologyManager.getTopology().getService(serviceId).getCluster(clusterId).getAutoscalePolicyName(); - nextPartitionIndex = 0; - } else { - - nextPartitionIndex = currentPartitionIndex--; - } - //Set next partition as current partition in Autoscaler Context - AutoscalerContext.getInstance().getClusterContext(clusterId).setCurrentPartitionIndex(nextPartitionIndex); + int noOfPartitions = PolicyManager.getInstance().getPolicy(policyId).getHAPolicy().getPartitions().size(); + + for(int i=0; i<noOfPartitions;i++) + { + if (currentPartitionIndex == 0) { - //Find next partition - Partition nextPartition = PolicyManager.getInstance().getPolicy(policyId).getHAPolicy().getPartitions() - .get(nextPartitionIndex); - String nextPartitionId = nextPartition.getId(); - - if(clusterContext.partitionCountExists(nextPartitionId) - && (clusterContext.getPartitionCount(nextPartitionId) <= nextPartition.getPartitionMembersMin())){ + previousPartitionIndex = noOfPartitions - 1; + }else { + previousPartitionIndex = currentPartitionIndex - 1; + } - //If the current partitions max is reached, it will try next partition - nextPartition = getNextScaleDownPartition(clusterId); - } - return nextPartition; + //Set next partition as current partition in Autoscaler Context + AutoscalerContext.getInstance().getClusterContext(clusterId).setCurrentPartitionIndex(previousPartitionIndex); + + //Find next partition + Partition previousPartition = PolicyManager.getInstance().getPolicy(policyId).getHAPolicy().getPartitions() + .get(previousPartitionIndex); + String previousPartitionId = previousPartition.getId(); + if(clusterContext.partitionCountExists(previousPartitionId) + && (clusterContext.getPartitionCount(previousPartitionId) > previousPartition.getPartitionMembersMin())){ + return previousPartition; + } + } + + return null; } public Partition getScaleDownPartition(String clusterId){ + Partition partition = PolicyManager.getInstance().getPolicy("economyPolicy").getHAPolicy().getPartitions() .get(0);
