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/16 12:57:38 UTC
[1/6] stratos git commit: refactoring and fixing instance
communication issue when having more than one instance
Repository: stratos
Updated Branches:
refs/heads/4.1.0-test cbc02ad41 -> 66bc3acf3
refactoring and fixing instance communication issue when having more than one instance
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/2d9dceb5
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/2d9dceb5
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/2d9dceb5
Branch: refs/heads/4.1.0-test
Commit: 2d9dceb56367345e82b212dddc26c302b983faff
Parents: dad6aa5
Author: reka <rt...@gmail.com>
Authored: Tue Dec 16 14:47:08 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Tue Dec 16 17:27:20 2014 +0530
----------------------------------------------------------------------
.../parser/DefaultApplicationParser.java | 4 +-
.../applications/topic/ApplicationBuilder.java | 106 ++++++++++---------
.../monitor/cluster/VMClusterMonitor.java | 4 +-
.../monitor/component/GroupMonitor.java | 26 +++--
.../processor/group/GroupStatusProcessor.java | 4 +-
.../group/GroupStatusProcessorChain.java | 5 +-
6 files changed, 82 insertions(+), 67 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/2d9dceb5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/parser/DefaultApplicationParser.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/parser/DefaultApplicationParser.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/parser/DefaultApplicationParser.java
index fbde278..6d7db2b 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/parser/DefaultApplicationParser.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/parser/DefaultApplicationParser.java
@@ -651,8 +651,8 @@ public class DefaultApplicationParser implements ApplicationParser {
PayloadData payloadData = ApplicationUtils.createPayload(appId, groupName, cartridgeInfo, subscriptionKey, tenantId, clusterId,
hostname, repoUrl, alias, null, dependencyAliases, properties);
- //String oAuth_token = createToken(appId);
- //payloadData.add(TOKEN_PAYLOD_PARAM_NAME, oAuth_token);
+ String oAuth_token = createToken(appId);
+ payloadData.add(TOKEN_PAYLOD_PARAM_NAME, oAuth_token);
String textPayload = payloadData.toString();
http://git-wip-us.apache.org/repos/asf/stratos/blob/2d9dceb5/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 6768fa9..e842a6e 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
@@ -141,8 +141,8 @@ public class ApplicationBuilder {
}
ApplicationStatus status = ApplicationStatus.Active;
- ApplicationInstance context = application.getInstanceContexts(instanceId);
- if (context.isStateTransitionValid(status)) {
+ ApplicationInstance applicationInstance = application.getInstanceContexts(instanceId);
+ if (applicationInstance.isStateTransitionValid(status)) {
//setting the status, persist and publish
application.setStatus(status, instanceId);
updateApplicationMonitor(appId, status, instanceId);
@@ -151,7 +151,7 @@ public class ApplicationBuilder {
} else {
log.warn(String.format("Application state transition is not valid: [application-id] %s " +
" [instance-id] %s [current-status] %s [status-requested] %s",
- appId, instanceId, context.getStatus(), status));
+ appId, instanceId, applicationInstance.getStatus(), status));
}
}
@@ -171,8 +171,8 @@ public class ApplicationBuilder {
}
ApplicationStatus status = ApplicationStatus.Inactive;
- ApplicationInstance context = application.getInstanceContexts(instanceId);
- if (context.isStateTransitionValid(status)) {
+ ApplicationInstance applicationInstance = application.getInstanceContexts(instanceId);
+ if (applicationInstance.isStateTransitionValid(status)) {
//setting the status, persist and publish
application.setStatus(status, instanceId);
updateApplicationMonitor(appId, status, instanceId);
@@ -181,7 +181,7 @@ public class ApplicationBuilder {
} else {
log.warn(String.format("Application state transition is not valid: [application-id] %s " +
" [instance-id] %s [current-status] %s [status-requested] %s",
- appId, instanceId, context.getStatus(), status));
+ appId, instanceId, applicationInstance.getStatus(), status));
}
}
@@ -241,15 +241,16 @@ public class ApplicationBuilder {
log.warn("Application does not exist: [application-id] " + appId);
} else {
Application application = applications.getApplication(appId);
- ApplicationInstance instance = application.getInstanceContexts(instanceId);
+ ApplicationInstance applicationInstance = application.getInstanceContexts(instanceId);
ApplicationStatus status = ApplicationStatus.Terminated;
- if (instance.isStateTransitionValid(status)) {
+ if (applicationInstance.isStateTransitionValid(status)) {
//setting the status, persist and publish
- instance.setStatus(status);
+ applicationInstance.setStatus(status);
updateApplicationMonitor(appId, status, instanceId);
ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance().
getAppMonitor(appId);
- applicationMonitor.getNetworkPartitionContext(instance.getNetworkPartitionId()).
+ applicationMonitor.getNetworkPartitionContext(applicationInstance.
+ getNetworkPartitionId()).
removeClusterApplicationContext(instanceId);
applicationMonitor.removeInstance(instanceId);
application.removeInstance(instanceId);
@@ -313,12 +314,14 @@ public class ApplicationBuilder {
return;
}
- GroupInstance context = group.getInstanceContexts(instanceId);
+ GroupInstance groupInstance = group.getInstanceContexts(instanceId);
GroupStatus status = GroupStatus.Terminated;
- if (context != null) {
- if (context.isStateTransitionValid(status)) {
+ String parentId;
+ if (groupInstance != null) {
+ if (groupInstance.isStateTransitionValid(status)) {
//setting the status, persist and publish
- context.setStatus(status);
+ groupInstance.setStatus(status);
+ parentId = groupInstance.getParentId();
//removing the group instance and context
GroupMonitor monitor = getGroupMonitor(appId, groupId);
ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance().
@@ -332,21 +335,21 @@ public class ApplicationBuilder {
}
}
GroupLevelNetworkPartitionContext networkPartitionContext =
- monitor.getNetworkPartitionContext(context.getNetworkPartitionId());
+ monitor.getNetworkPartitionContext(groupInstance.getNetworkPartitionId());
networkPartitionContext.removeClusterGroupContext(instanceId);
- if (context.getPartitionId() != null) {
- networkPartitionContext.getPartitionCtxt(context.getPartitionId()).
- removeActiveInstance(context);
+ if (groupInstance.getPartitionId() != null) {
+ networkPartitionContext.getPartitionCtxt(groupInstance.getPartitionId()).
+ removeActiveInstance(groupInstance);
}
monitor.removeInstance(instanceId);
group.removeInstance(instanceId);
ApplicationHolder.persistApplication(application);
ApplicationsEventPublisher.sendGroupInstanceTerminatedEvent(appId, groupId, instanceId);
- monitor.setStatus(status, instanceId);
+ monitor.setStatus(status, instanceId, parentId);
}
} else {
log.warn("Group state transition is not valid: [group-id] " + groupId +
- " [instance-id] " + instanceId + " [current-state] " + context.getStatus()
+ " [instance-id] " + instanceId + " [current-state] " + groupInstance.getStatus()
+ "[requested-state] " + status);
}
@@ -379,18 +382,18 @@ public class ApplicationBuilder {
return;
}
- GroupInstance context = group.getInstanceContexts(instanceId);
+ GroupInstance groupInstance = group.getInstanceContexts(instanceId);
GroupStatus status = GroupStatus.Active;
- if (context != null) {
- if (context.isStateTransitionValid(status)) {
+ if (groupInstance != null) {
+ if (groupInstance.isStateTransitionValid(status)) {
//setting the status, persist and publish
- context.setStatus(status);
- updateGroupMonitor(appId, groupId, status, instanceId);
+ groupInstance.setStatus(status);
+ updateGroupMonitor(appId, groupId, status, instanceId, groupInstance.getParentId());
ApplicationHolder.persistApplication(application);
ApplicationsEventPublisher.sendGroupInstanceActivatedEvent(appId, groupId, instanceId);
} else {
log.warn("Group state transition is not valid: [group-id] " + groupId +
- " [instance-id] " + instanceId + " [current-state] " + context.getStatus()
+ " [instance-id] " + instanceId + " [current-state] " + groupInstance.getStatus()
+ "[requested-state] " + status);
}
@@ -404,7 +407,7 @@ public class ApplicationBuilder {
String parentId,
String networkPartitionId,
String partitionId) {
- GroupInstance instance = null;
+ GroupInstance groupInstance = null;
ApplicationHolder.acquireWriteLock();
try {
if (log.isDebugEnabled()) {
@@ -417,14 +420,14 @@ public class ApplicationBuilder {
if (application == null) {
log.warn(String.format("Application %s does not exist",
appId));
- return instance;
+ return groupInstance;
}
Group group = application.getGroupRecursively(groupId);
if (group == null) {
log.warn(String.format("Group %s does not exist when creating group",
groupId));
- return instance;
+ return groupInstance;
}
GroupStatus status = GroupStatus.Created;
@@ -441,15 +444,15 @@ public class ApplicationBuilder {
if (!group.containsInstanceContext(instanceId)) {
//setting the status, persist and publish
- instance = new GroupInstance(groupId, instanceId);
- instance.setParentId(parentId);
- instance.setPartitionId(partitionId);
- instance.setNetworkPartitionId(networkPartitionId);
- instance.setStatus(status);
- group.addInstance(instanceId, instance);
+ groupInstance = new GroupInstance(groupId, instanceId);
+ groupInstance.setParentId(parentId);
+ groupInstance.setPartitionId(partitionId);
+ groupInstance.setNetworkPartitionId(networkPartitionId);
+ groupInstance.setStatus(status);
+ group.addInstance(instanceId, groupInstance);
//updateGroupMonitor(appId, groupId, status);
ApplicationHolder.persistApplication(application);
- ApplicationsEventPublisher.sendGroupInstanceCreatedEvent(appId, groupId, instance);
+ ApplicationsEventPublisher.sendGroupInstanceCreatedEvent(appId, groupId, groupInstance);
} else {
log.warn("Group Instance Context already exists: [group-id] " + groupId +
" [Group-Instance-Id] " + instanceId);
@@ -459,7 +462,7 @@ public class ApplicationBuilder {
}
- return instance;
+ return groupInstance;
}
@@ -485,18 +488,18 @@ public class ApplicationBuilder {
return;
}
- GroupInstance context = group.getInstanceContexts(instanceId);
+ GroupInstance groupInstance = group.getInstanceContexts(instanceId);
GroupStatus status = GroupStatus.Inactive;
- if (context != null) {
- if (context.isStateTransitionValid(status)) {
+ if (groupInstance != null) {
+ if (groupInstance.isStateTransitionValid(status)) {
//setting the status, persist and publish
- context.setStatus(status);
- updateGroupMonitor(appId, groupId, status, instanceId);
+ groupInstance.setStatus(status);
+ updateGroupMonitor(appId, groupId, status, instanceId, groupInstance.getParentId());
ApplicationHolder.persistApplication(application);
ApplicationsEventPublisher.sendGroupInstanceInactivateEvent(appId, groupId, instanceId);
} else {
log.warn("Group state transition is not valid: [group-id] " + groupId +
- " [instance-id] " + instanceId + " [current-state] " + context.getStatus()
+ " [instance-id] " + instanceId + " [current-state] " + groupInstance.getStatus()
+ "[requested-state] " + status);
}
@@ -530,18 +533,18 @@ public class ApplicationBuilder {
try {
ApplicationHolder.acquireWriteLock();
- GroupInstance context = group.getInstanceContexts(instanceId);
+ GroupInstance groupInstance = group.getInstanceContexts(instanceId);
GroupStatus status = GroupStatus.Terminating;
- if (context != null) {
- if (context.isStateTransitionValid(status)) {
+ if (groupInstance != null) {
+ if (groupInstance.isStateTransitionValid(status)) {
//setting the status, persist and publish
- context.setStatus(status);
- updateGroupMonitor(appId, groupId, status, instanceId);
+ groupInstance.setStatus(status);
+ updateGroupMonitor(appId, groupId, status, instanceId, groupInstance.getParentId());
ApplicationHolder.persistApplication(application);
ApplicationsEventPublisher.sendGroupInstanceTerminatingEvent(appId, groupId, instanceId);
} else {
log.warn("Group state transition is not valid: [group-id] " + groupId +
- " [instance-id] " + instanceId + " [current-state] " + context.getStatus()
+ " [instance-id] " + instanceId + " [current-state] " + groupInstance.getStatus()
+ "[requested-state] " + status);
}
@@ -568,10 +571,11 @@ public class ApplicationBuilder {
}
- private static void updateGroupMonitor(String appId, String groupId, GroupStatus status, String instanceId) {
+ private static void updateGroupMonitor(String appId, String groupId,
+ GroupStatus status, String instanceId, String parentInstanceId) {
GroupMonitor monitor = getGroupMonitor(appId, groupId);
if (monitor != null) {
- monitor.setStatus(status, instanceId);
+ monitor.setStatus(status, instanceId, parentInstanceId);
} else {
log.warn("Group monitor cannot be found: [group-id] " + groupId +
" [application-id] " + appId);
http://git-wip-us.apache.org/repos/asf/stratos/blob/2d9dceb5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
index 7d8f2b4..3ee14d2 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
@@ -369,8 +369,8 @@ public class VMClusterMonitor extends AbstractClusterMonitor {
if (statusEvent.getStatus() == GroupStatus.Terminating || statusEvent.getStatus() ==
ApplicationStatus.Terminating) {
if (log.isInfoEnabled()) {
- log.info("Publishing Cluster terminating event for [application]: " + appId +
- " [cluster]: " + this.getClusterId());
+ log.info("Publishing Cluster terminating event for [application] " + appId +
+ " [cluster] " + this.getClusterId() + " [instance] " + instanceId);
}
ClusterStatusEventPublisher.sendClusterTerminatingEvent(getAppId(), getServiceId(), getClusterId(), instanceId);
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/2d9dceb5/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 0052f647..6c487a7 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
@@ -140,7 +140,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
*
* @param status status of the group
*/
- public void setStatus(GroupStatus status, String instanceId) {
+ public void setStatus(GroupStatus status, String instanceId, String parentInstanceId) {
GroupInstance groupInstance = (GroupInstance) this.instanceIdToInstanceMap.get(instanceId);
if (groupInstance == null) {
if (status != GroupStatus.Terminated) {
@@ -151,8 +151,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
groupInstance.setStatus(status);
}
}
- // notify parent
- log.info("[Group] " + this.id + "is notifying the [parent] " + this.parent.getId());
+
if (this.isGroupScalingEnabled()) {
try {
ApplicationHolder.acquireReadLock();
@@ -164,14 +163,20 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
Group group = application.getGroupRecursively(this.id);
if (group != null) {
GroupInstance context = group.getInstanceContexts(instanceId);
+ // notify parent
+ log.info("[Group] " + this.id + "is notifying the [parent] " + this.parent.getId() +
+ " [instance] " + context.getParentId());
MonitorStatusEventBuilder.handleGroupStatusEvent(this.parent,
- status, this.id, context.getParentId());
+ status, this.id, parentInstanceId);
}
}
} finally {
ApplicationHolder.releaseReadLock();
}
} else {
+ // notify parent
+ log.info("[Group] " + this.id + "is notifying the [parent] " + this.parent.getId() +
+ " [instance] " + instanceId);
MonitorStatusEventBuilder.handleGroupStatusEvent(this.parent,
status, this.id, instanceId);
}
@@ -265,12 +270,21 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
//Get all the instances which related to this instanceId
GroupInstance instance = (GroupInstance) this.instanceIdToInstanceMap.get(instanceId);
if (instance != null) {
+ if (log.isInfoEnabled()) {
+ log.info("Publishing Cluster terminating event for [application] " + appId +
+ " [group] " + id + " [instance] " + instanceId);
+ }
ApplicationBuilder.handleGroupTerminatingEvent(appId, id, instanceId);
} else {
- //Using parentId need to get the children
+ //Using parentId need to get the all the children and ask them to terminate
+ // as they can't exist without the parent
List<String> instanceIds = this.getInstancesByParentInstanceId(instanceId);
if (!instanceIds.isEmpty()) {
for (String instanceId1 : instanceIds) {
+ if (log.isInfoEnabled()) {
+ log.info("Publishing Cluster terminating event for [application] " + appId +
+ " [group] " + id + " [instance] " + instanceId1);
+ }
ApplicationBuilder.handleGroupTerminatingEvent(appId, id, instanceId1);
}
}
@@ -278,8 +292,6 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
}
} else if (statusEvent.getStatus() == ClusterStatus.Created ||
statusEvent.getStatus() == GroupStatus.Created) {
- Application application = ApplicationHolder.getApplications().getApplication(this.appId);
- Group group = application.getGroupRecursively(statusEvent.getId());
//starting a new instance of this monitor
createInstanceOnDemand(statusEvent.getInstanceId());
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/2d9dceb5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessor.java
index 057b57c..a22c265 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessor.java
@@ -115,8 +115,8 @@ public abstract class GroupStatusProcessor extends StatusProcessor {
Cluster cluster = service.getCluster(clusterId);
ClusterInstance context = cluster.getInstanceContexts(instanceId);
if (context != null) {
- if(log.isInfoEnabled()) {
- log.info("Checking the status of cluster " + clusterId + " instance status is: " +
+ if(log.isDebugEnabled()) {
+ log.debug("Checking the status of cluster " + clusterId + " instance status is: " +
context.getStatus().toString());
}
if(context.getStatus() == status) {
http://git-wip-us.apache.org/repos/asf/stratos/blob/2d9dceb5/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessorChain.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessorChain.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessorChain.java
index d522738..f43d2bd 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessorChain.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessorChain.java
@@ -57,11 +57,10 @@ public class GroupStatusProcessorChain extends StatusProcessorChain {
if (root == null) {
throw new RuntimeException("Message processor chain is not initialized");
}
- if (log.isInfoEnabled()) {
- log.info("GroupProcessor chain calculating the status for the group " +
+ if (log.isDebugEnabled()) {
+ log.debug("GroupProcessor chain calculating the status for the group " +
"[ " + idOfComponent + " ]");
}
-
root.process(idOfComponent, appId, instanceId);
}
}
[3/6] stratos git commit: Make the Group monitor as a schedular
executor service
Posted by re...@apache.org.
Make the Group monitor as a schedular executor service
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/dad6aa51
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/dad6aa51
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/dad6aa51
Branch: refs/heads/4.1.0-test
Commit: dad6aa51a8bbfde93d7fcd1aad73f030cfcf5369
Parents: ffc8e25
Author: gayan <ga...@puppet.gayan.org>
Authored: Tue Dec 16 13:24:36 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Tue Dec 16 17:27:20 2014 +0530
----------------------------------------------------------------------
.../monitor/component/GroupMonitor.java | 93 ++++++++++----------
1 file changed, 47 insertions(+), 46 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/dad6aa51/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 43a385b..0052f647 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
@@ -90,6 +90,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
this.appId = appId;
networkPartitionCtxts = new HashMap<String, GroupLevelNetworkPartitionContext>();
this.hasScalingDependents = hasScalingDependents;
+ mapScalingEvent=new HashMap<String, ScalingEvent>();
}
@Override
@@ -284,52 +285,52 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
}
}
- @Override
- public void onChildScalingEvent(ScalingEvent scalingEvent) {
- if (hasScalingDependents) {
- //notify parent
- parent.onChildScalingEvent(scalingEvent);
- }
-
- if (log.isDebugEnabled()) {
- log.debug("Child scaling event received to [group]: " + this.getId()
- + ", [network partition]: " + scalingEvent.getNetworkPartitionId()
- + ", [event] " + scalingEvent.getId() + ", [group instance] " + scalingEvent.getInstanceId());
- }
-
- //find the child context of this group,
- //Notifying children, if this group has scaling dependencies
- if (scalingDependencies != null && !scalingDependencies.isEmpty()) {
- // has dependencies. Notify children
- if (aliasToActiveMonitorsMap != null && !aliasToActiveMonitorsMap.values().isEmpty()) {
-
- for (ScalingDependentList scalingDependentList : scalingDependencies) {
-
- for (String scalingDependentListComponent : scalingDependentList.
- getScalingDependentListComponents()) {
-
- if (scalingDependentListComponent.equals(scalingEvent.getId())) {
-
- for (String scalingDependentListComponentInSelectedList :
- scalingDependentList.getScalingDependentListComponents()) {
-
- Monitor monitor = aliasToActiveMonitorsMap.
- get(scalingDependentListComponentInSelectedList);
- if (monitor instanceof GroupMonitor ||
- monitor instanceof VMClusterMonitor) {
- monitor.onParentScalingEvent(scalingEvent);
- }
- }
- break;
- }
- }
- }
- }
- }
- if (scalingEvent.getId().equals(appId)) {
- mapScalingEvent.put(scalingEvent.getInstanceId(), scalingEvent);
- }
- }
+ @Override
+ public void onChildScalingEvent(ScalingEvent scalingEvent) {
+ if (hasScalingDependents) {
+ //notify parent
+ parent.onChildScalingEvent(scalingEvent);
+ }
+
+ if (log.isDebugEnabled()) {
+ log.debug("Child scaling event received to [group]: " + this.getId()
+ + ", [network partition]: " + scalingEvent.getNetworkPartitionId()
+ + ", [event] " + scalingEvent.getId() + ", [group instance] " + scalingEvent.getInstanceId());
+ }
+
+ //find the child context of this group,
+ //Notifying children, if this group has scaling dependencies
+ if (scalingDependencies != null && !scalingDependencies.isEmpty()) {
+ // has dependencies. Notify children
+ if (aliasToActiveMonitorsMap != null && !aliasToActiveMonitorsMap.values().isEmpty()) {
+
+ for (ScalingDependentList scalingDependentList : scalingDependencies) {
+
+ for (String scalingDependentListComponent : scalingDependentList
+ .getScalingDependentListComponents()) {
+
+ if (scalingDependentListComponent.equals(scalingEvent.getId())) {
+
+ for (String scalingDependentListComponentInSelectedList :
+ scalingDependentList.getScalingDependentListComponents()) {
+
+ Monitor monitor = aliasToActiveMonitorsMap.get(
+ scalingDependentListComponentInSelectedList);
+ if (monitor instanceof GroupMonitor ||
+ monitor instanceof VMClusterMonitor) {
+ monitor.onParentScalingEvent(scalingEvent);
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+ if (scalingEvent.getId().equals(appId)) {
+ mapScalingEvent.put(scalingEvent.getInstanceId(), scalingEvent);
+ }
+ }
@Override
public void onChildScalingOverMaxEvent(ScalingOverMaxEvent scalingOverMaxEvent) {
[5/6] stratos git commit: adding support for group scaling
Posted by re...@apache.org.
adding support for group scaling
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/8e8ca216
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/8e8ca216
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/8e8ca216
Branch: refs/heads/4.1.0-test
Commit: 8e8ca216fb7734a89b031da6819f280450209ea1
Parents: 192ad24
Author: reka <rt...@gmail.com>
Authored: Tue Dec 16 17:24:14 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Tue Dec 16 17:27:21 2014 +0530
----------------------------------------------------------------------
.../dependency/DependencyBuilder.java | 55 +++----
.../autoscaler/context/InstanceContext.java | 10 ++
.../context/group/GroupInstanceContext.java | 8 +
.../autoscaler/monitor/EventHandler.java | 7 -
.../stratos/autoscaler/monitor/Monitor.java | 2 +-
.../monitor/cluster/AbstractClusterMonitor.java | 5 -
.../monitor/cluster/VMClusterMonitor.java | 14 +-
.../monitor/component/ApplicationMonitor.java | 13 +-
.../monitor/component/GroupMonitor.java | 158 +++++++++++++++----
.../component/ParentComponentMonitor.java | 2 +-
.../autoscaler/monitor/events/ScalingEvent.java | 8 +-
.../monitor/events/ScalingOverMaxEvent.java | 8 +-
.../builder/MonitorStatusEventBuilder.java | 11 +-
13 files changed, 198 insertions(+), 103 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/8e8ca216/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java
index 7dd9c2a..98d2dc4 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java
@@ -26,9 +26,7 @@ import org.apache.stratos.autoscaler.applications.dependency.context.Application
import org.apache.stratos.autoscaler.exception.application.DependencyBuilderException;
import org.apache.stratos.messaging.domain.applications.*;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.*;
/**
* This is to build the startup/termination dependencies
@@ -161,30 +159,33 @@ public class DependencyBuilder {
* Utility method to build scaling dependencies
*
*/
-// public Set<String> buildScalingDependencies(ParentComponent component) {
-// log.info(" ******* in build scaling dependencies ************ "); // TODO - remove
-// Set<String> scalingDependencies = new HashSet<String>();
-// if(component.getDependencyOrder() != null && component.getDependencyOrder().getScalingDependents() != null) {
-// log.info(" ******* in build scaling dependencies 22 ************ "); // TODO - remove
-// for (String string : component.getDependencyOrder().getScalingDependents()) {
-//
-// log.info(" ******* in build scaling dependencies 33 ************ "); // TODO - remove
-// if (string.startsWith(Constants.GROUP + ".")) {
-// //getting the group alias
-// scalingDependencies.add(getGroupFromStartupOrder(string));
-// } else if (string.startsWith(Constants.CARTRIDGE + ".")) {
-// //getting the cluster alias
-// String id = getClusterFromStartupOrder(string);
-// //getting the cluster-id from cluster alias
-// ClusterDataHolder clusterDataHolder = (ClusterDataHolder) component.getClusterDataMap().get(id);
-// scalingDependencies.add(clusterDataHolder.getClusterId());
-// } else {
-// log.warn("[Scaling Dependency]: " + string + " contains unknown reference");
-// }
-// }
-// }
-// return scalingDependencies;
-// }
+ public Set<ScalingDependentList> buildScalingDependencies(ParentComponent component) {
+ Set<ScalingDependentList> scalingDependentLists = new HashSet<ScalingDependentList>();
+ if(component.getDependencyOrder() != null && component.getDependencyOrder().getScalingDependents() != null) {
+ for (ScalingDependentList dependentList : component.getDependencyOrder().getScalingDependents()) {
+ List<String> scalingDependencies = new ArrayList<String>();
+ for(String string : dependentList.getScalingDependentListComponents()) {
+ if (string.startsWith(Constants.GROUP + ".")) {
+ //getting the group alias
+ scalingDependencies.add(getGroupFromStartupOrder(string));
+ } else if (string.startsWith(Constants.CARTRIDGE + ".")) {
+ //getting the cluster alias
+ String id = getClusterFromStartupOrder(string);
+ //getting the cluster-id from cluster alias
+ ClusterDataHolder clusterDataHolder = (ClusterDataHolder) component.getClusterDataMap().get(id);
+ scalingDependencies.add(clusterDataHolder.getClusterId());
+ } else {
+ log.warn("[Scaling Dependency]: " + string + " contains unknown reference");
+ }
+ }
+ ScalingDependentList scalingDependentList = new ScalingDependentList(scalingDependencies);
+ scalingDependentLists.add(scalingDependentList);
+
+
+ }
+ }
+ return scalingDependentLists;
+ }
/**
* Utility method to get the group alias from the startup order Eg: group.mygroup
http://git-wip-us.apache.org/repos/asf/stratos/blob/8e8ca216/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java
index ce23ec3..8d4ef27 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/InstanceContext.java
@@ -24,6 +24,8 @@ package org.apache.stratos.autoscaler.context;
public abstract class InstanceContext {
protected String id;
+ protected String parentInstanceId;
+
public InstanceContext(String id) {
this.id = id;
}
@@ -35,4 +37,12 @@ public abstract class InstanceContext {
public void setId(String id) {
this.id = id;
}
+
+ public String getParentInstanceId() {
+ return parentInstanceId;
+ }
+
+ public void setParentInstanceId(String parentInstanceId) {
+ this.parentInstanceId = parentInstanceId;
+ }
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/8e8ca216/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java
index c7cbbe6..1f4ae6f 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java
@@ -111,6 +111,14 @@ public class GroupInstanceContext extends InstanceContext {
this.idToScalingEvent.put(scalingEvent.getId(), scalingEvent);
}
+ public ScalingEvent getScalingEvent(String id) {
+ return this.idToScalingEvent.get(id);
+ }
+
+ public ScalingOverMaxEvent getScalingMaxEvent(String id) {
+ return this.idToScalingOverMaxEvent.get(id);
+ }
+
public void removeScalingOverMaxEvent(String id) {
this.idToScalingOverMaxEvent.remove(id);
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/8e8ca216/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/EventHandler.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/EventHandler.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/EventHandler.java
index 7805a13..6cd48e1 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/EventHandler.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/EventHandler.java
@@ -62,11 +62,4 @@ public interface EventHandler {
* @param scalingEvent
*/
public abstract void onParentScalingEvent(ScalingEvent scalingEvent);
-
- /**
- * Triggered when scaling decision is made.
- *
- * @param scalingEvent
- */
- public abstract void onEvent(ScalingEvent scalingEvent);
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/8e8ca216/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java
index 25e54a1..5154b2b 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/Monitor.java
@@ -43,7 +43,7 @@ public abstract class Monitor implements EventHandler {
public abstract void destroy();
- public abstract void createInstanceOnDemand(String instanceId);
+ public abstract boolean createInstanceOnDemand(String instanceId);
public Monitor() {
this.instanceIdToInstanceMap = new HashMap<String, Instance>();
http://git-wip-us.apache.org/repos/asf/stratos/blob/8e8ca216/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/AbstractClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/AbstractClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/AbstractClusterMonitor.java
index 9d44b6c..eb94e8d 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/AbstractClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/AbstractClusterMonitor.java
@@ -328,11 +328,6 @@ public abstract class AbstractClusterMonitor extends Monitor implements Runnable
}
- @Override
- public void onEvent(ScalingEvent scalingEvent) {
-
- }
-
public boolean isHasFaultyMember() {
return hasFaultyMember;
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/8e8ca216/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
index 3ee14d2..8bdbf0a 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java
@@ -442,13 +442,13 @@ public class VMClusterMonitor extends AbstractClusterMonitor {
public void sendClusterScalingEvent(String networkPartitionId, String instanceId, float factor) {
- MonitorStatusEventBuilder.handleClusterScalingEvent(this.parent, networkPartitionId, instanceId, factor, this.id, serviceType);
+ MonitorStatusEventBuilder.handleClusterScalingEvent(this.parent, networkPartitionId, instanceId, factor, this.id);
}
public void sendScalingOverMaxEvent(String networkPartitionId, String instanceId) {
MonitorStatusEventBuilder.handleScalingOverMaxEvent(this.parent, networkPartitionId, instanceId,
- this.id, serviceType);
+ this.id);
}
@Override
@@ -1119,11 +1119,11 @@ public class VMClusterMonitor extends AbstractClusterMonitor {
}
- public void createInstanceOnDemand(String instanceId) {
+ public boolean createInstanceOnDemand(String instanceId) {
Cluster cluster = TopologyManager.getTopology().getService(this.serviceType).
getCluster(this.clusterId);
try {
- createInstance(instanceId, cluster);
+ return createInstance(instanceId, cluster);
//TODO exception
} catch (PolicyValidationException e) {
log.error("Error while creating the cluster instance", e);
@@ -1131,10 +1131,11 @@ public class VMClusterMonitor extends AbstractClusterMonitor {
log.error("Error while creating the cluster instance", e);
}
+ return false;
}
- private void createInstance(String parentInstanceId, Cluster cluster)
+ private boolean createInstance(String parentInstanceId, Cluster cluster)
throws PolicyValidationException, PartitionValidationException {
Instance parentMonitorInstance = this.parent.getInstance(parentInstanceId);
String partitionId = null;
@@ -1178,9 +1179,12 @@ public class VMClusterMonitor extends AbstractClusterMonitor {
} else {
createClusterInstance(cluster.getServiceName(), cluster.getClusterId(), null, parentInstanceId, partitionId,
parentMonitorInstance.getNetworkPartitionId());
+
}
+ return true;
} else {
+ return false;
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/8e8ca216/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 3184e81..69eb68e 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
@@ -188,7 +188,7 @@ public class ApplicationMonitor extends ParentComponentMonitor {
//find the child context of this group,
//Notifying children, if this group has scaling dependencies
- if(scalingDependencies != null && !scalingDependencies.isEmpty()) {
+ /*if(scalingDependencies != null && !scalingDependencies.isEmpty()) {
// has dependencies. Notify children
if (aliasToActiveMonitorsMap != null && !aliasToActiveMonitorsMap.values().isEmpty()) {
@@ -217,11 +217,12 @@ public class ApplicationMonitor extends ParentComponentMonitor {
}
}
}
- }
+ }*/
}
@Override
public void onChildScalingOverMaxEvent(ScalingOverMaxEvent scalingOverMaxEvent) {
+ //TODO to check for the capability of cloud bursting
}
@@ -230,11 +231,6 @@ public class ApplicationMonitor extends ParentComponentMonitor {
}
- @Override
- public void onEvent(ScalingEvent scalingEvent) {
-
- }
-
public boolean startMinimumDependencies(Application application)
throws TopologyInConsistentException, PolicyValidationException {
@@ -417,7 +413,8 @@ public class ApplicationMonitor extends ParentComponentMonitor {
}
@Override
- public void createInstanceOnDemand(String instanceId) {
+ public boolean createInstanceOnDemand(String instanceId) {
+ return false;
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/8e8ca216/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 500a0ff..62b33c2 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
@@ -48,10 +48,7 @@ import org.apache.stratos.messaging.domain.instance.Instance;
import org.apache.stratos.messaging.domain.topology.ClusterStatus;
import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@@ -82,7 +79,8 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
* @throws DependencyBuilderException throws when couldn't build the Topology
* @throws TopologyInConsistentException throws when topology is inconsistent
*/
- public GroupMonitor(Group group, String appId, List<String> parentInstanceId, boolean hasScalingDependents) throws DependencyBuilderException,
+ public GroupMonitor(Group group, String appId, List<String> parentInstanceId,
+ boolean hasScalingDependents) throws DependencyBuilderException,
TopologyInConsistentException {
super(group);
this.groupScalingEnabled = group.isGroupScalingEnabled();
@@ -112,21 +110,107 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
}
public void monitor() {
+ final Collection<GroupLevelNetworkPartitionContext> networkPartitionContexts =
+ this.networkPartitionCtxts.values();
Runnable monitoringRunnable = new Runnable() {
@Override
public void run() {
- float finalFactor = 1;
if (log.isDebugEnabled()) {
log.debug("Group monitor is running====== : " + this.toString());
}
+ for (GroupLevelNetworkPartitionContext networkPartitionContext : networkPartitionContexts) {
+
+ for (GroupInstanceContext instanceContext : networkPartitionContext.
+ getInstanceIdToInstanceContextMap().values()) {
+ GroupInstance instance = (GroupInstance) instanceIdToInstanceMap.
+ get(instanceContext.getId());
+ //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 group scaling
+ if (groupScalingEnabled) {
+ //one of the child is loaded and max out.
+ // Hence creating new group instance
+ 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 {
+ /**
+ * Dependency scaling handling
+ * Finding out the highest scaling events within the scaling dependencies
+ */
+ List<ScalingEvent> highestScalingEventOfDependencies = new ArrayList<ScalingEvent>();
+ for (ScalingDependentList scalingDependentList : scalingDependencies) {
+ ScalingEvent highestFactorEvent = null;
+ for (String scalingDependentListComponent : scalingDependentList.
+ getScalingDependentListComponents()) {
+ ScalingEvent scalingEvent = instanceContext.
+ getScalingEvent(scalingDependentListComponent);
+ if (highestFactorEvent == null) {
+ highestFactorEvent = scalingEvent;
+ } else {
+ if (scalingEvent.getFactor() > highestFactorEvent.getFactor()) {
+ highestFactorEvent = scalingEvent;
+ }
+ }
+ }
+ highestScalingEventOfDependencies.add(highestFactorEvent);
+ }
+
+ for (ScalingEvent highestScalingEventOfChild : highestScalingEventOfDependencies) {
+ //find the child context of this group,
+ //Notifying children, if this group has scaling dependencies
+ if (scalingDependencies != null && !scalingDependencies.isEmpty()) {
+ for (ScalingDependentList scalingDependentList : scalingDependencies) {
+ if (scalingDependentList.getScalingDependentListComponents().
+ contains(highestScalingEventOfChild.getId())) {
+ for (String scalingDependentListComponent : scalingDependentList
+ .getScalingDependentListComponents()) {
+ Monitor monitor = aliasToActiveMonitorsMap.get(
+ scalingDependentListComponent);
+ if (monitor instanceof GroupMonitor ||
+ monitor instanceof VMClusterMonitor) {
+ ScalingEvent scalingEvent = new ScalingEvent(monitor.getId(),
+ networkPartitionContext.getId(),
+ instanceContext.getId(),
+ highestScalingEventOfChild.getFactor());
+ monitor.onParentScalingEvent(scalingEvent);
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ //Resetting the events
+ instanceContext.setIdToScalingEvent(new HashMap<String, ScalingEvent>());
+ }
+ }
+
+
+ }
+
- /*Collection<ScalingEvent> events = mapScalingEvent.values();
- for (ScalingEvent event : events) {
- log.info("Monitor Scaling Event"+event.getId());
}
- //TODO : call the on demand group scaling
- mapScalingEvent.clear();*/
}
};
monitoringRunnable.run();
@@ -171,13 +255,12 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
ApplicationHolder.releaseReadLock();
}
} else {
- // notify parent
+ // notifying the parent
log.info("[Group] " + this.id + "is notifying the [parent] " + this.parent.getId() +
" [instance] " + instanceId);
MonitorStatusEventBuilder.handleGroupStatusEvent(this.parent,
status, this.id, instanceId);
}
- //}
//notify the children about the state change
try {
MonitorStatusEventBuilder.notifyChildren(this, new GroupStatusEvent(status, this.id, instanceId));
@@ -193,7 +276,6 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
String instanceId = statusEvent.getInstanceId();
LifeCycleState status1 = statusEvent.getStatus();
//Events coming from parent are In_Active(in faulty detection), Scaling events, termination
-
if (status1 == GroupStatus.Active) {
//Verifying whether all the minimum no of instances of child
// became active to take next action
@@ -208,13 +290,9 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
onChildActivatedEvent(childId, instanceId);
} else if (status1 == ClusterStatus.Inactive || status1 == GroupStatus.Inactive) {
- //TODO handling restart of stratos
- /*if (!aliasToActiveMonitorsMap.get(childId).hasStartupDependents()) {
- onChildActivatedEvent(childId, instanceId);
- } else {*/
+ //TODO handling restart of stratos when group is inactive
markInstanceAsInactive(childId, instanceId);
onChildInactiveEvent(childId, instanceId);
- //}
} else if (status1 == ClusterStatus.Terminating || status1 == GroupStatus.Terminating) {
//mark the child monitor as inactive in the map
@@ -309,7 +387,8 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
//find the child context of this group,
//Notifying children, if this group has scaling dependencies
- if (scalingDependencies != null && !scalingDependencies.isEmpty()) {
+ //TODO will be handled by the periodic task
+ /*if (scalingDependencies != null && !scalingDependencies.isEmpty()) {
// has dependencies. Notify children
if (aliasToActiveMonitorsMap != null && !aliasToActiveMonitorsMap.values().isEmpty()) {
@@ -336,7 +415,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
}
}
}
-
+*/
String networkPartitionId = scalingEvent.getNetworkPartitionId();
String instanceId = scalingEvent.getInstanceId();
String id = scalingEvent.getId();
@@ -382,13 +461,28 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
@Override
public void onParentScalingEvent(ScalingEvent scalingEvent) {
-
- //Notify all children about scaling
- }
-
- @Override
- public void onEvent(ScalingEvent scalingEvent) {
-
+ //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 VMClusterMonitor) {
+ ScalingEvent childScalingEvent = new ScalingEvent(monitor.getId(),
+ monitor.getId(),
+ scalingEvent.getInstanceId(),
+ scalingEvent.getFactor());
+ monitor.onParentScalingEvent(childScalingEvent);
+ }
+ }
+ }
+ break;
+ }
+ }
}
public boolean isGroupScalingEnabled() {
@@ -545,6 +639,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
String instanceId = groupInstance.getInstanceId();
GroupInstanceContext groupInstanceContext = new GroupInstanceContext(instanceId);
+ groupInstanceContext.setParentInstanceId(groupInstance.getParentId());
groupInstanceContext.addPartitionContext((GroupLevelPartitionContext) partitionContext);
groupLevelNetworkPartitionContext.addInstanceContext(groupInstanceContext);
@@ -659,7 +754,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
* @param parentInstanceId
* @throws org.apache.stratos.autoscaler.exception.application.MonitorNotFoundException
*/
- public void createInstanceOnDemand(String parentInstanceId) {
+ public boolean createInstanceOnDemand(String parentInstanceId) {
// Get parent instance context
Instance parentInstanceContext = getParentInstanceContext(parentInstanceId);
List<String> instanceIdsToStart = new ArrayList<String>();
@@ -715,6 +810,10 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
"[max] " + groupMax + ". Hence trying to notify the parent.");
}
}
+ boolean startedOnDemand = false;
+ if (!instanceIdsToStart.isEmpty()) {
+ startedOnDemand = true;
+ }
//TODO Starting all the instances, can do in parallel
for (String instanceId : instanceIdsToStart) {
try {
@@ -724,6 +823,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
log.error("Error while creating the group/cluster instance", e);
}
}
+ return startedOnDemand;
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/8e8ca216/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
index e9f20c9..00ec33a 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
@@ -89,7 +89,7 @@ public abstract class ParentComponentMonitor extends Monitor {
startupDependencyTree = DependencyBuilder.getInstance().buildDependency(component);
//Building the scaling dependencies for this monitor within the immediate children
if(component.getDependencyOrder() != null) {
- scalingDependencies = component.getDependencyOrder().getScalingDependents();
+ scalingDependencies = DependencyBuilder.getInstance().buildScalingDependencies(component);
}
//Create the executor service with identifier and thread pool size
executorService = StratosThreadPool.getExecutorService(IDENTIFIER, THREAD_POOL_SIZE);
http://git-wip-us.apache.org/repos/asf/stratos/blob/8e8ca216/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingEvent.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingEvent.java
index f5141cf..da96ecd 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingEvent.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingEvent.java
@@ -25,13 +25,11 @@ public class ScalingEvent extends MonitorEvent {
private float factor;
private String networkPartitionId;
- private String serviceName;
- public ScalingEvent(String id, String networkPartitionId, String instanceId, float factor, String serviceName) {
+ public ScalingEvent(String id, String networkPartitionId, String instanceId, float factor) {
super(id, instanceId);
this.factor = factor;
this.networkPartitionId = networkPartitionId;
- this.serviceName = serviceName;
}
public float getFactor() {
@@ -49,8 +47,4 @@ public class ScalingEvent extends MonitorEvent {
public void setNetworkPartitionId(String networkPartitionId) {
this.networkPartitionId = networkPartitionId;
}
-
- public String getServiceName() {
- return serviceName;
- }
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/8e8ca216/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingOverMaxEvent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingOverMaxEvent.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingOverMaxEvent.java
index dc5409d..cee7909 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingOverMaxEvent.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/events/ScalingOverMaxEvent.java
@@ -24,12 +24,10 @@ package org.apache.stratos.autoscaler.monitor.events;
public class ScalingOverMaxEvent extends MonitorEvent {
private String networkPartitionId;
- private String serviceName;
- public ScalingOverMaxEvent(String id, String networkPartitionId, String instanceId, String serviceName) {
+ public ScalingOverMaxEvent(String id, String networkPartitionId, String instanceId) {
super(id, instanceId);
this.networkPartitionId = networkPartitionId;
- this.serviceName = serviceName;
}
public String getNetworkPartitionId() {
@@ -39,8 +37,4 @@ public class ScalingOverMaxEvent extends MonitorEvent {
public void setNetworkPartitionId(String networkPartitionId) {
this.networkPartitionId = networkPartitionId;
}
-
- public String getServiceName() {
- return serviceName;
- }
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/8e8ca216/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 a46114a..3c1c665 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,21 +54,20 @@ public class MonitorStatusEventBuilder {
public static void handleClusterScalingEvent(ParentComponentMonitor parent,
String networkPartitionId, String instanceId, float factor,
- String appId, String serviceName) {
+ String appId) {
//Send notifications to parent of the cluster monitor
- ScalingEvent scalingEvent = new ScalingEvent(appId, networkPartitionId, instanceId, factor,
- serviceName) ;
+ ScalingEvent scalingEvent = new ScalingEvent(appId, networkPartitionId, instanceId, factor) ;
notifyParent(parent, scalingEvent);
}
public static void handleScalingOverMaxEvent(ParentComponentMonitor parent,
String networkPartitionId, String instanceId,
- String appId, String serviceName) {
+ String appId) {
//Send notifications to parent of the cluster monitor
- ScalingOverMaxEvent scalingOverMaxEvent = new ScalingOverMaxEvent(appId, networkPartitionId, instanceId,
- serviceName) ;
+ ScalingOverMaxEvent scalingOverMaxEvent = new ScalingOverMaxEvent(appId, networkPartitionId,
+ instanceId) ;
notifyParent(parent, scalingOverMaxEvent);
}
[4/6] stratos git commit: handling child scaling event and max out
event in group monitor
Posted by re...@apache.org.
handling child scaling event and max out event in group monitor
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/192ad24d
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/192ad24d
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/192ad24d
Branch: refs/heads/4.1.0-test
Commit: 192ad24dd96e41842d658e8e0a0679b3102f795f
Parents: 2d9dceb
Author: reka <rt...@gmail.com>
Authored: Tue Dec 16 15:31:08 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Tue Dec 16 17:27:21 2014 +0530
----------------------------------------------------------------------
.../context/group/GroupInstanceContext.java | 50 ++++-
.../GroupLevelNetworkPartitionContext.java | 5 +
.../monitor/component/GroupMonitor.java | 215 +++++++++++--------
3 files changed, 177 insertions(+), 93 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/192ad24d/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java
index 072fc04..c7cbbe6 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/group/GroupInstanceContext.java
@@ -20,9 +20,13 @@ package org.apache.stratos.autoscaler.context.group;
import org.apache.stratos.autoscaler.context.InstanceContext;
import org.apache.stratos.autoscaler.context.partition.GroupLevelPartitionContext;
+import org.apache.stratos.autoscaler.monitor.events.ScalingEvent;
+import org.apache.stratos.autoscaler.monitor.events.ScalingOverMaxEvent;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
/**
* This will hold the group instance related info
@@ -31,11 +35,16 @@ public class GroupInstanceContext extends InstanceContext {
//partitions of this network partition
private final List<GroupLevelPartitionContext> partitionCtxts;
+ //key=id of the child, value=ScalingEvent
+ private Map<String, ScalingEvent> idToScalingEvent;
+ //key=id of the child, value=MaxOutScalingEvent
+ private Map<String, ScalingOverMaxEvent> idToScalingOverMaxEvent;
public GroupInstanceContext(String id) {
super(id);
partitionCtxts = new ArrayList<GroupLevelPartitionContext>();
-
+ setIdToScalingEvent(new HashMap<String, ScalingEvent>());
+ setIdToScalingOverMaxEvent(new HashMap<String, ScalingOverMaxEvent>());
}
public List<GroupLevelPartitionContext> getPartitionCtxts() {
@@ -78,4 +87,43 @@ public class GroupInstanceContext extends InstanceContext {
return 0;
}
+ public Map<String, ScalingEvent> getIdToScalingEvent() {
+ return idToScalingEvent;
+ }
+
+ public void setIdToScalingEvent(Map<String, ScalingEvent> idToScalingEvent) {
+ this.idToScalingEvent = idToScalingEvent;
+ }
+
+ public Map<String, ScalingOverMaxEvent> getIdToScalingOverMaxEvent() {
+ return idToScalingOverMaxEvent;
+ }
+
+ public void setIdToScalingOverMaxEvent(Map<String, ScalingOverMaxEvent> idToScalingOverMaxEvent) {
+ this.idToScalingOverMaxEvent = idToScalingOverMaxEvent;
+ }
+
+ public void removeScalingEvent(String id) {
+ this.idToScalingEvent.remove(id);
+ }
+
+ public void addScalingEvent(ScalingEvent scalingEvent) {
+ this.idToScalingEvent.put(scalingEvent.getId(), scalingEvent);
+ }
+
+ public void removeScalingOverMaxEvent(String id) {
+ this.idToScalingOverMaxEvent.remove(id);
+ }
+
+ public void addScalingOverMaxEvent(ScalingOverMaxEvent scalingOverMaxEvent) {
+ this.idToScalingOverMaxEvent.put(scalingOverMaxEvent.getId(), scalingOverMaxEvent);
+ }
+
+ public boolean containsScalingEvent(String id) {
+ return this.idToScalingEvent.containsKey(id);
+ }
+
+ public boolean containsScalingOverMaxEvent(String id) {
+ return this.idToScalingOverMaxEvent.containsKey(id);
+ }
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/192ad24d/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/GroupLevelNetworkPartitionContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/GroupLevelNetworkPartitionContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/GroupLevelNetworkPartitionContext.java
index d461258..52af38d 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/GroupLevelNetworkPartitionContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/partition/network/GroupLevelNetworkPartitionContext.java
@@ -20,6 +20,7 @@ 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 org.apache.stratos.autoscaler.context.partition.GroupLevelPartitionContext;
@@ -85,6 +86,10 @@ public class GroupLevelNetworkPartitionContext extends NetworkPartitionContext i
}
+ public GroupInstanceContext getInstanceContext(String instanceId) {
+ return this.instanceIdToInstanceContextMap.get(instanceId);
+ }
+
public int getMinInstanceCount() {
return minInstanceCount;
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/192ad24d/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 6c487a7..500a0ff 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
@@ -48,7 +48,10 @@ import org.apache.stratos.messaging.domain.instance.Instance;
import org.apache.stratos.messaging.domain.topology.ClusterStatus;
import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@@ -60,22 +63,18 @@ import java.util.concurrent.TimeUnit;
public class GroupMonitor extends ParentComponentMonitor implements Runnable {
private static final Log log = LogFactory.getLog(GroupMonitor.class);
+ private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
//has scaling dependents
protected boolean hasScalingDependents;
//Indicates whether groupScaling enabled or not
private boolean groupScalingEnabled;
//Network partition contexts
private Map<String, GroupLevelNetworkPartitionContext> networkPartitionCtxts;
-
- private Map<String, ScalingEvent> mapScalingEvent;
-
//Indicates whether the monitor is destroyed or not
private boolean isDestroyed;
//Monitoring interval of the monitor
private int monitoringIntervalMilliseconds = 60000; //TODO get this from config file
- private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
-
/**
* Constructor of GroupMonitor
*
@@ -90,50 +89,48 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
this.appId = appId;
networkPartitionCtxts = new HashMap<String, GroupLevelNetworkPartitionContext>();
this.hasScalingDependents = hasScalingDependents;
- mapScalingEvent=new HashMap<String, ScalingEvent>();
- }
+ }
@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);
- }
+ if (log.isDebugEnabled()) {
+ log.debug("Group monitor is running : " + this.toString());
+ }
+ monitor();
+ } catch (Exception e) {
+ log.error("Group monitor failed : " + this.toString(), e);
+ }
}
- public void startScheduler() {
- scheduler.scheduleAtFixedRate(this, 0, monitoringIntervalMilliseconds, TimeUnit.MILLISECONDS);
- }
+ public void startScheduler() {
+ scheduler.scheduleAtFixedRate(this, 0, monitoringIntervalMilliseconds, TimeUnit.MILLISECONDS);
+ }
- protected void stopScheduler() {
- scheduler.shutdownNow();
+ protected void stopScheduler() {
+ scheduler.shutdownNow();
}
- public void monitor() {
-
- Runnable monitoringRunnable = new Runnable() {
- @Override
- public void run() {
- float finalFactor = 1;
- if (log.isInfoEnabled()) {
- log.info("Group monitor is running====== : " + this.toString());
- }
-
- Collection<ScalingEvent> events = mapScalingEvent.values();
- for (ScalingEvent event : events) {
- log.info("Monitor Scaling Event"+event.getId());
- }
- //TODO : call the on demand group scaling
- mapScalingEvent.clear();
- }
- };
- monitoringRunnable.run();
- }
+ public void monitor() {
+
+ Runnable monitoringRunnable = new Runnable() {
+ @Override
+ public void run() {
+ float finalFactor = 1;
+ if (log.isDebugEnabled()) {
+ log.debug("Group monitor is running====== : " + this.toString());
+ }
+
+ /*Collection<ScalingEvent> events = mapScalingEvent.values();
+ for (ScalingEvent event : events) {
+ log.info("Monitor Scaling Event"+event.getId());
+ }
+ //TODO : call the on demand group scaling
+ mapScalingEvent.clear();*/
+ }
+ };
+ monitoringRunnable.run();
+ }
/**
* Will set the status of the monitor based on Topology Group status/child status like scaling
@@ -165,7 +162,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
GroupInstance context = group.getInstanceContexts(instanceId);
// notify parent
log.info("[Group] " + this.id + "is notifying the [parent] " + this.parent.getId() +
- " [instance] " + context.getParentId());
+ " [instance] " + context.getParentId());
MonitorStatusEventBuilder.handleGroupStatusEvent(this.parent,
status, this.id, parentInstanceId);
}
@@ -297,56 +294,90 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
}
}
- @Override
- public void onChildScalingEvent(ScalingEvent scalingEvent) {
- if (hasScalingDependents) {
- //notify parent
- parent.onChildScalingEvent(scalingEvent);
- }
-
- if (log.isDebugEnabled()) {
- log.debug("Child scaling event received to [group]: " + this.getId()
- + ", [network partition]: " + scalingEvent.getNetworkPartitionId()
- + ", [event] " + scalingEvent.getId() + ", [group instance] " + scalingEvent.getInstanceId());
- }
-
- //find the child context of this group,
- //Notifying children, if this group has scaling dependencies
- if (scalingDependencies != null && !scalingDependencies.isEmpty()) {
- // has dependencies. Notify children
- if (aliasToActiveMonitorsMap != null && !aliasToActiveMonitorsMap.values().isEmpty()) {
-
- for (ScalingDependentList scalingDependentList : scalingDependencies) {
-
- for (String scalingDependentListComponent : scalingDependentList
- .getScalingDependentListComponents()) {
-
- if (scalingDependentListComponent.equals(scalingEvent.getId())) {
-
- for (String scalingDependentListComponentInSelectedList :
- scalingDependentList.getScalingDependentListComponents()) {
-
- Monitor monitor = aliasToActiveMonitorsMap.get(
- scalingDependentListComponentInSelectedList);
- if (monitor instanceof GroupMonitor ||
- monitor instanceof VMClusterMonitor) {
- monitor.onParentScalingEvent(scalingEvent);
- }
- }
- break;
- }
- }
- }
- }
- }
- if (scalingEvent.getId().equals(appId)) {
- mapScalingEvent.put(scalingEvent.getInstanceId(), scalingEvent);
- }
- }
+ @Override
+ public void onChildScalingEvent(ScalingEvent scalingEvent) {
+ if (hasScalingDependents) {
+ //notify parent
+ parent.onChildScalingEvent(scalingEvent);
+ }
+
+ if (log.isDebugEnabled()) {
+ log.debug("Child scaling event received to [group]: " + this.getId()
+ + ", [network partition]: " + scalingEvent.getNetworkPartitionId()
+ + ", [event] " + scalingEvent.getId() + ", [group instance] " + scalingEvent.getInstanceId());
+ }
+
+ //find the child context of this group,
+ //Notifying children, if this group has scaling dependencies
+ if (scalingDependencies != null && !scalingDependencies.isEmpty()) {
+ // has dependencies. Notify children
+ if (aliasToActiveMonitorsMap != null && !aliasToActiveMonitorsMap.values().isEmpty()) {
+
+ for (ScalingDependentList scalingDependentList : scalingDependencies) {
+
+ for (String scalingDependentListComponent : scalingDependentList
+ .getScalingDependentListComponents()) {
+
+ if (scalingDependentListComponent.equals(scalingEvent.getId())) {
+
+ for (String scalingDependentListComponentInSelectedList :
+ scalingDependentList.getScalingDependentListComponents()) {
+
+ Monitor monitor = aliasToActiveMonitorsMap.get(
+ scalingDependentListComponentInSelectedList);
+ if (monitor instanceof GroupMonitor ||
+ monitor instanceof VMClusterMonitor) {
+ monitor.onParentScalingEvent(scalingEvent);
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ String networkPartitionId = scalingEvent.getNetworkPartitionId();
+ String instanceId = scalingEvent.getInstanceId();
+ String id = scalingEvent.getId();
+ GroupLevelNetworkPartitionContext networkPartitionContext =
+ this.networkPartitionCtxts.get(networkPartitionId);
+ if (networkPartitionContext != null) {
+ GroupInstanceContext instanceContext = networkPartitionContext.getInstanceContext(instanceId);
+ if (instanceContext != null) {
+ if (instanceContext.containsScalingEvent(id)) {
+ instanceContext.removeScalingEvent(id);
+ instanceContext.addScalingEvent(scalingEvent);
+ } else {
+ instanceContext.addScalingEvent(scalingEvent);
+ }
+ }
+ }
+ }
@Override
public void onChildScalingOverMaxEvent(ScalingOverMaxEvent scalingOverMaxEvent) {
-
+ //Checking whether this monitor has room to create new instances else
+ // notify the parent with max out
+ //TODO by drool or periodic monitor or here
+
+ //adding the scaling over max event to group instance Context
+ String networkPartitionId = scalingOverMaxEvent.getNetworkPartitionId();
+ String instanceId = scalingOverMaxEvent.getInstanceId();
+ String id = scalingOverMaxEvent.getId();
+ GroupLevelNetworkPartitionContext networkPartitionContext =
+ this.networkPartitionCtxts.get(networkPartitionId);
+ if (networkPartitionContext != null) {
+ GroupInstanceContext instanceContext = networkPartitionContext.getInstanceContext(instanceId);
+ if (instanceContext != null) {
+ if (instanceContext.containsScalingEvent(id)) {
+ instanceContext.removeScalingOverMaxEvent(id);
+ instanceContext.addScalingOverMaxEvent(scalingOverMaxEvent);
+ } else {
+ instanceContext.addScalingOverMaxEvent(scalingOverMaxEvent);
+ }
+ }
+ }
}
@Override
@@ -755,9 +786,9 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
int minInstances = this.networkPartitionCtxts.get(networkPartitionId).
getMinInstanceCount();
//if terminated all the instances in this instances map should be in terminated state
- if(noOfInstancesOfRequiredStatus == this.inactiveInstancesMap.size() &&
+ if (noOfInstancesOfRequiredStatus == this.inactiveInstancesMap.size() &&
requiredStatus == GroupStatus.Terminated) {
- return true;
+ return true;
} else if (noOfInstancesOfRequiredStatus >= minInstances) {
return true;
} else {
@@ -774,7 +805,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
@Override
public void destroy() {
- //TODO to stop all the drools
+ stopScheduler();
}
}
[6/6] stratos git commit: merging to add List support for scaling
dependents
Posted by re...@apache.org.
merging to add List support for scaling dependents
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/66bc3acf
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/66bc3acf
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/66bc3acf
Branch: refs/heads/4.1.0-test
Commit: 66bc3acf3c3641a1c713c7d6001c657eac6cb79e
Parents: 8e8ca21
Author: reka <rt...@gmail.com>
Authored: Tue Dec 16 17:27:08 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Tue Dec 16 17:27:21 2014 +0530
----------------------------------------------------------------------
.../messaging/domain/applications/ScalingDependentList.java | 4 ++++
1 file changed, 4 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/66bc3acf/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ScalingDependentList.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ScalingDependentList.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ScalingDependentList.java
index 954cb0b..14f1d61 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ScalingDependentList.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/ScalingDependentList.java
@@ -34,6 +34,10 @@ public class ScalingDependentList implements Serializable {
return scalingDependentListComponents;
}
+ public boolean isScalingDependent(String id) {
+ return scalingDependentListComponents.contains(id);
+ }
+
public void setScalingDependentListComponents(List<String> scalingDependentListComponents) {
this.scalingDependentListComponents = scalingDependentListComponents;
}
[2/6] stratos git commit: Make the Group monitor as a schedular
executor service
Posted by re...@apache.org.
Make the Group monitor as a schedular executor service
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/ffc8e256
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/ffc8e256
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/ffc8e256
Branch: refs/heads/4.1.0-test
Commit: ffc8e25669c5f302c8e872f0ff331d56d7a2c2e6
Parents: cbc02ad
Author: gayan <ga...@puppet.gayan.org>
Authored: Tue Dec 16 13:08:43 2014 +0530
Committer: reka <rt...@gmail.com>
Committed: Tue Dec 16 17:27:20 2014 +0530
----------------------------------------------------------------------
.../autoscaler/monitor/MonitorFactory.java | 1 +
.../monitor/component/GroupMonitor.java | 74 +++++++++++++-------
2 files changed, 48 insertions(+), 27 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/ffc8e256/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
index 3291ea9..12e0794 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
@@ -125,6 +125,7 @@ public class MonitorFactory {
} else {
groupMonitor.setHasStartupDependents(false);
}
+ groupMonitor.startScheduler();
}
} finally {
ApplicationHolder.releaseReadLock();
http://git-wip-us.apache.org/repos/asf/stratos/blob/ffc8e256/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 f69a05a..43a385b 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
@@ -48,10 +48,10 @@ import org.apache.stratos.messaging.domain.instance.Instance;
import org.apache.stratos.messaging.domain.topology.ClusterStatus;
import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
/**
* This is GroupMonitor to monitor the group which consists of
@@ -66,11 +66,16 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
private boolean groupScalingEnabled;
//Network partition contexts
private Map<String, GroupLevelNetworkPartitionContext> networkPartitionCtxts;
+
+ private Map<String, ScalingEvent> mapScalingEvent;
+
//Indicates whether the monitor is destroyed or not
private boolean isDestroyed;
//Monitoring interval of the monitor
private int monitoringIntervalMilliseconds = 60000; //TODO get this from config file
+ private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
+
/**
* Constructor of GroupMonitor
*
@@ -85,38 +90,50 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
this.appId = appId;
networkPartitionCtxts = new HashMap<String, GroupLevelNetworkPartitionContext>();
this.hasScalingDependents = hasScalingDependents;
- }
+ }
@Override
public void run() {
- while (!isDestroyed) {
- try {
+ try {
- if (log.isDebugEnabled()) {
- log.debug("Group monitor is running : " + this.toString());
- }
- monitor();
- } catch (Exception e) {
- log.error("Group monitor failed : " + this.toString(), e);
- }
- try {
- Thread.sleep(monitoringIntervalMilliseconds);
- } catch (InterruptedException ignore) {
- }
- }
+ if (log.isDebugEnabled()) {
+ log.debug("Group monitor is running : " + this.toString());
+ }
+ monitor();
+ } catch (Exception e) {
+ log.error("Group monitor failed : " + this.toString(), e);
+ }
}
- public void monitor() {
+ public void startScheduler() {
+ scheduler.scheduleAtFixedRate(this, 0, monitoringIntervalMilliseconds, TimeUnit.MILLISECONDS);
+ }
- Runnable monitoringRunnable = new Runnable() {
- @Override
- public void run() {
- //TODO implement group monitor
- }
- };
- monitoringRunnable.run();
+ protected void stopScheduler() {
+ scheduler.shutdownNow();
}
+ public void monitor() {
+
+ Runnable monitoringRunnable = new Runnable() {
+ @Override
+ public void run() {
+ float finalFactor = 1;
+ if (log.isInfoEnabled()) {
+ log.info("Group monitor is running====== : " + this.toString());
+ }
+
+ Collection<ScalingEvent> events = mapScalingEvent.values();
+ for (ScalingEvent event : events) {
+ log.info("Monitor Scaling Event"+event.getId());
+ }
+ //TODO : call the on demand group scaling
+ mapScalingEvent.clear();
+ }
+ };
+ monitoringRunnable.run();
+ }
+
/**
* Will set the status of the monitor based on Topology Group status/child status like scaling
*
@@ -309,6 +326,9 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
}
}
}
+ if (scalingEvent.getId().equals(appId)) {
+ mapScalingEvent.put(scalingEvent.getInstanceId(), scalingEvent);
+ }
}
@Override