You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ud...@apache.org on 2014/12/18 07:38:05 UTC
[03/50] [abbrv] stratos git commit: adding status verification when
having more than one instances
adding status verification when having more than one instances
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/a6af4e3c
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/a6af4e3c
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/a6af4e3c
Branch: refs/heads/master
Commit: a6af4e3c0de8c639499eb56be03a7d69941ffed6
Parents: d1a0d39
Author: reka <rt...@gmail.com>
Authored: Tue Dec 16 10:24:34 2014 +0530
Committer: Udara Liyanage <ud...@wso2.com>
Committed: Thu Dec 18 12:06:56 2014 +0530
----------------------------------------------------------------------
.../monitor/component/GroupMonitor.java | 124 ++++++++++++-------
1 file changed, 76 insertions(+), 48 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/a6af4e3c/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 84aa859..0b2c21f 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
@@ -33,8 +33,8 @@ import org.apache.stratos.autoscaler.exception.application.TopologyInConsistentE
import org.apache.stratos.autoscaler.monitor.Monitor;
import org.apache.stratos.autoscaler.monitor.cluster.VMClusterMonitor;
import org.apache.stratos.autoscaler.monitor.events.GroupStatusEvent;
-import org.apache.stratos.autoscaler.monitor.events.ScalingEvent;
import org.apache.stratos.autoscaler.monitor.events.MonitorStatusEvent;
+import org.apache.stratos.autoscaler.monitor.events.ScalingEvent;
import org.apache.stratos.autoscaler.monitor.events.ScalingOverMaxEvent;
import org.apache.stratos.autoscaler.monitor.events.builder.MonitorStatusEventBuilder;
import org.apache.stratos.autoscaler.pojo.policy.PolicyManager;
@@ -60,19 +60,17 @@ import java.util.Map;
public class GroupMonitor extends ParentComponentMonitor implements Runnable {
private static final Log log = LogFactory.getLog(GroupMonitor.class);
-
+ //has scaling dependents
+ protected boolean hasScalingDependents;
//Indicates whether groupScaling enabled or not
private boolean groupScalingEnabled;
//Network partition contexts
private Map<String, GroupLevelNetworkPartitionContext> networkPartitionCtxts;
-
//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
- //has scaling dependents
- protected boolean hasScalingDependents;
/**
* Constructor of GroupMonitor
*
@@ -83,6 +81,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
public GroupMonitor(Group group, String appId, List<String> parentInstanceId, boolean hasScalingDependents) throws DependencyBuilderException,
TopologyInConsistentException {
super(group);
+ this.groupScalingEnabled = group.isGroupScalingEnabled();
this.appId = appId;
networkPartitionCtxts = new HashMap<String, GroupLevelNetworkPartitionContext>();
this.hasScalingDependents = hasScalingDependents;
@@ -126,7 +125,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
public void setStatus(GroupStatus status, String instanceId) {
GroupInstance groupInstance = (GroupInstance) this.instanceIdToInstanceMap.get(instanceId);
if (groupInstance == null) {
- if(status != GroupStatus.Terminated) {
+ if (status != GroupStatus.Terminated) {
log.warn("The required group [instance] " + instanceId + " not found in the GroupMonitor");
}
} else {
@@ -171,14 +170,22 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
@Override
public void onChildStatusEvent(MonitorStatusEvent statusEvent) {
+ String childId = statusEvent.getId();
+ 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
+ boolean isChildActive = verifyGroupStatus(instanceId, GroupStatus.Active);
+ if (isChildActive) {
+ onChildActivatedEvent(childId, instanceId);
+ } else {
+ log.info("Waiting for other group instances to be active");
+ }
- String childId = statusEvent.getId();
- String instanceId = statusEvent.getInstanceId();
- LifeCycleState status1 = statusEvent.getStatus();
- String id = this.id;
- //Events coming from parent are In_Active(in faulty detection), Scaling events, termination
-
- if (status1 == ClusterStatus.Active || status1 == GroupStatus.Active) {
+ } else if (status1 == ClusterStatus.Active) {
onChildActivatedEvent(childId, instanceId);
} else if (status1 == ClusterStatus.Inactive || status1 == GroupStatus.Inactive) {
@@ -186,8 +193,8 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
/*if (!aliasToActiveMonitorsMap.get(childId).hasStartupDependents()) {
onChildActivatedEvent(childId, instanceId);
} else {*/
- markInstanceAsInactive(childId, instanceId);
- onChildInactiveEvent(childId, instanceId);
+ markInstanceAsInactive(childId, instanceId);
+ onChildInactiveEvent(childId, instanceId);
//}
} else if (status1 == ClusterStatus.Terminating || status1 == GroupStatus.Terminating) {
@@ -195,26 +202,40 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
markInstanceAsTerminating(childId, instanceId);
} else if (status1 == ClusterStatus.Terminated || status1 == GroupStatus.Terminated) {
- //Check whether all dependent goes Terminated and then start them in parallel.
- removeInstanceFromFromInactiveMap(childId, instanceId);
- removeInstanceFromFromTerminatingMap(childId, instanceId);
-
- GroupInstance instance = (GroupInstance) instanceIdToInstanceMap.get(instanceId);
- if (instance != null) {
- if (instance.getStatus() == GroupStatus.Terminating || instance.getStatus() == GroupStatus.Terminated) {
- ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(id,
- appId, instanceId);
+ //Verifying whether all the minimum no of instances of child
+ // became active to take next action
+ if (status1 == GroupStatus.Terminated) {
+ boolean childTerminated = verifyGroupStatus(instanceId, (GroupStatus) status1);
+ if (childTerminated) {
+ onTerminationOfInstance(childId, instanceId);
} else {
- onChildTerminatedEvent(childId, instanceId);
+ log.info("Waiting for other group instances to be terminated");
}
} else {
- log.warn("The required instance cannot be found in the the [GroupMonitor] " +
- id);
+ onTerminationOfInstance(childId, instanceId);
}
}
}
-
+ private void onTerminationOfInstance(String childId, String instanceId) {
+ //Check whether all dependent goes Terminated and then start them in parallel.
+ removeInstanceFromFromInactiveMap(childId, instanceId);
+ removeInstanceFromFromTerminatingMap(childId, instanceId);
+
+ GroupInstance instance = (GroupInstance) instanceIdToInstanceMap.get(instanceId);
+ if (instance != null) {
+ if (instance.getStatus() == GroupStatus.Terminating ||
+ instance.getStatus() == GroupStatus.Terminated) {
+ ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(id,
+ appId, instanceId);
+ } else {
+ onChildTerminatedEvent(childId, instanceId);
+ }
+ } else {
+ log.warn("The required instance cannot be found in the the [GroupMonitor] " +
+ id);
+ }
+ }
@Override
@@ -249,9 +270,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
@Override
public void onChildScalingEvent(ScalingEvent scalingEvent) {
-
if (hasScalingDependents) {
-
//notify parent
parent.onChildScalingEvent(scalingEvent);
}
@@ -264,20 +283,24 @@ 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()) {
- // has dependencies. Notify children
- if (aliasToActiveMonitorsMap != null && !aliasToActiveMonitorsMap.values().isEmpty()) {
+ if (scalingDependencies != null && !scalingDependencies.isEmpty()) {
+ // has dependencies. Notify children
+ if (aliasToActiveMonitorsMap != null && !aliasToActiveMonitorsMap.values().isEmpty()) {
- for (ScalingDependentList scalingDependentList : scalingDependencies) {
+ for (ScalingDependentList scalingDependentList : scalingDependencies) {
- for(String scalingDependentListComponent : scalingDependentList.getScalingDependentListComponents()){
+ for (String scalingDependentListComponent : scalingDependentList.
+ getScalingDependentListComponents()) {
- if(scalingDependentListComponent.equals(scalingEvent.getId())){
+ if (scalingDependentListComponent.equals(scalingEvent.getId())) {
- for(String scalingDependentListComponentInSelectedList : scalingDependentList.getScalingDependentListComponents()){
+ for (String scalingDependentListComponentInSelectedList :
+ scalingDependentList.getScalingDependentListComponents()) {
- Monitor monitor = aliasToActiveMonitorsMap.get(scalingDependentListComponentInSelectedList);
- if(monitor instanceof GroupMonitor || monitor instanceof VMClusterMonitor){
+ Monitor monitor = aliasToActiveMonitorsMap.
+ get(scalingDependentListComponentInSelectedList);
+ if (monitor instanceof GroupMonitor ||
+ monitor instanceof VMClusterMonitor) {
monitor.onParentScalingEvent(scalingEvent);
}
}
@@ -285,7 +308,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
}
}
}
- }
+ }
}
}
@@ -415,7 +438,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
childPartitionContexts = new ArrayList<GroupLevelPartitionContext>();
for (ChildLevelPartition childLevelPartition : childLevelPartitions) {
- if(networkPartitionContext.
+ if (networkPartitionContext.
getPartitionCtxt(childLevelPartition.getPartitionId()) == null) {
partitionContext = new GroupLevelPartitionContext(childLevelPartition.getMax(),
childLevelPartition.getPartitionId(), networkPartitionId);
@@ -527,7 +550,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
for (int i = 0; i < groupMin - existingGroupInstances.size(); i++) {
// Get partitionContext to create instance in
partitionContext = getPartitionContext(groupLevelNetworkPartitionContext,
- parentPartitionId);
+ parentPartitionId);
groupInstanceId = createGroupInstanceAndAddToMonitor(group, parentInstanceContext,
partitionContext,
groupLevelNetworkPartitionContext,
@@ -545,8 +568,8 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
}
private PartitionContext getPartitionContext(
- GroupLevelNetworkPartitionContext groupLevelNetworkPartitionContext,
- String parentPartitionId) {
+ GroupLevelNetworkPartitionContext groupLevelNetworkPartitionContext,
+ String parentPartitionId) {
PartitionContext partitionContext;
// Get partitionContext to create instance in
List<GroupLevelPartitionContext> partitionContexts = groupLevelNetworkPartitionContext.
@@ -596,9 +619,9 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
int groupMax = group.getGroupMaxInstances();
int groupMin = group.getGroupMinInstances();
List<Instance> instances = group.getInstanceContextsWithParentId(parentInstanceId);
- if(instances.isEmpty()) {
+ if (instances.isEmpty()) {
//Need to create totally new group instance
- for (int i = 0; i < groupMin ; i++) {
+ for (int i = 0; i < groupMin; i++) {
// Get partitionContext to create instance in
partitionContext = getPartitionContext(groupLevelNetworkPartitionContext,
parentPartitionId);
@@ -630,7 +653,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
}
}
//TODO Starting all the instances, can do in parallel
- for(String instanceId : instanceIdsToStart) {
+ for (String instanceId : instanceIdsToStart) {
try {
startDependency(group, instanceId);
} catch (MonitorNotFoundException e) {
@@ -699,9 +722,14 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
if (!instances.isEmpty()) {
int minInstances = this.networkPartitionCtxts.get(networkPartitionId).
getMinInstanceCount();
- if (noOfInstancesOfRequiredStatus >= minInstances) {
+ //if terminated all the instances in this instances map should be in terminated state
+ if(noOfInstancesOfRequiredStatus == this.inactiveInstancesMap.size() &&
+ requiredStatus == GroupStatus.Terminated) {
+ return true;
+ } else if (noOfInstancesOfRequiredStatus >= minInstances) {
return true;
} else {
+ //of only one is inActive implies that the whole group is Inactive
if (requiredStatus == GroupStatus.Inactive && noOfInstancesOfRequiredStatus >= 1) {
return true;
}