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/22 06:39:07 UTC

[1/3] stratos git commit: fixing dependent scaling to take decision based on max

Repository: stratos
Updated Branches:
  refs/heads/master 67e014219 -> 09fec520b


fixing dependent scaling to take decision based on max


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

Branch: refs/heads/master
Commit: 09fec520b6ab580fc148f97fb475b2eb3e2a98ce
Parents: dd2456a
Author: reka <rt...@gmail.com>
Authored: Mon Dec 22 01:27:52 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Mon Dec 22 11:08:33 2014 +0530

----------------------------------------------------------------------
 .../src/main/conf/drools/dependent-scaling.drl  | 31 ++++++++++++--------
 .../src/main/conf/drools/scaling.drl            | 12 ++++----
 2 files changed, 25 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/09fec520/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 92f80b1..0d98d0e 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
@@ -50,22 +50,29 @@ dialect "mvel"
 	then
 
         if(scaleUp) {
-
-            int additionalInstances = roundedRequiredInstanceCount - clusterInstanceContext.getNonTerminatedMemberCount();
+            int clusterMaxMembers = clusterInstanceContext.getMaxInstanceCount();
+            int currentMemberCount = clusterInstanceContext.getNonTerminatedMemberCount();
+            int additionalInstances = roundedRequiredInstanceCount - currentMemberCount;
             int count = 0;
             boolean partitionsAvailable = true;
 
-            while(count != additionalInstances  && partitionsAvailable){
-
-                ClusterLevelPartitionContext partitionContext =  (ClusterLevelPartitionContext)autoscaleAlgorithm.getNextScaleUpPartitionContext(clusterInstanceContext.getPartitionCtxtsAsAnArray());
-                if(partitionContext != null) {
-
-                    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++;
+            log.debug("[dependent-scale] is running for [cluster] " + clusterId +
+            " [cluster-instance] " + clusterInstanceContext.getId() + " max member count is: " +
+                clusterMaxMembers + " current member count is: " + currentMemberCount);
+
+            while(count != additionalInstances  && partitionsAvailable) {
+                if(currentMemberCount < clusterMaxMembers) {
+                    ClusterLevelPartitionContext partitionContext =  (ClusterLevelPartitionContext)autoscaleAlgorithm.getNextScaleUpPartitionContext(clusterInstanceContext.getPartitionCtxtsAsAnArray());
+                    if(partitionContext != null) {
+
+                        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 {
+                        partitionsAvailable = false;
+                    }
                 } else {
-
                     partitionsAvailable = false;
                 }
             }

http://git-wip-us.apache.org/repos/asf/stratos/blob/09fec520/products/stratos/modules/distribution/src/main/conf/drools/scaling.drl
----------------------------------------------------------------------
diff --git a/products/stratos/modules/distribution/src/main/conf/drools/scaling.drl b/products/stratos/modules/distribution/src/main/conf/drools/scaling.drl
index 75827c3..7ed05f4 100644
--- a/products/stratos/modules/distribution/src/main/conf/drools/scaling.drl
+++ b/products/stratos/modules/distribution/src/main/conf/drools/scaling.drl
@@ -149,12 +149,12 @@ dialect "mvel"
                         }
                     }
                 }
-            } else{
-                log.info("[scale-up] Max is reached, hence not scaling up cluster monitor itself. [cluster] " + clusterId + " [instance id]" + clusterInstanceContext.getId() + " [max] " + clusterInstanceContext.getMaxInstanceCount());
-                if(clusterInstanceContext.isInGroupScalingEnabledSubtree()){
-
-                    delegator.delegateScalingOverMaxNotification(clusterId, clusterInstanceContext.getNetworkPartitionId(), clusterInstanceContext.getId());
-                }
+            } else {
+                log.info("[scale-up] Max is reached, hence not scaling up cluster monitor itself and
+                        notifying to parent for possible group scaling or app bursting.
+                        [cluster] " + clusterId + " [instance id]" + clusterInstanceContext.getId() +
+                        " [max] " + clusterInstanceContext.getMaxInstanceCount());
+                delegator.delegateScalingOverMaxNotification(clusterId, clusterInstanceContext.getNetworkPartitionId(), clusterInstanceContext.getId());
             }
         } else if(scaleDown){
 


[2/3] stratos git commit: fixing nested dependent scaling

Posted by re...@apache.org.
fixing nested dependent scaling


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

Branch: refs/heads/master
Commit: dd2456a6981844b8517182f3da8114505dcd6a7a
Parents: 7d229f3
Author: reka <rt...@gmail.com>
Authored: Mon Dec 22 01:27:21 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Mon Dec 22 11:08:33 2014 +0530

----------------------------------------------------------------------
 .../context/cluster/ClusterInstanceContext.java |  2 +-
 .../monitor/component/ApplicationMonitor.java   |  5 +-
 .../monitor/component/GroupMonitor.java         | 96 ++++++++++++++------
 .../builder/MonitorStatusEventBuilder.java      |  4 +-
 .../autoscaler/rule/RuleTasksDelegator.java     |  4 +-
 5 files changed, 76 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/dd2456a6/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterInstanceContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterInstanceContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterInstanceContext.java
index 86ed605..411d48d 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterInstanceContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterInstanceContext.java
@@ -104,7 +104,7 @@ public class ClusterInstanceContext extends InstanceContext {
 
     public ClusterLevelPartitionContext[] getPartitionCtxtsAsAnArray() {
 
-        return partitionCtxts.toArray(new ClusterLevelPartitionContext[0]);
+        return partitionCtxts.toArray(new ClusterLevelPartitionContext[partitionCtxts.size()]);
     }
 
     public boolean partitionCtxtAvailable(String partitionId) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/dd2456a6/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 9896cba..33c79f2 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
@@ -69,9 +69,6 @@ public class ApplicationMonitor extends ParentComponentMonitor {
     @Override
     public void run() {
         try {
-            if (log.isDebugEnabled()) {
-                log.debug("Application monitor is running : " + this.toString());
-            }
             monitor();
         } catch (Exception e) {
             log.error("Application monitor failed : " + this.toString(), e);
@@ -86,7 +83,7 @@ public class ApplicationMonitor extends ParentComponentMonitor {
             @Override
             public void run() {
                 if (log.isDebugEnabled()) {
-                    log.debug("Application monitor is running====== : " + this.toString());
+                    log.debug("Application monitor is running for [application]" + appId + " =======");
                 }
                 for (NetworkPartitionContext networkPartitionContext : networkPartitionContexts) {
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/dd2456a6/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 40dc297..5bb8aab 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
@@ -83,9 +83,6 @@ public class GroupMonitor extends ParentComponentMonitor {
     @Override
     public void run() {
         try {
-            if (log.isDebugEnabled()) {
-                log.debug("Group monitor is running : " + this.toString());
-            }
             monitor();
         } catch (Exception e) {
             log.error("Group monitor failed : " + this.toString(), e);
@@ -100,7 +97,7 @@ public class GroupMonitor extends ParentComponentMonitor {
             @Override
             public void run() {
                 if (log.isDebugEnabled()) {
-                    log.debug("Group monitor is running====== : " + this.toString());
+                    log.debug("Group monitor is running for the [group]: " + id + " ==============");
                 }
                 for (NetworkPartitionContext networkPartitionContext : networkPartitionContexts) {
 
@@ -154,10 +151,26 @@ public class GroupMonitor extends ParentComponentMonitor {
                                                 "Hence notifying the [parent] " + parent.getId() );
                                     }
                                     //notifying the parent when scale dependents found
-                                    MonitorStatusEventBuilder.handleScalingOverMaxEvent(parent,
-                                            networkPartitionContext.getId(),
-                                            instanceContext.getParentInstanceId(),
-                                            appId);
+                                    int maxInstances = ((GroupLevelNetworkPartitionContext)
+                                            networkPartitionContext).getMaxInstanceCount();
+                                    if(groupScalingEnabled && maxInstances > networkPartitionContext.
+                                                                    getNonTerminatedInstancesCount()) {
+                                        //increase group by one more instance
+                                        float minInstances = ((GroupLevelNetworkPartitionContext)
+                                                networkPartitionContext).getMinInstanceCount();
+
+                                        float factor = (minInstances + 1)/minInstances;
+                                        MonitorStatusEventBuilder.
+                                                handleClusterScalingEvent(parent,
+                                                        networkPartitionContext.getId(),
+                                                        instanceContext.getParentInstanceId(),
+                                                        factor, id);
+                                    } else {
+                                        MonitorStatusEventBuilder.handleScalingOverMaxEvent(parent,
+                                                networkPartitionContext.getId(),
+                                                instanceContext.getParentInstanceId(),
+                                                id);
+                                    }
                                 }
                                 //Resetting the max events
                                 instanceContext.setIdToScalingOverMaxEvent(
@@ -339,28 +352,55 @@ public class GroupMonitor extends ParentComponentMonitor {
 
     @Override
     public void onParentScalingEvent(ScalingEvent scalingEvent) {
-        //TODO group scaling, if there are enough spaces else notify the parent with max out
-        //Notifying children, if this group has scaling dependencies
-        if (scalingDependencies != null && !scalingDependencies.isEmpty()) {
-            for (ScalingDependentList scalingDependentList : scalingDependencies) {
-                if (scalingDependentList.getScalingDependentListComponents().
-                        contains(scalingEvent.getId())) {
-                    for (String scalingDependentListComponent : scalingDependentList
-                            .getScalingDependentListComponents()) {
-                        Monitor monitor = aliasToActiveMonitorsMap.get(
-                                scalingDependentListComponent);
-                        if (monitor instanceof GroupMonitor ||
-                                monitor instanceof ClusterMonitor) {
-                            ScalingEvent childScalingEvent = new ScalingEvent(monitor.getId(),
-                                    monitor.getId(),
-                                    scalingEvent.getInstanceId(),
-                                    scalingEvent.getFactor());
-                            monitor.onParentScalingEvent(childScalingEvent);
+        //Parent notification always brings up new group instances in order to keep the ratio.
+        String networkPartitionId = scalingEvent.getNetworkPartitionId();
+        final String parentInstanceId = scalingEvent.getInstanceId();
+
+        final NetworkPartitionContext networkPartitionContext = this.networkPartitionCtxts.
+                get(networkPartitionId);
+        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(parentInstanceId);
+                if (!createOnDemand) {
+                    //couldn't create new instance. Hence notifying the parent
+                    Runnable sendScaleMaxOut = new Runnable() {
+                        @Override
+                        public void run() {
+                            MonitorStatusEventBuilder.handleScalingOverMaxEvent(parent,
+                                    networkPartitionContext.getId(),
+                                    parentInstanceId,
+                                    appId);
                         }
-                    }
+                    };
+                    sendScaleMaxOut.run();
+                }
+            } else {
+                if(log.isDebugEnabled()) {
+                    log.debug("Pending Group instance found. " +
+                            "Hence waiting for it to become active");
                 }
-                break;
             }
+
+        } else {
+            //notifying the parent if no group scaling enabled here
+            Runnable sendScaleMaxOut = new Runnable() {
+                @Override
+                public void run() {
+                    MonitorStatusEventBuilder.handleScalingOverMaxEvent(parent,
+                            networkPartitionContext.getId(),
+                            parentInstanceId,
+                            appId);
+                }
+            };
+            sendScaleMaxOut.run();
+
         }
     }
 
@@ -564,8 +604,10 @@ public class GroupMonitor extends ParentComponentMonitor {
 
             // Create GroupInstance for partition instance and add to required contexts for minimum instance count
             int groupMin = group.getGroupMinInstances();
+            int groupMax = group.getGroupMaxInstances();
             //Setting the networkpartition minimum instances as group min instances
             groupLevelNetworkPartitionContext.setMinInstanceCount(groupMin);
+            groupLevelNetworkPartitionContext.setMaxInstanceCount(groupMax);
 
             //Have to check whether group has generated its own instances
             List<Instance> existingGroupInstances = group.getInstanceContextsWithParentId(parentInstanceId);

http://git-wip-us.apache.org/repos/asf/stratos/blob/dd2456a6/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/builder/MonitorStatusEventBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/builder/MonitorStatusEventBuilder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/builder/MonitorStatusEventBuilder.java
index ed8fe40..0cd5b65 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/builder/MonitorStatusEventBuilder.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/builder/MonitorStatusEventBuilder.java
@@ -54,10 +54,10 @@ public class MonitorStatusEventBuilder {
 
     public static void handleClusterScalingEvent(ParentComponentMonitor parent,
                                                  String networkPartitionId, String instanceId, float factor,
-                                                 String appId) {
+                                                 String id) {
 
         //Send notifications to parent of the cluster monitor
-        ScalingEvent scalingEvent = new ScalingEvent(appId, networkPartitionId, instanceId, factor) ;
+        ScalingEvent scalingEvent = new ScalingEvent(id, networkPartitionId, instanceId, factor) ;
         notifyParent(parent, scalingEvent);
     }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/dd2456a6/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 262acfd..c77cc5f 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
@@ -206,7 +206,9 @@ public class RuleTasksDelegator {
                                     isPrimary,
                                     minimumCountOfNetworkPartition);
             if (memberContext != null) {
-                clusterMonitorPartitionContext.addPendingMember(memberContext);
+                ClusterLevelPartitionContext partitionContext = clusterInstanceContext.
+                        getPartitionCtxt(clusterMonitorPartitionContext.getPartitionId());
+                partitionContext.addPendingMember(memberContext);
                 if (log.isDebugEnabled()) {
                     log.debug(String.format("Pending member added, [member] %s [partition] %s", memberContext.getMemberId(),
                             memberContext.getPartition().getId()));


[3/3] stratos git commit: issue due to recent refactoring

Posted by re...@apache.org.
issue due to recent refactoring


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

Branch: refs/heads/master
Commit: 7d229f333aacce06ab1c8c33e43ef568581fbf87
Parents: 67e0142
Author: reka <rt...@gmail.com>
Authored: Mon Dec 22 01:26:59 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Mon Dec 22 11:08:33 2014 +0530

----------------------------------------------------------------------
 .../cloud/controller/services/impl/CloudControllerServiceImpl.java  | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/7d229f33/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
index e713cb7..260cc34 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
@@ -433,6 +433,7 @@ public class CloudControllerServiceImpl implements CloudControllerService {
         memberContext.setClusterInstanceId(instanceContext.getClusterInstanceId());
         memberContext.setNetworkPartitionId(instanceContext.getNetworkPartitionId());
         memberContext.setPartition(instanceContext.getPartition());
+        memberContext.setInitTime(instanceContext.getInitTime());
         memberContext.setProperties(instanceContext.getProperties());
         memberContext.setInitTime(System.currentTimeMillis());
         return memberContext;