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:08 UTC
[2/3] stratos git commit: fixing nested dependent scaling
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()));