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);
 

Reply via email to