You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by re...@apache.org on 2014/12/21 11:15:04 UTC

[1/8] stratos git commit: fixing instanceId issue due to the recent refactoring

Repository: stratos
Updated Branches:
  refs/heads/master 23d2a44a6 -> 0426bb8ac


fixing instanceId issue due to the recent refactoring


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/eec3a72d
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/eec3a72d
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/eec3a72d

Branch: refs/heads/master
Commit: eec3a72da9df4580cc6408853966249a528f434b
Parents: 23d2a44
Author: reka <rt...@gmail.com>
Authored: Sun Dec 21 12:26:29 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Sun Dec 21 12:26:29 2014 +0530

----------------------------------------------------------------------
 .../stratos/rest/endpoint/util/converter/ObjectConverter.java      | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/eec3a72d/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java
index 7153232..7f20d14 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java
@@ -665,7 +665,7 @@ public class ObjectConverter {
         clusterInstanceBean.setHostNames(new ArrayList<String>());
 
         for (org.apache.stratos.messaging.domain.topology.Member member : cluster.getMembers()) {
-            if (member.getInstanceId().equals(instanceId)) {
+            if (member.getClusterInstanceId().equals(instanceId)) {
                 Member memberBean = new Member();
                 memberBean.setClusterId(member.getClusterId());
                 memberBean.setLbClusterId(member.getLbClusterId());


[3/8] stratos git commit: adding support for handing life cyle of instances in monitor and support group scaling based on that

Posted by re...@apache.org.
adding support for handing life cyle of instances in monitor and support group scaling based on that


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/b0d24c71
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/b0d24c71
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/b0d24c71

Branch: refs/heads/master
Commit: b0d24c71d3f5ba6755834a6f028e7b96d0ddb36f
Parents: 84015c2
Author: reka <rt...@gmail.com>
Authored: Sun Dec 21 14:11:47 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Sun Dec 21 14:11:47 2014 +0530

----------------------------------------------------------------------
 .../applications/topic/ApplicationBuilder.java  |  27 +++-
 .../context/cluster/ClusterContext.java         |   9 +-
 .../network/NetworkPartitionContext.java        | 154 ++++++++++++++++++-
 .../monitor/component/ApplicationMonitor.java   |   5 +-
 .../monitor/component/GroupMonitor.java         |   7 +-
 .../autoscaler/rule/RuleTasksDelegator.java     |  14 +-
 6 files changed, 201 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/b0d24c71/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
index 7968acb..e0a8a31 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
@@ -25,6 +25,7 @@ import org.apache.stratos.autoscaler.applications.pojo.ApplicationClusterContext
 import org.apache.stratos.autoscaler.client.CloudControllerClient;
 import org.apache.stratos.autoscaler.context.AutoscalerContext;
 import org.apache.stratos.autoscaler.context.partition.network.GroupLevelNetworkPartitionContext;
+import org.apache.stratos.autoscaler.context.partition.network.NetworkPartitionContext;
 import org.apache.stratos.autoscaler.event.publisher.ClusterStatusEventPublisher;
 import org.apache.stratos.autoscaler.exception.policy.InvalidPolicyException;
 import org.apache.stratos.autoscaler.monitor.Monitor;
@@ -458,7 +459,8 @@ public class ApplicationBuilder {
             if (groupInstance.isStateTransitionValid(status)) {
                 //setting the status, persist and publish
                 groupInstance.setStatus(status);
-                updateGroupMonitor(appId, groupId, status, instanceId, groupInstance.getParentId());
+                updateGroupMonitor(appId, groupId, status, groupInstance.getNetworkPartitionId(),
+                        instanceId, groupInstance.getParentId());
                 ApplicationHolder.persistApplication(application);
                 ApplicationsEventPublisher.sendGroupInstanceActivatedEvent(appId, groupId, instanceId);
             } else {
@@ -563,7 +565,8 @@ public class ApplicationBuilder {
             if (groupInstance.isStateTransitionValid(status)) {
                 //setting the status, persist and publish
                 groupInstance.setStatus(status);
-                updateGroupMonitor(appId, groupId, status, instanceId, groupInstance.getParentId());
+                updateGroupMonitor(appId, groupId, status, groupInstance.getNetworkPartitionId(),
+                        instanceId, groupInstance.getParentId());
                 ApplicationHolder.persistApplication(application);
                 ApplicationsEventPublisher.sendGroupInstanceInactivateEvent(appId, groupId, instanceId);
             } else {
@@ -608,7 +611,8 @@ public class ApplicationBuilder {
                 if (groupInstance.isStateTransitionValid(status)) {
                     //setting the status, persist and publish
                     groupInstance.setStatus(status);
-                    updateGroupMonitor(appId, groupId, status, instanceId, groupInstance.getParentId());
+                    updateGroupMonitor(appId, groupId, status, groupInstance.getNetworkPartitionId(),
+                            instanceId, groupInstance.getParentId());
                     ApplicationHolder.persistApplication(application);
                     ApplicationsEventPublisher.sendGroupInstanceTerminatingEvent(appId, groupId, instanceId);
                 } else {
@@ -641,9 +645,24 @@ public class ApplicationBuilder {
     }
 
     private static void updateGroupMonitor(String appId, String groupId,
-                                           GroupStatus status, String instanceId, String parentInstanceId) {
+                                           GroupStatus status, String networkPartitionId,
+                                           String instanceId, String parentInstanceId) {
         GroupMonitor monitor = getGroupMonitor(appId, groupId);
         if (monitor != null) {
+            if(status == GroupStatus.Active) {
+                monitor.getNetworkPartitionContext(networkPartitionId).
+                        movePendingInstanceToActiveInstances(instanceId);
+            } else if(status == GroupStatus.Terminating) {
+                NetworkPartitionContext context = monitor.
+                        getNetworkPartitionContext(networkPartitionId);
+                if(context.getActiveInstance(instanceId) != null) {
+                    context.moveActiveInstanceToTerminationPendingInstances(instanceId);
+                } else if(context.getPendingInstance(instanceId) != null) {
+                    context.movePendingInstanceToTerminationPendingInstances(instanceId);
+                }
+
+
+            }
             monitor.setStatus(status, instanceId, parentInstanceId);
         } else {
             log.warn("Group monitor cannot be found: [group-id] " + groupId +

http://git-wip-us.apache.org/repos/asf/stratos/blob/b0d24c71/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterContext.java
index ef7068a..9b9df39 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterContext.java
@@ -283,7 +283,8 @@ public class ClusterContext extends AbstractClusterContext {
         clusterLevelPartitionContext.setProperties(cluster.getProperties());
 
         //add members to partition Context
-        addMembersFromTopology(cluster, partition, clusterLevelPartitionContext);
+        addMembersFromTopology(cluster, partition, clusterLevelPartitionContext,
+                clusterInstanceContext.getId());
 
         //adding it to the monitors context
         clusterInstanceContext.addPartitionCtxt(clusterLevelPartitionContext);
@@ -305,10 +306,12 @@ public class ClusterContext extends AbstractClusterContext {
 
     private void addMembersFromTopology(Cluster cluster,
                                         org.apache.stratos.cloud.controller.stub.domain.Partition partition,
-                                        ClusterLevelPartitionContext clusterLevelPartitionContext) {
+                                        ClusterLevelPartitionContext clusterLevelPartitionContext,
+                                        String ClusterInstanceId) {
         for (Member member : cluster.getMembers()) {
             String memberId = member.getMemberId();
-            if (member.getPartitionId().equalsIgnoreCase(partition.getId())) {
+            if (member.getPartitionId().equalsIgnoreCase(partition.getId()) &&
+                    member.getClusterInstanceId().equals(ClusterInstanceId)) {
                 MemberContext memberContext = new MemberContext();
                 memberContext.setClusterId(member.getClusterId());
                 memberContext.setMemberId(memberId);

http://git-wip-us.apache.org/repos/asf/stratos/blob/b0d24c71/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/NetworkPartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/NetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/NetworkPartitionContext.java
index 0183220..5e3bd6a 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/NetworkPartitionContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/NetworkPartitionContext.java
@@ -21,9 +21,10 @@ package org.apache.stratos.autoscaler.context.partition.network;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.context.InstanceContext;
-import org.apache.stratos.autoscaler.context.group.GroupInstanceContext;
 
 import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -35,6 +36,13 @@ public abstract class NetworkPartitionContext {
     private final String id;
     //group instances kept inside a partition
     private Map<String, InstanceContext> instanceIdToInstanceContextMap;
+    //active instances
+    private List<InstanceContext> activeInstances;
+    //pending instances
+    private List<InstanceContext> pendingInstances;
+    //terminating pending instances
+    private List<InstanceContext> terminatingPending;
+    private int pendingMembersFailureCount = 0;
 
     protected NetworkPartitionContext(String id) {
         this.id = id;
@@ -70,4 +78,148 @@ public abstract class NetworkPartitionContext {
     public boolean containsInstanceContext(String instanceId) {
         return this.instanceIdToInstanceContextMap.containsKey(instanceId);
     }
+
+    public List<InstanceContext> getActiveInstances() {
+        return activeInstances;
+    }
+
+    public void setActiveInstances(List<InstanceContext> activeInstances) {
+        this.activeInstances = activeInstances;
+    }
+
+    public List<InstanceContext> getPendingInstances() {
+        return pendingInstances;
+    }
+
+    public void setPendingInstances(List<InstanceContext> pendingInstances) {
+        this.pendingInstances = pendingInstances;
+    }
+
+    public void addPendingInstance(InstanceContext context) {
+        this.pendingInstances.add(context);
+    }
+
+    public int getPendingInstancesCount() {
+        return this.pendingInstances.size();
+    }
+
+    public int getActiveInstancesCount() {
+        return this.activeInstances.size();
+    }
+
+    public InstanceContext getActiveInstance(String instanceId) {
+        for (InstanceContext instanceContext : activeInstances) {
+            if (instanceId.equals(instanceContext.getId())) {
+                return instanceContext;
+            }
+        }
+        return null;
+    }
+
+    public InstanceContext getPendingInstance(String instanceId) {
+        for (InstanceContext instanceContext : pendingInstances) {
+            if (instanceId.equals(instanceContext.getId())) {
+                return instanceContext;
+            }
+        }
+        return null;
+    }
+
+
+    public void movePendingInstanceToActiveInstances(String instanceId) {
+        if (instanceId == null) {
+            return;
+        }
+        synchronized (pendingInstances) {
+            Iterator<InstanceContext> iterator = pendingInstances.listIterator();
+            while (iterator.hasNext()) {
+                InstanceContext pendingInstance = iterator.next();
+                if (pendingInstance == null) {
+                    iterator.remove();
+                    continue;
+                }
+                if (instanceId.equals(pendingInstance.getId())) {
+                    // member is activated
+                    // remove from pending list
+                    iterator.remove();
+                    // add to the activated list
+                    this.activeInstances.add(pendingInstance);
+                    pendingMembersFailureCount = 0;
+                    if (log.isDebugEnabled()) {
+                        log.debug(String.format("Pending instance is removed and added to the " +
+                                "activated instance list. [Instance Id] %s", instanceId));
+                    }
+                    break;
+                }
+            }
+        }
+    }
+
+    public void moveActiveInstanceToTerminationPendingInstances(String instanceId) {
+        if (instanceId == null) {
+            return;
+        }
+        synchronized (activeInstances) {
+            Iterator<InstanceContext> iterator = activeInstances.listIterator();
+            while (iterator.hasNext()) {
+                InstanceContext activeInstance = iterator.next();
+                if (activeInstance == null) {
+                    iterator.remove();
+                    continue;
+                }
+                if (instanceId.equals(activeInstance.getId())) {
+                    // member is activated
+                    // remove from pending list
+                    iterator.remove();
+                    // add to the activated list
+                    this.terminatingPending.add(activeInstance);
+                    if (log.isDebugEnabled()) {
+                        log.debug(String.format("Active instance is removed and added to the " +
+                                "termination pending instance list. [Instance Id] %s", instanceId));
+                    }
+                    break;
+                }
+            }
+        }
+    }
+
+    public void movePendingInstanceToTerminationPendingInstances(String instanceId) {
+        if (instanceId == null) {
+            return;
+        }
+        synchronized (pendingInstances) {
+            Iterator<InstanceContext> iterator = pendingInstances.listIterator();
+            while (iterator.hasNext()) {
+                InstanceContext pendingInstance = iterator.next();
+                if (pendingInstance == null) {
+                    iterator.remove();
+                    continue;
+                }
+                if (instanceId.equals(pendingInstance.getId())) {
+                    // member is activated
+                    // remove from pending list
+                    iterator.remove();
+                    // add to the activated list
+                    this.terminatingPending.add(pendingInstance);
+                    if (log.isDebugEnabled()) {
+                        log.debug(String.format("Pending instance is removed and added to the " +
+                                "termination pending instance list. [Instance Id] %s", instanceId));
+                    }
+                    break;
+                }
+            }
+        }
+    }
+
+    public int getNonTerminatedInstancesCount() {
+        return this.activeInstances.size() + this.pendingInstances.size();
+    }
+
+    public List<InstanceContext> getTerminatingPending() {
+        return terminatingPending;
+    }
+
+    public void setTerminatingPending(List<InstanceContext> terminatingPending) {
+        this.terminatingPending = terminatingPending;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/b0d24c71/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
index 07c13fd..66a52cd 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
@@ -96,8 +96,9 @@ public class ApplicationMonitor extends ParentComponentMonitor {
                         //stopping the monitoring when the group is inactive/Terminating/Terminated
                         if (instance.getStatus().getCode() <= GroupStatus.Active.getCode()) {
                             //Gives priority to scaling max out rather than dependency scaling
-                            if (!instanceContext.getIdToScalingOverMaxEvent().isEmpty()) {
-                                //handling the application bursting
+                            if (!instanceContext.getIdToScalingOverMaxEvent().isEmpty() &&
+                                    networkPartitionContext.getPendingInstancesCount() > 0) {
+                                //handling the application bursting only when there are no pending instances found
                                 try {
                                     if (log.isInfoEnabled()) {
                                         log.info("Handling application busting, " +

http://git-wip-us.apache.org/repos/asf/stratos/blob/b0d24c71/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
index fd7717d..5eafaf9 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
@@ -116,8 +116,10 @@ public class GroupMonitor extends ParentComponentMonitor {
                             //Gives priority to scaling max out rather than dependency scaling
                             if (!instanceContext.getIdToScalingOverMaxEvent().isEmpty()) {
                                 if(!hasScalingDependents) {
-                                    //handling the group scaling
-                                    if (groupScalingEnabled) {
+                                    //handling the group scaling and if pending instances found,
+                                    // reject the max
+                                    if (groupScalingEnabled &&
+                                            networkPartitionContext.getPendingInstancesCount() > 0) {
                                         //one of the child is loaded and max out.
                                         // Hence creating new group instance
                                         if(log.isDebugEnabled()) {
@@ -511,6 +513,7 @@ public class GroupMonitor extends ParentComponentMonitor {
 
         groupInstanceContext.addPartitionContext((GroupLevelPartitionContext) partitionContext);
         groupLevelNetworkPartitionContext.addInstanceContext(groupInstanceContext);
+        groupLevelNetworkPartitionContext.addPendingInstance(groupInstanceContext);
 
         if (log.isInfoEnabled()) {
             log.info("Group [Instance context] " + instanceId +

http://git-wip-us.apache.org/repos/asf/stratos/blob/b0d24c71/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
index 9ef332c..4318e51 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
@@ -85,19 +85,27 @@ public class RuleTasksDelegator {
 
     public int getNumberOfInstancesRequiredBasedOnMemoryConsumption(float threshold, double predictedValue,
                                                                     int max, int min) {
-        double numberOfAdditionalInstancesRequired = 0;
+        /*double numberOfAdditionalInstancesRequired = 0;
         if(predictedValue != threshold) {
 
             float scalingRange = 100 - threshold;
             int instanceRange = max - min;
 
-            if(instanceRange != 0){
+            if(instanceRange >= 0){
 
                 float gradient = scalingRange / instanceRange;
                 numberOfAdditionalInstancesRequired = (predictedValue - threshold) / gradient;
             }
         }
-        return (int) Math.ceil(min + numberOfAdditionalInstancesRequired);
+        return (int) Math.ceil(min + numberOfAdditionalInstancesRequired);*/
+
+        double numberOfInstances;
+        if(threshold != 0) {
+
+            numberOfInstances = (min * predictedValue) / threshold;
+            return (int) Math.ceil(numberOfInstances);
+        }
+        return min;
     }
 
     public int getNumberOfInstancesRequiredBasedOnLoadAverage(float threshold, double predictedValue, int min) {


[7/8] stratos git commit: adding parent instance id to scale event when communicating to parent

Posted by re...@apache.org.
adding parent instance id to scale event when communicating to parent


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/ea02c46d
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/ea02c46d
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/ea02c46d

Branch: refs/heads/master
Commit: ea02c46d8e7e7564fb0f2cb73eae255b7244a697
Parents: db87256
Author: reka <rt...@gmail.com>
Authored: Sun Dec 21 15:33:16 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Sun Dec 21 15:33:16 2014 +0530

----------------------------------------------------------------------
 .../stratos/autoscaler/monitor/component/GroupMonitor.java       | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/ea02c46d/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
index 7b0fd86..5780fbc 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
@@ -147,7 +147,7 @@ public class GroupMonitor extends ParentComponentMonitor {
                                         //notifying the parent if no group scaling enabled here
                                         MonitorStatusEventBuilder.handleScalingOverMaxEvent(parent,
                                                 networkPartitionContext.getId(),
-                                                instanceContext.getId(),
+                                                instanceContext.getParentInstanceId(),
                                                 appId);
                                     }
                                 } else {
@@ -159,7 +159,7 @@ public class GroupMonitor extends ParentComponentMonitor {
                                     //notifying the parent when scale dependents found
                                     MonitorStatusEventBuilder.handleScalingOverMaxEvent(parent,
                                             networkPartitionContext.getId(),
-                                            instanceContext.getId(),
+                                            instanceContext.getParentInstanceId(),
                                             appId);
                                 }
                                 //Resetting the max events


[5/8] stratos git commit: fixing issue when retriving existing network partition

Posted by re...@apache.org.
fixing issue when retriving existing network partition


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/2c05816d
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/2c05816d
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/2c05816d

Branch: refs/heads/master
Commit: 2c05816daa678b1ff8defba034caa9d593614ade
Parents: 0aa4011
Author: reka <rt...@gmail.com>
Authored: Sun Dec 21 15:20:37 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Sun Dec 21 15:20:37 2014 +0530

----------------------------------------------------------------------
 .../apache/stratos/autoscaler/monitor/component/GroupMonitor.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/2c05816d/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
index 6187e06..8a00541 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
@@ -403,7 +403,7 @@ public class GroupMonitor extends ParentComponentMonitor {
                 getChildPolicy(groupId);
 
         String networkPartitionId = parentInstanceContext.getNetworkPartitionId();
-        if (this.networkPartitionCtxts.containsKey(parentInstanceContext)) {
+        if (this.networkPartitionCtxts.containsKey(networkPartitionId)) {
             groupLevelNetworkPartitionContext = (GroupLevelNetworkPartitionContext) this.networkPartitionCtxts.
                     get(networkPartitionId);
         } else {


[8/8] stratos git commit: handling max out in the dependent scaling as well

Posted by re...@apache.org.
handling max out in the dependent scaling as well


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/0426bb8a
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/0426bb8a
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/0426bb8a

Branch: refs/heads/master
Commit: 0426bb8acc3d2d765ea26e47fb43b633d069b990
Parents: ea02c46
Author: reka <rt...@gmail.com>
Authored: Sun Dec 21 15:44:37 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Sun Dec 21 15:44:37 2014 +0530

----------------------------------------------------------------------
 .../src/main/conf/drools/dependent-scaling.drl  | 38 +++++++++++++-------
 1 file changed, 26 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/0426bb8a/products/stratos/modules/distribution/src/main/conf/drools/dependent-scaling.drl
----------------------------------------------------------------------
diff --git a/products/stratos/modules/distribution/src/main/conf/drools/dependent-scaling.drl b/products/stratos/modules/distribution/src/main/conf/drools/dependent-scaling.drl
index daafb52..92f80b1 100644
--- a/products/stratos/modules/distribution/src/main/conf/drools/dependent-scaling.drl
+++ b/products/stratos/modules/distribution/src/main/conf/drools/dependent-scaling.drl
@@ -58,10 +58,10 @@ dialect "mvel"
             while(count != additionalInstances  && partitionsAvailable){
 
                 ClusterLevelPartitionContext partitionContext =  (ClusterLevelPartitionContext)autoscaleAlgorithm.getNextScaleUpPartitionContext(clusterInstanceContext.getPartitionCtxtsAsAnArray());
-                if(partitionContext != null){
+                if(partitionContext != null) {
 
-                    log.info("[scale-up] Partition available, hence trying to spawn an instance to scale up!" );
-                    log.debug("[scale-up] " + " [partition] " + partitionContext.getPartitionId() + " [cluster] " + clusterId );
+                    log.info("[dependency-scale][scale-up] Partition available, hence trying to spawn an instance to scale up!" );
+                    log.debug("[dependency-scale][scale-up] " + " [partition] " + partitionContext.getPartitionId() + " [cluster] " + clusterId );
                     delegator.delegateSpawn(partitionContext, clusterId, clusterInstanceContext.getId(), isPrimary);
                     count++;
                 } else {
@@ -69,6 +69,20 @@ dialect "mvel"
                     partitionsAvailable = false;
                 }
             }
+            if(!partitionsAvailable) {
+                if(clusterInstanceContext.isInGroupScalingEnabledSubtree()){
+                    delegator.delegateScalingOverMaxNotification(clusterId,
+                                                    clusterInstanceContext.getNetworkPartitionId(),
+                                                    clusterInstanceContext.getId());
+                    log.info("[dependency-scale][dependent-max-notification] partition is not
+                    available for [scale-up]. Hence notifying the parent for group scaling" );
+                } else {
+                    log.warn("[dependency-scale][dependent-max-notification] partition is not
+                                    available for [scale-up]. All resources are exhausted.
+                                    Please enable group-scaling for further scaleup" );
+                }
+
+            }
         } else if (scaleDown) {
 
             int redundantInstances = clusterInstanceContext.getNonTerminatedMemberCount() - roundedRequiredInstanceCount;
@@ -81,31 +95,31 @@ dialect "mvel"
                 boolean foundAValue = false;
                 ClusterLevelPartitionContext partitionContext =  (ClusterLevelPartitionContext)autoscaleAlgorithm.getNextScaleDownPartitionContext(clusterInstanceContext.getPartitionCtxtsAsAnArray());
                 if(partitionContext != null){
-                    log.info("[scale-down] Partition available to scale down, hence trying to terminate an instance to scale down!" );
-                    log.debug("[scale-down] " + " [partition] " + partitionContext.getPartitionId() + " [cluster] " + clusterId );
+                    log.info("[dependency-scale][scale-down] Partition available to scale down, hence trying to terminate an instance to scale down!" );
+                    log.debug("[dependency-scale][scale-down] " + " [partition] " + partitionContext.getPartitionId() + " [cluster] " + clusterId );
 
                     for(MemberStatsContext memberStatsContext: partitionContext.getMemberStatsContexts().values()){
 
 						if( !primaryMembers.contains(memberStatsContext.getMemberId()) ) {
 
                             LoadAverage loadAverage = memberStatsContext.getLoadAverage();
-                            log.debug("[scale-down] " + " [cluster] "
+                            log.debug("[dependency-scale][scale-down] " + " [cluster] "
                                 + clusterId + " [member] " + memberStatsContext.getMemberId() + " Load average: " + loadAverage);
 
                             MemoryConsumption memoryConsumption = memberStatsContext.getMemoryConsumption();
-                            log.debug("[scale-down] " + " [partition] " + partitionContext.getPartitionId() + " [cluster] "
+                            log.debug("[dependency-scale][scale-down] " + " [partition] " + partitionContext.getPartitionId() + " [cluster] "
                                 + clusterId + " [member] " + memberStatsContext.getMemberId() + " Memory consumption: " + memoryConsumption);
 
                             double predictedCpu = delegator.getPredictedValueForNextMinute(loadAverage.getAverage(),loadAverage.getGradient(),loadAverage.getSecondDerivative(), 1);
-                            log.debug("[scale-down] " + " [partition] " + partitionContext.getPartitionId() + " [cluster] "
+                            log.debug("[dependency-scale][scale-down] " + " [partition] " + partitionContext.getPartitionId() + " [cluster] "
                                 + clusterId + " [member] " + memberStatsContext.getMemberId() + " Predicted CPU: " + predictedCpu);
 
                             double predictedMemoryConsumption = delegator.getPredictedValueForNextMinute(memoryConsumption.getAverage(),memoryConsumption.getGradient(),memoryConsumption.getSecondDerivative(), 1);
-                            log.debug("[scale-down] " + " [partition] " + partitionContext.getPartitionId() + " [cluster] "
+                            log.debug("[dependency-scale][scale-down] " + " [partition] " + partitionContext.getPartitionId() + " [cluster] "
                                 + clusterId + " [member] " + memberStatsContext.getMemberId() + " Predicted memory consumption: " + predictedMemoryConsumption);
 
                             double overallLoad = (predictedCpu + predictedMemoryConsumption) / 2;
-                            log.debug("[scale-down] " + " [partition] " + partitionContext.getPartitionId() + " [cluster] "
+                            log.debug("[dependency-scale][scale-down] " + " [partition] " + partitionContext.getPartitionId() + " [cluster] "
                                 + clusterId + " [member] " + memberStatsContext.getMemberId() + " Overall load: " + overallLoad);
 
                             if(!foundAValue){
@@ -122,8 +136,8 @@ dialect "mvel"
 
                     }
                     if(selectedMemberStatsContext != null) {
-                        log.info("[scale-down] Trying to terminating an instace to scale down!" );
-                        log.debug("[scale-down] " + " [partition] " + partitionContext.getPartitionId() + " [cluster] "
+                        log.info("[dependency-scale][scale-down] Trying to terminating an instace to scale down!" );
+                        log.debug("[dependency-scale][scale-down] " + " [partition] " + partitionContext.getPartitionId() + " [cluster] "
                             + clusterId + " Member with lowest overall load: " + selectedMemberStatsContext.getMemberId());
 
                         delegator.delegateTerminate(partitionContext, selectedMemberStatsContext.getMemberId());


[6/8] stratos git commit: adding parent instance id when communicating to parent

Posted by re...@apache.org.
adding parent instance id when communicating to parent


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/db87256a
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/db87256a
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/db87256a

Branch: refs/heads/master
Commit: db87256ad5259a20a8c2de903379aac71984b111
Parents: 2c05816
Author: reka <rt...@gmail.com>
Authored: Sun Dec 21 15:31:35 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Sun Dec 21 15:31:35 2014 +0530

----------------------------------------------------------------------
 .../apache/stratos/autoscaler/monitor/component/GroupMonitor.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/db87256a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
index 8a00541..7b0fd86 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
@@ -133,7 +133,7 @@ public class GroupMonitor extends ParentComponentMonitor {
                                                 //couldn't create new instance. Hence notifying the parent
                                                 MonitorStatusEventBuilder.handleScalingOverMaxEvent(parent,
                                                         networkPartitionContext.getId(),
-                                                        instanceContext.getId(),
+                                                        instanceContext.getParentInstanceId(),
                                                         appId);
                                             }
                                         } else {


[4/8] stratos git commit: fixing issues in the group scaling

Posted by re...@apache.org.
fixing issues in the group scaling


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/0aa40111
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/0aa40111
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/0aa40111

Branch: refs/heads/master
Commit: 0aa401118af9465553ad7bdfb39eb75b374e128f
Parents: b0d24c7
Author: reka <rt...@gmail.com>
Authored: Sun Dec 21 14:32:30 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Sun Dec 21 14:32:30 2014 +0530

----------------------------------------------------------------------
 .../applications/topic/ApplicationBuilder.java  | 29 ++++++++----
 .../network/NetworkPartitionContext.java        |  8 ++--
 .../monitor/component/ApplicationMonitor.java   | 41 ++++++++++-------
 .../monitor/component/GroupMonitor.java         | 47 +++++++++++---------
 4 files changed, 75 insertions(+), 50 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/0aa40111/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
index e0a8a31..a2cc84b 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
@@ -146,7 +146,8 @@ public class ApplicationBuilder {
         if (applicationInstance.isStateTransitionValid(status)) {
             //setting the status, persist and publish
             application.setStatus(status, instanceId);
-            updateApplicationMonitor(appId, status, instanceId);
+            updateApplicationMonitor(appId, status, applicationInstance.getNetworkPartitionId(),
+                    instanceId);
             ApplicationHolder.persistApplication(application);
             ApplicationsEventPublisher.sendApplicationInstanceActivatedEvent(appId, instanceId);
         } else {
@@ -176,7 +177,8 @@ public class ApplicationBuilder {
         if (applicationInstance.isStateTransitionValid(status)) {
             //setting the status, persist and publish
             application.setStatus(status, instanceId);
-            updateApplicationMonitor(appId, status, instanceId);
+            updateApplicationMonitor(appId, status, applicationInstance.getNetworkPartitionId(),
+                                    instanceId);
             ApplicationHolder.persistApplication(application);
             ApplicationsEventPublisher.sendApplicationInstanceInactivatedEvent(appId, instanceId);
         } else {
@@ -248,7 +250,8 @@ public class ApplicationBuilder {
             if (applicationInstance.isStateTransitionValid(status)) {
                 //setting the status, persist and publish
                 applicationInstance.setStatus(status);
-                updateApplicationMonitor(appId, status, instanceId);
+                updateApplicationMonitor(appId, status, applicationInstance.getNetworkPartitionId(),
+                                        instanceId);
                 ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance().
                         getAppMonitor(appId);
                 applicationMonitor.getNetworkPartitionContext(applicationInstance.
@@ -319,7 +322,8 @@ public class ApplicationBuilder {
                 if (context1.isStateTransitionValid(status)) {
                     //setting the status, persist and publish
                     application.setStatus(status, context1.getInstanceId());
-                    updateApplicationMonitor(appId, status, context1.getInstanceId());
+                    updateApplicationMonitor(appId, status, context1.getNetworkPartitionId(),
+                                            context1.getInstanceId());
                     ApplicationHolder.persistApplication(application);
                     ApplicationsEventPublisher.sendApplicationInstanceTerminatingEvent(appId, context1.getInstanceId());
                 } else {
@@ -630,12 +634,23 @@ public class ApplicationBuilder {
         }
     }
 
-    private static void updateApplicationMonitor(String appId, ApplicationStatus status, String instanceId) {
+    private static void updateApplicationMonitor(String appId, ApplicationStatus status,
+                                                 String networkPartitionId, String instanceId) {
         //Updating the Application Monitor
         ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance().getAppMonitor(appId);
         if (applicationMonitor != null) {
-            if (status == ApplicationStatus.Terminating) {
+            if(status == ApplicationStatus.Active) {
+                applicationMonitor.getNetworkPartitionContext(networkPartitionId).
+                        movePendingInstanceToActiveInstances(instanceId);
+            } else if(status == ApplicationStatus.Terminating) {
                 applicationMonitor.setTerminating(true);
+                NetworkPartitionContext context = applicationMonitor.
+                        getNetworkPartitionContext(networkPartitionId);
+                if(context.getActiveInstance(instanceId) != null) {
+                    context.moveActiveInstanceToTerminationPendingInstances(instanceId);
+                } else if(context.getPendingInstance(instanceId) != null) {
+                    context.movePendingInstanceToTerminationPendingInstances(instanceId);
+                }
             }
             applicationMonitor.setStatus(status, instanceId);
         } else {
@@ -660,8 +675,6 @@ public class ApplicationBuilder {
                 } else if(context.getPendingInstance(instanceId) != null) {
                     context.movePendingInstanceToTerminationPendingInstances(instanceId);
                 }
-
-
             }
             monitor.setStatus(status, instanceId, parentInstanceId);
         } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/0aa40111/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/NetworkPartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/NetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/NetworkPartitionContext.java
index 5e3bd6a..4afa075 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/NetworkPartitionContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/NetworkPartitionContext.java
@@ -22,10 +22,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.context.InstanceContext;
 
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * This will keep track of network partition level information.
@@ -47,6 +44,9 @@ public abstract class NetworkPartitionContext {
     protected NetworkPartitionContext(String id) {
         this.id = id;
         instanceIdToInstanceContextMap = new HashMap<String, InstanceContext>();
+        pendingInstances = new ArrayList<InstanceContext>();
+        activeInstances = new ArrayList<InstanceContext>();
+        terminatingPending = new ArrayList<InstanceContext>();
 
     }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/0aa40111/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
index 66a52cd..856b650 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ApplicationMonitor.java
@@ -96,23 +96,29 @@ public class ApplicationMonitor extends ParentComponentMonitor {
                         //stopping the monitoring when the group is inactive/Terminating/Terminated
                         if (instance.getStatus().getCode() <= GroupStatus.Active.getCode()) {
                             //Gives priority to scaling max out rather than dependency scaling
-                            if (!instanceContext.getIdToScalingOverMaxEvent().isEmpty() &&
-                                    networkPartitionContext.getPendingInstancesCount() > 0) {
-                                //handling the application bursting only when there are no pending instances found
-                                try {
-                                    if (log.isInfoEnabled()) {
-                                        log.info("Handling application busting, " +
-                                                "since resources are exhausted in " +
-                                                "this application instance ");
-                                    }
-                                    createInstanceOnBurstingForApplication();
-                                } catch (TopologyInConsistentException e) {
-                                    log.error("Error while bursting the application", e);
-                                } catch (PolicyValidationException e) {
-                                    log.error("Error while bursting the application", e);
-                                } catch (MonitorNotFoundException e) {
-                                    log.error("Error while bursting the application", e);
-                                }
+                            if (!instanceContext.getIdToScalingOverMaxEvent().isEmpty()) {
+                               if(networkPartitionContext.getPendingInstancesCount() == 0) {
+                                   //handling the application bursting only when there are no pending instances found
+                                   try {
+                                       if (log.isInfoEnabled()) {
+                                           log.info("Handling application busting, " +
+                                                   "since resources are exhausted in " +
+                                                   "this application instance ");
+                                       }
+                                       createInstanceOnBurstingForApplication();
+                                   } catch (TopologyInConsistentException e) {
+                                       log.error("Error while bursting the application", e);
+                                   } catch (PolicyValidationException e) {
+                                       log.error("Error while bursting the application", e);
+                                   } catch (MonitorNotFoundException e) {
+                                       log.error("Error while bursting the application", e);
+                                   }
+                               } else {
+                                   if(log.isDebugEnabled()) {
+                                       log.debug("Pending Application instance found. " +
+                                               "Hence waiting for it to become active");
+                                   }
+                               }
 
                             } else {
                                 handleDependentScaling(instanceContext, networkPartitionContext);
@@ -303,6 +309,7 @@ public class ApplicationMonitor extends ParentComponentMonitor {
         instanceContext = new ApplicationInstanceContext(instanceId);
         //adding the created App InstanceContext to ApplicationLevelNetworkPartitionContext
         context.addInstanceContext(instanceContext);
+        context.addPendingInstance(instanceContext);
 
         //adding to instance map
         this.instanceIdToInstanceMap.put(instanceId, instance);

http://git-wip-us.apache.org/repos/asf/stratos/blob/0aa40111/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
index 5eafaf9..6187e06 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
@@ -118,28 +118,31 @@ public class GroupMonitor extends ParentComponentMonitor {
                                 if(!hasScalingDependents) {
                                     //handling the group scaling and if pending instances found,
                                     // reject the max
-                                    if (groupScalingEnabled &&
-                                            networkPartitionContext.getPendingInstancesCount() > 0) {
-                                        //one of the child is loaded and max out.
-                                        // Hence creating new group instance
-                                        if(log.isDebugEnabled()) {
-                                            log.debug("Handling group scaling for the [group] " + id +
-                                                    "upon a max out event from " +
-                                                    "the children");
-                                        }
-                                        boolean createOnDemand = createInstanceOnDemand(instanceContext.
-                                                getParentInstanceId());
-                                        if (!createOnDemand) {
-                                            //couldn't create new instance. Hence notifying the parent
-                                            MonitorStatusEventBuilder.handleScalingOverMaxEvent(parent,
-                                                    networkPartitionContext.getId(),
-                                                    instanceContext.getId(),
-                                                    appId);
+                                    if (groupScalingEnabled) {
+                                        if(networkPartitionContext.getPendingInstancesCount() == 0) {
+                                            //one of the child is loaded and max out.
+                                            // Hence creating new group instance
+                                            if(log.isDebugEnabled()) {
+                                                log.debug("Handling group scaling for the [group] " + id +
+                                                        "upon a max out event from " +
+                                                        "the children");
+                                            }
+                                            boolean createOnDemand = createInstanceOnDemand(instanceContext.
+                                                    getParentInstanceId());
+                                            if (!createOnDemand) {
+                                                //couldn't create new instance. Hence notifying the parent
+                                                MonitorStatusEventBuilder.handleScalingOverMaxEvent(parent,
+                                                        networkPartitionContext.getId(),
+                                                        instanceContext.getId(),
+                                                        appId);
+                                            }
                                         } else {
-                                            //Resetting the max events
-                                            instanceContext.setIdToScalingOverMaxEvent(
-                                                    new HashMap<String, ScalingOverMaxEvent>());
+                                            if(log.isDebugEnabled()) {
+                                                log.debug("Pending Group instance found. " +
+                                                        "Hence waiting for it to become active");
+                                            }
                                         }
+
                                     } else {
                                         //notifying the parent if no group scaling enabled here
                                         MonitorStatusEventBuilder.handleScalingOverMaxEvent(parent,
@@ -159,7 +162,9 @@ public class GroupMonitor extends ParentComponentMonitor {
                                             instanceContext.getId(),
                                             appId);
                                 }
-
+                                //Resetting the max events
+                                instanceContext.setIdToScalingOverMaxEvent(
+                                        new HashMap<String, ScalingOverMaxEvent>());
                             } else {
                                 handleDependentScaling(instanceContext, networkPartitionContext);
                             }


[2/8] stratos git commit: handling scaling dependents when max out one of the children in group

Posted by re...@apache.org.
handling scaling dependents when max out one of the children in group


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/84015c29
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/84015c29
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/84015c29

Branch: refs/heads/master
Commit: 84015c29a0eff56eb52782c0c9cc5ac4277e907f
Parents: eec3a72
Author: reka <rt...@gmail.com>
Authored: Sun Dec 21 12:59:37 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Sun Dec 21 12:59:37 2014 +0530

----------------------------------------------------------------------
 .../monitor/component/GroupMonitor.java         | 50 +++++++++++++-------
 1 file changed, 32 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/84015c29/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
index 957e0d3..fd7717d 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
@@ -115,35 +115,49 @@ public class GroupMonitor extends ParentComponentMonitor {
                         if (instance.getStatus().getCode() <= GroupStatus.Active.getCode()) {
                             //Gives priority to scaling max out rather than dependency scaling
                             if (!instanceContext.getIdToScalingOverMaxEvent().isEmpty()) {
-                                //handling the group scaling
-                                if (groupScalingEnabled) {
-                                    //one of the child is loaded and max out.
-                                    // Hence creating new group instance
-                                    if(log.isDebugEnabled()) {
-                                        log.debug("Handling group scaling for the [group] " + id +
-                                                "upon a max out event from " +
-                                                "the children");
-                                    }
-                                    boolean createOnDemand = createInstanceOnDemand(instanceContext.
-                                            getParentInstanceId());
-                                    if (!createOnDemand) {
-                                        //couldn't create new instance. Hence notifying the parent
+                                if(!hasScalingDependents) {
+                                    //handling the group scaling
+                                    if (groupScalingEnabled) {
+                                        //one of the child is loaded and max out.
+                                        // Hence creating new group instance
+                                        if(log.isDebugEnabled()) {
+                                            log.debug("Handling group scaling for the [group] " + id +
+                                                    "upon a max out event from " +
+                                                    "the children");
+                                        }
+                                        boolean createOnDemand = createInstanceOnDemand(instanceContext.
+                                                getParentInstanceId());
+                                        if (!createOnDemand) {
+                                            //couldn't create new instance. Hence notifying the parent
+                                            MonitorStatusEventBuilder.handleScalingOverMaxEvent(parent,
+                                                    networkPartitionContext.getId(),
+                                                    instanceContext.getId(),
+                                                    appId);
+                                        } else {
+                                            //Resetting the max events
+                                            instanceContext.setIdToScalingOverMaxEvent(
+                                                    new HashMap<String, ScalingOverMaxEvent>());
+                                        }
+                                    } else {
+                                        //notifying the parent if no group scaling enabled here
                                         MonitorStatusEventBuilder.handleScalingOverMaxEvent(parent,
                                                 networkPartitionContext.getId(),
                                                 instanceContext.getId(),
                                                 appId);
-                                    } else {
-                                        //Resetting the max events
-                                        instanceContext.setIdToScalingOverMaxEvent(
-                                                new HashMap<String, ScalingOverMaxEvent>());
                                     }
                                 } else {
-                                    //notifying the parent if no group scaling enabled here
+                                    //has scaling dependents. Should notify the parent
+                                    if(log.isDebugEnabled()) {
+                                        log.debug("This [Group] " + id + " [scale-up] dependencies. " +
+                                                "Hence notifying the [parent] " + parent.getId() );
+                                    }
+                                    //notifying the parent when scale dependents found
                                     MonitorStatusEventBuilder.handleScalingOverMaxEvent(parent,
                                             networkPartitionContext.getId(),
                                             instanceContext.getId(),
                                             appId);
                                 }
+
                             } else {
                                 handleDependentScaling(instanceContext, networkPartitionContext);
                             }