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 2015/04/28 21:05:10 UTC
[4/5] stratos git commit: fixing scale down issue with Groups and
refactoring
fixing scale down issue with Groups and refactoring
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/5e79bbfa
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/5e79bbfa
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/5e79bbfa
Branch: refs/heads/master
Commit: 5e79bbfa4a7b7f9f01d237bd59cfba403631ad5e
Parents: 6087244
Author: reka <rt...@gmail.com>
Authored: Tue Apr 28 23:54:08 2015 +0530
Committer: reka <rt...@gmail.com>
Committed: Wed Apr 29 00:05:46 2015 +0530
----------------------------------------------------------------------
.../autoscaler/monitor/EventHandler.java | 3 +-
.../stratos/autoscaler/monitor/Monitor.java | 12 ++--
.../monitor/component/ApplicationMonitor.java | 21 ++++--
.../monitor/component/GroupMonitor.java | 68 +++-----------------
.../component/ParentComponentMonitor.java | 56 +++++++++++++++-
5 files changed, 87 insertions(+), 73 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/5e79bbfa/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 d5be50d..e7edd1e 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
@@ -38,6 +38,7 @@ public interface EventHandler {
* Triggered when a status event is received from the parent.
*
* @param statusEvent
+ * @throws MonitorNotFoundException
*/
public abstract void onParentStatusEvent(MonitorStatusEvent statusEvent) throws
MonitorNotFoundException;
@@ -45,7 +46,7 @@ public interface EventHandler {
/**
* Triggered when a scaling event is received from a child.
*
- * @param scalingEvent
+ * @param scalingEvent the event which passed when scaling
*/
public abstract void onChildScalingEvent(ScalingEvent scalingEvent);
http://git-wip-us.apache.org/repos/asf/stratos/blob/5e79bbfa/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 0a9d7f1..b5f5997 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
@@ -51,7 +51,7 @@ public abstract class Monitor implements EventHandler {
}
/**
- * This will destroy the monitor thread
+ * Implement this method to destroy the monitor thread
*/
public abstract void destroy();
@@ -141,7 +141,7 @@ public abstract class Monitor implements EventHandler {
* @param hasDependent whether monitor has dependent or not
*/
public void setHasStartupDependents(boolean hasDependent) {
- this.hasStartupDependents = hasDependent;
+ hasStartupDependents = hasDependent;
}
/**
@@ -150,7 +150,7 @@ public abstract class Monitor implements EventHandler {
* @param instance instance to be added
*/
public void addInstance(Instance instance) {
- this.instanceIdToInstanceMap.put(instance.getInstanceId(), instance);
+ instanceIdToInstanceMap.put(instance.getInstanceId(), instance);
}
@@ -161,7 +161,7 @@ public abstract class Monitor implements EventHandler {
* @return the instance
*/
public Instance getInstance(String instanceId) {
- return this.instanceIdToInstanceMap.get(instanceId);
+ return instanceIdToInstanceMap.get(instanceId);
}
/**
@@ -170,7 +170,7 @@ public abstract class Monitor implements EventHandler {
* @param instanceId instance id
*/
public void removeInstance(String instanceId) {
- this.instanceIdToInstanceMap.remove(instanceId);
+ instanceIdToInstanceMap.remove(instanceId);
}
/**
@@ -181,7 +181,7 @@ public abstract class Monitor implements EventHandler {
*/
public List<String> getInstancesByParentInstanceId(String parentInstanceId) {
List<String> instances = new ArrayList<String>();
- for (Instance instance : this.instanceIdToInstanceMap.values()) {
+ for (Instance instance : instanceIdToInstanceMap.values()) {
if (instance.getParentId().equals(parentInstanceId)) {
instances.add(instance.getInstanceId());
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/5e79bbfa/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 c097b2b..072ffbb 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
@@ -70,7 +70,7 @@ public class ApplicationMonitor extends ParentComponentMonitor {
//Flag to set whether application is terminating
private boolean isTerminating;
- // Flag to set if forcefull undeployment is invoked for the application.
+ // Flag to set if forceful undeployment is invoked for the application.
private boolean force;
public ApplicationMonitor(Application application) throws DependencyBuilderException,
@@ -221,10 +221,10 @@ public class ApplicationMonitor extends ParentComponentMonitor {
for (Monitor monitor : monitors.values()) {
if (monitor instanceof ParentComponentMonitor) {
- Monitor monitor1 = findGroupMonitor(id, ((ParentComponentMonitor) monitor).
+ Monitor groupMonitor = findGroupMonitor(id, ((ParentComponentMonitor) monitor).
getAliasToActiveMonitorsMap());
- if (monitor1 != null) {
- return monitor1;
+ if (groupMonitor != null) {
+ return groupMonitor;
}
}
}
@@ -287,7 +287,17 @@ public class ApplicationMonitor extends ParentComponentMonitor {
ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(this.id,
appId, instanceId);
} else {
- onChildTerminatedEvent(childId, instanceId);
+ Monitor monitor = this.getMonitor(childId);
+ boolean active = false;
+ if (monitor instanceof GroupMonitor) {
+ active = verifyGroupStatus(childId, instanceId, GroupStatus.Active);
+ }
+ if (!active) {
+ onChildTerminatedEvent(childId, instanceId);
+ } else {
+ log.info("[Group Instance] " + instanceId + " is still active " +
+ "upon termination of the [child ] " + childId);
+ }
}
} else {
log.warn("The required instance cannot be found in the the [GroupMonitor] " +
@@ -548,6 +558,7 @@ public class ApplicationMonitor extends ParentComponentMonitor {
/**
* Whether application is in-terminating or not
+ *
* @return application state
*/
public boolean isTerminating() {
http://git-wip-us.apache.org/repos/asf/stratos/blob/5e79bbfa/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 426c169..980503f 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,6 @@ import org.apache.stratos.messaging.domain.application.Application;
import org.apache.stratos.messaging.domain.application.ApplicationStatus;
import org.apache.stratos.messaging.domain.application.Group;
import org.apache.stratos.messaging.domain.application.GroupStatus;
-import org.apache.stratos.messaging.domain.instance.ApplicationInstance;
import org.apache.stratos.messaging.domain.instance.GroupInstance;
import org.apache.stratos.messaging.domain.instance.Instance;
import org.apache.stratos.messaging.domain.topology.ClusterStatus;
@@ -159,7 +158,7 @@ public class GroupMonitor extends ParentComponentMonitor {
int activeAppInstances = appMonitor.
getNetworkPartitionContext(networkPartitionContext.getId()).
getActiveInstancesCount();
- if(activeAppInstances > 0) {
+ if (activeAppInstances > 0) {
//Creating new group instance based on the existing parent instances
createInstanceOnDemand(parentInstanceContext.getId());
}
@@ -413,16 +412,7 @@ public class GroupMonitor extends ParentComponentMonitor {
} else if (status1 == ClusterStatus.Terminated || status1 == GroupStatus.Terminated) {
//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 {
- log.info("Waiting for other group instances to be terminated");
- }*/
- } else {
- onTerminationOfInstance(childId, instanceId);
- }
+ onTerminationOfInstance(childId, instanceId);
}
}
@@ -438,7 +428,13 @@ public class GroupMonitor extends ParentComponentMonitor {
ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(id,
appId, instanceId);
} else {
- onChildTerminatedEvent(childId, instanceId);
+ boolean active = verifyGroupStatus(childId, instanceId, GroupStatus.Active);
+ if (!active) {
+ onTerminationOfInstance(childId, instanceId);
+ } else {
+ log.info("[Group Instance] " + instanceId + " is still active upon termination" +
+ " of the [child] " + childId);
+ }
}
} else {
log.warn("The required instance cannot be found in the the [GroupMonitor] " +
@@ -916,52 +912,6 @@ public class GroupMonitor extends ParentComponentMonitor {
}
- public boolean verifyGroupStatus(String childId, String instanceId, GroupStatus requiredStatus) {
- Monitor monitor = this.getMonitor(childId);
- List<String> groupInstances;
- GroupInstance groupInstance = (GroupInstance) monitor.getInstance(instanceId);
- if (groupInstance == null) {
- groupInstances = monitor.getInstancesByParentInstanceId(instanceId);
- } else {
- if (groupInstance.getStatus() == requiredStatus) {
- return true;
- } else {
- return false;
- }
- }
-
- String networkPartitionId = null;
- int noOfInstancesOfRequiredStatus = 0;
- for (String childInstanceId : groupInstances) {
- GroupInstance childGroupInstance = (GroupInstance) monitor.getInstance(childInstanceId);
- networkPartitionId = childGroupInstance.getNetworkPartitionId();
- if (childGroupInstance.getStatus() == requiredStatus) {
- noOfInstancesOfRequiredStatus++;
- }
- }
-
- if (!groupInstances.isEmpty()) {
- GroupLevelNetworkPartitionContext networkPartitionContext =
- (GroupLevelNetworkPartitionContext) this.getNetworkPartitionCtxts().
- get(networkPartitionId);
- int minInstances = networkPartitionContext.getMinInstanceCount();
- //if terminated all the instances in this instances map should be in terminated state
- //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;
- }
- }
-
- }
- return false;
- }
@Override
http://git-wip-us.apache.org/repos/asf/stratos/blob/5e79bbfa/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 6b69065..8c25447 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
@@ -29,6 +29,7 @@ import org.apache.stratos.autoscaler.applications.dependency.DependencyTree;
import org.apache.stratos.autoscaler.applications.dependency.context.ApplicationChildContext;
import org.apache.stratos.autoscaler.applications.topic.ApplicationBuilder;
import org.apache.stratos.autoscaler.context.InstanceContext;
+import org.apache.stratos.autoscaler.context.partition.network.GroupLevelNetworkPartitionContext;
import org.apache.stratos.autoscaler.context.partition.network.NetworkPartitionContext;
import org.apache.stratos.autoscaler.event.publisher.ClusterStatusEventPublisher;
import org.apache.stratos.autoscaler.exception.application.DependencyBuilderException;
@@ -51,6 +52,7 @@ import org.apache.stratos.messaging.domain.application.GroupStatus;
import org.apache.stratos.messaging.domain.application.ParentComponent;
import org.apache.stratos.messaging.domain.application.ScalingDependentList;
import org.apache.stratos.messaging.domain.instance.ClusterInstance;
+import org.apache.stratos.messaging.domain.instance.GroupInstance;
import org.apache.stratos.messaging.domain.topology.ClusterStatus;
import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
@@ -517,10 +519,9 @@ public abstract class ParentComponentMonitor extends Monitor implements Runnable
Monitor monitor = this.aliasToActiveMonitorsMap.get(context1.getId());
if (monitor instanceof GroupMonitor) {
- GroupMonitor monitor1 = (GroupMonitor) monitor;
try {
ApplicationHolder.acquireReadLock();
- if (monitor1.verifyGroupStatus(context1.getId(), instanceId, GroupStatus.Active)) {
+ if (verifyGroupStatus(context1.getId(), instanceId, GroupStatus.Active)) {
parentsActive = true;
}
@@ -547,6 +548,57 @@ public abstract class ParentComponentMonitor extends Monitor implements Runnable
return parentsActive;
}
+ public boolean verifyGroupStatus(String childId, String instanceId, GroupStatus requiredStatus) {
+ Monitor monitor = this.getMonitor(childId);
+ if(!(monitor instanceof GroupMonitor)) {
+ return false;
+ }
+ List<String> groupInstances;
+ GroupInstance groupInstance = (GroupInstance) monitor.getInstance(instanceId);
+ if (groupInstance == null) {
+ groupInstances = monitor.getInstancesByParentInstanceId(instanceId);
+ } else {
+ if (groupInstance.getStatus() == requiredStatus) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ String networkPartitionId = null;
+ int noOfInstancesOfRequiredStatus = 0;
+ for (String childInstanceId : groupInstances) {
+ GroupInstance childGroupInstance = (GroupInstance) monitor.getInstance(childInstanceId);
+ networkPartitionId = childGroupInstance.getNetworkPartitionId();
+ if (childGroupInstance.getStatus() == requiredStatus) {
+ noOfInstancesOfRequiredStatus++;
+ }
+ }
+
+ if (!groupInstances.isEmpty()) {
+ GroupLevelNetworkPartitionContext networkPartitionContext =
+ (GroupLevelNetworkPartitionContext) ((GroupMonitor)monitor).
+ getNetworkPartitionCtxts().get(networkPartitionId);
+ int minInstances = networkPartitionContext.getMinInstanceCount();
+ //if terminated all the instances in this instances map should be in terminated state
+ //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;
+ }
+ }
+
+ }
+ return false;
+ }
+
+
protected void handleDependentScaling(InstanceContext instanceContext,
NetworkPartitionContext networkPartitionContext) {
/**