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

Reply via email to