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:11 UTC
[5/5] stratos git commit: fixing group scaling issue and adding
comments
fixing group scaling issue and adding comments
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/29ac5f0a
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/29ac5f0a
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/29ac5f0a
Branch: refs/heads/master
Commit: 29ac5f0ae5a76cd2b8b708018d4911acb93ccf46
Parents: 885c752
Author: reka <rt...@gmail.com>
Authored: Tue Apr 28 16:07:10 2015 +0530
Committer: reka <rt...@gmail.com>
Committed: Wed Apr 29 00:05:46 2015 +0530
----------------------------------------------------------------------
.../dependency/DependencyBuilder.java | 1 +
.../applications/dependency/DependencyTree.java | 7 +-
.../context/ApplicationChildContext.java | 9 ++
.../stratos/autoscaler/monitor/Monitor.java | 40 ++++---
.../monitor/component/ApplicationMonitor.java | 112 +++++++++++++++----
.../monitor/component/GroupMonitor.java | 14 ++-
6 files changed, 140 insertions(+), 43 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/29ac5f0a/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 fe14f7f..8df87c3 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
@@ -111,6 +111,7 @@ public class DependencyBuilder {
applicationChildContext.getId(), parentContext.getId(), dependencyTree));
}
parentContext = applicationChildContext;
+ applicationChildContext.setParent(parentContext);
} else {
// This is the first element, add it as the root
dependencyTree.addPrimaryApplicationContext(applicationChildContext);
http://git-wip-us.apache.org/repos/asf/stratos/blob/29ac5f0a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyTree.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyTree.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyTree.java
index 8d97542..f489158 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyTree.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyTree.java
@@ -114,13 +114,16 @@ public class DependencyTree {
List<ApplicationChildContext> contexts) {
for (ApplicationChildContext context : contexts) {
//TODO check for the status
- if (context.getId().equals(id)) {
+ if (context.getParent() != null && context.getParent().equals(id)) {
return context;
}
}
//if not found in the top level search recursively
for (ApplicationChildContext context : this.primaryApplicationContextList) {
- return findParentContextWithId(context, id, context.getApplicationChildContextList());
+ if(context.getApplicationChildContextList() != null &&
+ !context.getApplicationChildContextList().isEmpty()) {
+ return findParentContextWithId(context, id, context.getApplicationChildContextList());
+ }
}
return null;
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/29ac5f0a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ApplicationChildContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ApplicationChildContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ApplicationChildContext.java
index b5a4a39..1e4f3fd 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ApplicationChildContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/context/ApplicationChildContext.java
@@ -35,6 +35,7 @@ public abstract class ApplicationChildContext {
private ClusterStatus status;
private Stack<ClusterStatus> statusLifeCycle;
private List<ApplicationChildContext> applicationChildContextList;
+ private ApplicationChildContext parent;
protected boolean hasStartupDependents;
protected boolean isGroupScalingEnabled;
@@ -117,4 +118,12 @@ public abstract class ApplicationChildContext {
public void setGroupScalingEnabled(boolean isDependent) {
this.isGroupScalingEnabled = isDependent;
}
+
+ public ApplicationChildContext getParent() {
+ return parent;
+ }
+
+ public void setParent(ApplicationChildContext parent) {
+ this.parent = parent;
+ }
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/29ac5f0a/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 d13ae4c..0a9d7f1 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
@@ -27,11 +27,13 @@ import java.util.List;
import java.util.Map;
/**
- * Abstract class for the monitoring functionality in autoscaler.
+ * Abstract class for the monitoring functionality in Autoscaler.
*/
public abstract class Monitor implements EventHandler {
-
- public enum MonitorType {Application, Group, Cluster}
+ //Monitor types
+ public enum MonitorType {
+ Application, Group, Cluster
+ }
//Id of the monitor, cluster=clusterId, group=group-alias, application=app-alias
protected String id;
@@ -44,13 +46,23 @@ public abstract class Monitor implements EventHandler {
//monitors map, key=InstanceId and value=ClusterInstance/GroupInstance/ApplicationInstance
protected Map<String, Instance> instanceIdToInstanceMap;
+ public Monitor() {
+ this.instanceIdToInstanceMap = new HashMap<String, Instance>();
+ }
+
+ /**
+ * This will destroy the monitor thread
+ */
public abstract void destroy();
+ /**
+ * This will create Instance on demand as requested by monitors
+ *
+ * @param instanceId instance Id of the instance to be created
+ * @return whether it is created or not
+ */
public abstract boolean createInstanceOnDemand(String instanceId);
- public Monitor() {
- this.instanceIdToInstanceMap = new HashMap<String, Instance>();
- }
/**
* Return the id of the monitor
@@ -64,14 +76,14 @@ public abstract class Monitor implements EventHandler {
/**
* Return the type of the monitor.
*
- * @return
+ * @return monitor type
*/
public abstract MonitorType getMonitorType();
/**
* Set the id of the monitor
*
- * @param id
+ * @param id id of the monitor
*/
public void setId(String id) {
this.id = id;
@@ -89,7 +101,7 @@ public abstract class Monitor implements EventHandler {
/**
* To set the app id of the monitor
*
- * @param appId
+ * @param appId application id
*/
public void setAppId(String appId) {
this.appId = appId;
@@ -107,7 +119,7 @@ public abstract class Monitor implements EventHandler {
/**
* To set the parent of the monitor
*
- * @param parent
+ * @param parent parent of the monitor
*/
public void setParent(ParentComponentMonitor parent) {
this.parent = parent;
@@ -126,7 +138,7 @@ public abstract class Monitor implements EventHandler {
/**
* To set whether monitor has any startup dependencies
*
- * @param hasDependent
+ * @param hasDependent whether monitor has dependent or not
*/
public void setHasStartupDependents(boolean hasDependent) {
this.hasStartupDependents = hasDependent;
@@ -183,10 +195,6 @@ public abstract class Monitor implements EventHandler {
* @return true/false
*/
public boolean hasInstance() {
- if (this.instanceIdToInstanceMap.isEmpty()) {
- return false;
- } else {
- return true;
- }
+ return !instanceIdToInstanceMap.isEmpty();
}
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/29ac5f0a/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 68b4d28..84f82e3 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
@@ -241,7 +241,8 @@ public class ApplicationMonitor extends ParentComponentMonitor {
get(instanceId);
if (applicationInstance == null) {
- log.warn("The required application [instance] " + instanceId + " not found in the AppMonitor");
+ log.warn("The required application [instance] " + instanceId + " not found " +
+ "in the AppMonitor");
} else {
if (applicationInstance.getStatus() != status) {
applicationInstance.setStatus(status);
@@ -250,7 +251,8 @@ public class ApplicationMonitor extends ParentComponentMonitor {
//notify the children about the state change
try {
- MonitorStatusEventBuilder.notifyChildren(this, new ApplicationStatusEvent(status, appId, instanceId));
+ MonitorStatusEventBuilder.notifyChildren(this, new ApplicationStatusEvent(status,
+ appId, instanceId));
} catch (MonitorNotFoundException e) {
log.error("Error while notifying the children from [application] " + appId, e);
//TODO revert siblings
@@ -305,48 +307,72 @@ public class ApplicationMonitor extends ParentComponentMonitor {
}
+ /**
+ * This will start the minimum dependencies
+ *
+ * @param application the application which used to create monitors
+ * @return whether monitor created or not
+ * @throws TopologyInConsistentException
+ * @throws PolicyValidationException
+ */
public boolean startMinimumDependencies(Application application)
throws TopologyInConsistentException, PolicyValidationException {
return createInstanceAndStartDependency(application);
}
+ /**
+ * Utility to create application instance by parsing the deployment policy for a monitor
+ *
+ * @param application the application
+ * @return whether the instance created or not
+ * @throws TopologyInConsistentException
+ * @throws PolicyValidationException
+ */
private boolean createInstanceAndStartDependency(Application application)
throws TopologyInConsistentException, PolicyValidationException {
boolean initialStartup = true;
List<String> instanceIds = new ArrayList<String>();
String instanceId;
- ApplicationPolicy applicationPolicy = PolicyManager.getInstance().getApplicationPolicy(application.getApplicationPolicyId());
+ ApplicationPolicy applicationPolicy = PolicyManager.getInstance().
+ getApplicationPolicy(application.getApplicationPolicyId());
if (applicationPolicy == null) {
- String msg = String.format("Application policy not found in registry or in-memory [application-id] %s", appId);
+ String msg = String.format("Application policy not found in registry or " +
+ "in-memory [application-id] %s", appId);
log.error(msg);
throw new RuntimeException(msg);
}
- NetworkPartitionAlgorithmContext algorithmContext = AutoscalerContext.getInstance().getNetworkPartitionAlgorithmContext(appId);
+ NetworkPartitionAlgorithmContext algorithmContext = AutoscalerContext.getInstance().
+ getNetworkPartitionAlgorithmContext(appId);
if (algorithmContext == null) {
- String msg = String.format("Network partition algorithm context not found in registry or in-memory [application-id] %s", appId);
+ String msg = String.format("Network partition algorithm context not found " +
+ "in registry or in-memory [application-id] %s", appId);
log.error(msg);
throw new RuntimeException(msg);
}
String networkPartitionAlgorithmName = applicationPolicy.getAlgorithm();
if (log.isDebugEnabled()) {
- String msg = String.format("Network partition algorithm is %s [application-id] %s", networkPartitionAlgorithmName, appId);
+ String msg = String.format("Network partition algorithm is %s [application-id] %s",
+ networkPartitionAlgorithmName, appId);
log.debug(msg);
}
- NetworkPartitionAlgorithm algorithm = getNetworkPartitionAlgorithm(networkPartitionAlgorithmName);
+ NetworkPartitionAlgorithm algorithm = getNetworkPartitionAlgorithm(
+ networkPartitionAlgorithmName);
if (algorithm == null) {
- String msg = String.format("Coudln't create network partition algorithm [application-id] %s", appId);
+ String msg = String.format("Coudln't create network partition algorithm " +
+ "[application-id] %s", appId);
log.error(msg);
throw new RuntimeException(msg);
}
List<String> nextNetworkPartitions = algorithm.getNextNetworkPartitions(algorithmContext);
if (nextNetworkPartitions == null || nextNetworkPartitions.isEmpty()) {
- String msg = String.format("No network partitions available for application bursting [application-id] %s", appId);
+ String msg = String.format("No network partitions available for application bursting " +
+ "[application-id] %s", appId);
log.warn(msg);
return false;
}
@@ -376,6 +402,15 @@ public class ApplicationMonitor extends ParentComponentMonitor {
return initialStartup;
}
+ /**
+ * Utility method to create application instance inside a network partition and
+ * add data structure to monitor
+ *
+ * @param application the application where the application instance needs to be created
+ * @param context networkPartition where instance needs to be created
+ * @param instanceExist whether application instance exists or not
+ * @return instance Id
+ */
private String handleApplicationInstanceCreation(Application application,
ApplicationLevelNetworkPartitionContext context,
ApplicationInstance instanceExist) {
@@ -405,6 +440,13 @@ public class ApplicationMonitor extends ParentComponentMonitor {
return instanceId;
}
+ /**
+ * Handling the application bursting into available network partition
+ *
+ * @throws TopologyInConsistentException
+ * @throws PolicyValidationException
+ * @throws MonitorNotFoundException
+ */
public void handleApplicationBursting() throws TopologyInConsistentException,
PolicyValidationException,
MonitorNotFoundException {
@@ -418,36 +460,44 @@ public class ApplicationMonitor extends ParentComponentMonitor {
boolean burstNPFound = false;
String instanceId = null;
- ApplicationPolicy applicationPolicy = PolicyManager.getInstance().getApplicationPolicy(application.getApplicationPolicyId());
+ ApplicationPolicy applicationPolicy = PolicyManager.getInstance().
+ getApplicationPolicy(application.getApplicationPolicyId());
if (applicationPolicy == null) {
- String msg = String.format("Application policy not found in registry or in-memory [application-id] %s", appId);
+ String msg = String.format("Application policy not found in registry or in-memory " +
+ "[application-id] %s", appId);
log.error(msg);
throw new RuntimeException(msg);
}
- NetworkPartitionAlgorithmContext algorithmContext = AutoscalerContext.getInstance().getNetworkPartitionAlgorithmContext(appId);
+ NetworkPartitionAlgorithmContext algorithmContext = AutoscalerContext.getInstance().
+ getNetworkPartitionAlgorithmContext(appId);
if (algorithmContext == null) {
- String msg = String.format("Network partition algorithm context not found in registry or in-memory [application-id] %s", appId);
+ String msg = String.format("Network partition algorithm context not found in" +
+ " registry or in-memory [application-id] %s", appId);
log.error(msg);
throw new RuntimeException(msg);
}
String networkPartitionAlgorithmName = applicationPolicy.getAlgorithm();
if (log.isDebugEnabled()) {
- String msg = String.format("Network partition algorithm is %s [application-id] %s", networkPartitionAlgorithmName, appId);
+ String msg = String.format("Network partition algorithm is %s [application-id] %s",
+ networkPartitionAlgorithmName, appId);
log.debug(msg);
}
- NetworkPartitionAlgorithm algorithm = getNetworkPartitionAlgorithm(networkPartitionAlgorithmName);
+ NetworkPartitionAlgorithm algorithm = getNetworkPartitionAlgorithm(
+ networkPartitionAlgorithmName);
if (algorithm == null) {
- String msg = String.format("Coudln't create network partition algorithm [application-id] %s", appId);
+ String msg = String.format("Coudln't create network partition algorithm " +
+ "[application-id] %s", appId);
log.error(msg);
throw new RuntimeException(msg);
}
List<String> nextNetworkPartitions = algorithm.getNextNetworkPartitions(algorithmContext);
if (nextNetworkPartitions == null || nextNetworkPartitions.isEmpty()) {
- String msg = String.format("No network partitions available for application bursting [application-id] %s", appId);
+ String msg = String.format("No network partitions available for application " +
+ "bursting [application-id] %s", appId);
log.warn(msg);
return;
}
@@ -455,7 +505,8 @@ public class ApplicationMonitor extends ParentComponentMonitor {
for (String networkPartitionId : nextNetworkPartitions) {
if (!this.getNetworkPartitionCtxts().containsKey(networkPartitionId)) {
- ApplicationLevelNetworkPartitionContext context = new ApplicationLevelNetworkPartitionContext(networkPartitionId);
+ ApplicationLevelNetworkPartitionContext context = new
+ ApplicationLevelNetworkPartitionContext(networkPartitionId);
//Setting flags saying that it has been created by burst
context.setCreatedOnBurst(true);
@@ -481,13 +532,25 @@ public class ApplicationMonitor extends ParentComponentMonitor {
}
}
- private ApplicationInstance createApplicationInstance(Application application, String networkPartitionId) {
+ /**
+ * Creating application instance into applications Topology
+ *
+ * @param application application where instance needs to be added
+ * @param networkPartitionId network partition of the application Instance
+ * @return the create application instance in the topology
+ */
+ private ApplicationInstance createApplicationInstance(Application application,
+ String networkPartitionId) {
//String instanceId = this.generateInstanceId(application);
ApplicationInstance instance = ApplicationBuilder.handleApplicationInstanceCreatedEvent(
appId, networkPartitionId);
return instance;
}
+ /**
+ * Whether application is in-terminating or not
+ * @return application state
+ */
public boolean isTerminating() {
return isTerminating;
}
@@ -515,14 +578,16 @@ public class ApplicationMonitor extends ParentComponentMonitor {
if (algorithmName.equals(StratosConstants.NETWORK_PARTITION_ONE_AFTER_ANOTHER_ALGORITHM_ID)) {
if (log.isDebugEnabled()) {
- String msg = String.format("Network partition algorithm is set to %s in applicatioin policy",
+ String msg = String.format("Network partition algorithm is set to %s in " +
+ "applicatioin policy",
StratosConstants.NETWORK_PARTITION_ONE_AFTER_ANOTHER_ALGORITHM_ID);
log.debug(msg);
}
return new OneAfterAnotherAlgorithm();
} else if (algorithmName.equals(StratosConstants.NETWORK_PARTITION_ALL_AT_ONCE_ALGORITHM_ID)) {
if (log.isDebugEnabled()) {
- String msg = String.format("Network partition algorithm is set to %s in applicatioin policy",
+ String msg = String.format("Network partition algorithm is set to %s " +
+ "in applicatioin policy",
StratosConstants.NETWORK_PARTITION_ALL_AT_ONCE_ALGORITHM_ID);
log.debug(msg);
}
@@ -530,7 +595,8 @@ public class ApplicationMonitor extends ParentComponentMonitor {
}
if (log.isDebugEnabled()) {
- String msg = String.format("Invalid network partition algorithm %s found in applicatioin policy",
+ String msg = String.format("Invalid network partition algorithm %s found " +
+ "in applicatioin policy",
StratosConstants.NETWORK_PARTITION_ALL_AT_ONCE_ALGORITHM_ID);
log.debug(msg);
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/29ac5f0a/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 e8da232..426c169 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
@@ -23,6 +23,7 @@ import org.apache.commons.logging.LogFactory;
import org.apache.stratos.autoscaler.algorithms.PartitionAlgorithm;
import org.apache.stratos.autoscaler.applications.ApplicationHolder;
import org.apache.stratos.autoscaler.applications.topic.ApplicationBuilder;
+import org.apache.stratos.autoscaler.context.AutoscalerContext;
import org.apache.stratos.autoscaler.context.InstanceContext;
import org.apache.stratos.autoscaler.context.group.GroupInstanceContext;
import org.apache.stratos.autoscaler.context.partition.GroupLevelPartitionContext;
@@ -47,6 +48,7 @@ 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;
@@ -151,8 +153,16 @@ public class GroupMonitor extends ParentComponentMonitor {
for (InstanceContext parentInstanceContext : parent.
getNetworkPartitionContext(networkPartitionContext.getId()).
getInstanceIdToInstanceContextMap().values()) {
- //Creating new group instance based on the existing parent instances
- createInstanceOnDemand(parentInstanceContext.getId());
+ //keep on scaleup/scaledown only if the application is active
+ ApplicationMonitor appMonitor = AutoscalerContext.getInstance().
+ getAppMonitor(appId);
+ int activeAppInstances = appMonitor.
+ getNetworkPartitionContext(networkPartitionContext.getId()).
+ getActiveInstancesCount();
+ if(activeAppInstances > 0) {
+ //Creating new group instance based on the existing parent instances
+ createInstanceOnDemand(parentInstanceContext.getId());
+ }
}
}