fixing app bursting issue and code refactoring
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/015e89b7 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/015e89b7 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/015e89b7 Branch: refs/heads/master Commit: 015e89b7d4c41257aa4d175ad58a1e04eb67910b Parents: e0ccfe6 Author: reka <[email protected]> Authored: Thu May 7 17:08:07 2015 +0530 Committer: reka <[email protected]> Committed: Mon May 11 13:58:44 2015 +0530 ---------------------------------------------------------------------- .../applications/topic/ApplicationBuilder.java | 89 +++++++++++++++----- .../topic/ApplicationsEventPublisher.java | 33 +++++--- .../context/cluster/AbstractClusterContext.java | 3 +- .../monitor/component/ApplicationMonitor.java | 9 +- .../component/ParentComponentMonitor.java | 2 +- .../status/processor/StatusProcessor.java | 2 +- .../cluster/ClusterStatusActiveProcessor.java | 2 +- .../cluster/ClusterStatusInactiveProcessor.java | 8 +- .../ClusterStatusTerminatedProcessor.java | 10 +-- .../group/GroupStatusActiveProcessor.java | 25 +++--- .../group/GroupStatusInactiveProcessor.java | 69 +++++++-------- .../processor/group/GroupStatusProcessor.java | 16 ++-- .../group/GroupStatusTerminatedProcessor.java | 14 +-- .../group/GroupStatusTerminatingProcessor.java | 16 ++-- 14 files changed, 171 insertions(+), 127 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/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 60de3dd..b5da7a7 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 @@ -255,14 +255,16 @@ public class ApplicationBuilder { ApplicationsEventPublisher.sendApplicationDeletedEvent(appId, appClusterDataToSend); } - public static void handleApplicationInstanceTerminatedEvent(String applicationId, String instanceId) { + public static void handleApplicationInstanceTerminatedEvent(String applicationId, + String instanceId) { if (log.isDebugEnabled()) { log.debug("Handling application terminated event: [application-id] " + applicationId + " [instance] " + instanceId); } Application application = ApplicationHolder.getApplications().getApplication(applicationId); - ApplicationContext applicationContext = AutoscalerContext.getInstance().getApplicationContext(applicationId); + ApplicationContext applicationContext = AutoscalerContext.getInstance(). + getApplicationContext(applicationId); if ((application == null) || (applicationContext == null)) { log.warn("Application does not exist: [application-id] " + applicationId); @@ -272,7 +274,8 @@ public class ApplicationBuilder { if (applicationInstance.isStateTransitionValid(status)) { //setting the status, persist and publish applicationInstance.setStatus(status); - updateApplicationMonitor(applicationId, status, applicationInstance.getNetworkPartitionId(), + updateApplicationMonitor(applicationId, status, + applicationInstance.getNetworkPartitionId(), instanceId); ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance(). getAppMonitor(applicationId); @@ -282,14 +285,16 @@ public class ApplicationBuilder { networkPartitionContext.removeInstanceContext(instanceId); applicationMonitor.removeInstance(instanceId); application.removeInstance(instanceId); - ApplicationsEventPublisher.sendApplicationInstanceTerminatedEvent(applicationId, instanceId); + ApplicationsEventPublisher.sendApplicationInstanceTerminatedEvent(applicationId, + instanceId); //removing the monitor if (application.getInstanceContextCount() == 0 && applicationMonitor.isTerminating()) { //Stopping the child threads if (applicationMonitor.hasMonitors() && applicationMonitor.isTerminating()) { - for (Monitor monitor1 : applicationMonitor.getAliasToActiveChildMonitorsMap().values()) { + for (Monitor monitor1 : applicationMonitor. + getAliasToActiveChildMonitorsMap().values()) { //destroying the drools monitor1.destroy(); } @@ -302,7 +307,7 @@ public class ApplicationBuilder { applicationContext.setStatus(ApplicationContext.STATUS_CREATED); AutoscalerContext.getInstance().updateApplicationContext(applicationContext); - log.info("Application undeployed successfully: [application-id] " + applicationId); + log.info("Application un-deployed successfully: [application-id] " + applicationId); } } else { log.warn(String.format("Application state transition is not valid: [application-id] %s " + @@ -338,19 +343,23 @@ public class ApplicationBuilder { ApplicationHolder.releaseWriteLock(); } - // if monitors is not found for any cluster, assume cluster is not there and send cluster terminating event. - // this assumes the cluster monitor will not fail after creating members, but will only fail before + // if monitors is not found for any cluster, assume cluster is not there and + // send cluster terminating event. This assumes the cluster monitor will + // not fail after creating members, but will only fail before for (ClusterDataHolder aClusterData : clusterData) { if (AutoscalerContext.getInstance().getClusterMonitor(aClusterData.getClusterId()) == null) { TopologyManager.acquireReadLockForCluster(aClusterData.getServiceType(), aClusterData.getClusterId()); try { - Service service = TopologyManager.getTopology().getService(aClusterData.getServiceType()); + Service service = TopologyManager.getTopology(). + getService(aClusterData.getServiceType()); if (service != null) { Cluster cluster = service.getCluster(aClusterData.getClusterId()); if (cluster != null) { - for (ClusterInstance instance : cluster.getInstanceIdToInstanceContextMap().values()) { - ClusterStatusEventPublisher.sendClusterStatusClusterTerminatingEvent(applicationId, + for (ClusterInstance instance : + cluster.getInstanceIdToInstanceContextMap().values()) { + ClusterStatusEventPublisher. + sendClusterStatusClusterTerminatingEvent(applicationId, aClusterData.getServiceType(), aClusterData.getClusterId(), instance.getInstanceId()); @@ -368,7 +377,8 @@ public class ApplicationBuilder { } - public static void handleGroupInstanceTerminatedEvent(String appId, String groupId, String instanceId) { + public static void handleGroupInstanceTerminatedEvent(String appId, String groupId, + String instanceId) { if (log.isDebugEnabled()) { log.debug("Handling group terminated event: [group-id] " + groupId + " [application-id] " + appId + " [instance] " + instanceId); @@ -405,7 +415,8 @@ public class ApplicationBuilder { if (monitor != null) { if (monitor.hasMonitors() && applicationMonitor.isTerminating()) { - for (Monitor monitor1 : monitor.getAliasToActiveChildMonitorsMap().values()) { + for (Monitor monitor1 : monitor. + getAliasToActiveChildMonitorsMap().values()) { //destroying the drools monitor1.destroy(); } @@ -643,17 +654,33 @@ public class ApplicationBuilder { NetworkPartitionContext context = applicationMonitor. getNetworkPartitionContext(networkPartitionId); if (applicationMonitor != null) { - if (status == ApplicationStatus.Active) { + if(status == ApplicationStatus.Active) { + if(log.isDebugEnabled()) { + log.debug("Moving pending [application-instance] " + instanceId + + " to active list in [application] " + appId); + } context.movePendingInstanceToActiveInstances(instanceId); - } else if (status == ApplicationStatus.Terminating) { + } else if(status == ApplicationStatus.Terminating) { applicationMonitor.setTerminating(true); - if (context.getActiveInstance(instanceId) != null) { + if(context.getActiveInstance(instanceId) != null) { + if(log.isDebugEnabled()) { + log.debug("Moving active [application-instance] " + instanceId + + " to termination pending list " + "in [application] " + appId); + } context.moveActiveInstanceToTerminationPendingInstances(instanceId); - } else if (context.getPendingInstance(instanceId) != null) { + } else if(context.getPendingInstance(instanceId) != null) { + if(log.isDebugEnabled()) { + log.debug("Moving pending [application-instance]" + instanceId + + " to termination pending list in [application] " + appId); + } context.movePendingInstanceToTerminationPendingInstances(instanceId); } - } else if (status == ApplicationStatus.Terminated) { + } else if(status == ApplicationStatus.Terminated) { + if(log.isDebugEnabled()) { + log.debug("Removing termination pending [application-instance] " + instanceId + + " [application] " + appId); + } context.removeTerminationPendingInstance(instanceId); } applicationMonitor.setStatus(status, instanceId); @@ -669,15 +696,31 @@ public class ApplicationBuilder { GroupMonitor monitor = getGroupMonitor(appId, groupId); if (monitor != null) { NetworkPartitionContext context = monitor.getNetworkPartitionContext(networkPartitionId); - if (status == GroupStatus.Active) { + if(status == GroupStatus.Active) { + if(log.isDebugEnabled()) { + log.debug("Moving pending group instance to active list in [group] " + groupId + + " [group-instance] " + instanceId); + } context.movePendingInstanceToActiveInstances(instanceId); - } else if (status == GroupStatus.Terminating) { - if (context.getActiveInstance(instanceId) != null) { + } else if(status == GroupStatus.Terminating) { + if(context.getActiveInstance(instanceId) != null) { + if(log.isDebugEnabled()) { + log.debug("Moving active group instance to termination pending list in " + + "[group] " + groupId + " [group-instance] " + instanceId); + } context.moveActiveInstanceToTerminationPendingInstances(instanceId); - } else if (context.getPendingInstance(instanceId) != null) { + } else if(context.getPendingInstance(instanceId) != null) { + if(log.isDebugEnabled()) { + log.debug("Moving pending group instance to termination pending list in " + + "[group] " + groupId + " [group-instance] " + instanceId); + } context.movePendingInstanceToTerminationPendingInstances(instanceId); } - } else if (status == GroupStatus.Terminated) { + } else if(status == GroupStatus.Terminated) { + if(log.isDebugEnabled()) { + log.debug("Removing termination pending group instance in " + + "[group] " + groupId + " [group-instance] " + instanceId); + } context.removeTerminationPendingInstance(instanceId); } monitor.setStatus(status, instanceId, parentInstanceId); http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java index bd66cd0..d5c71cf 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java @@ -33,14 +33,15 @@ public class ApplicationsEventPublisher { publishEvent(new ApplicationDeletedEvent(appId, clusterData)); } - public static void sendApplicationInstanceCreatedEvent(String appId, ApplicationInstance applicationInstance) { + public static void sendApplicationInstanceCreatedEvent(String appId, + ApplicationInstance applicationInstance) { publishEvent(new ApplicationInstanceCreatedEvent(appId, applicationInstance)); } public static void sendGroupInstanceCreatedEvent(String appId, String groupId, GroupInstance groupInstance) { if (log.isInfoEnabled()) { - log.info("Publishing group created event: [application] " + appId + + log.info("Publishing group instance created event: [application] " + appId + " [group] " + groupId + " [instance] " + groupInstance.getInstanceId()); } GroupInstanceCreatedEvent groupCreatedEvent = @@ -48,9 +49,10 @@ public class ApplicationsEventPublisher { publishEvent(groupCreatedEvent); } - public static void sendGroupInstanceActivatedEvent(String appId, String groupId, String instanceId) { + public static void sendGroupInstanceActivatedEvent(String appId, String groupId, + String instanceId) { if (log.isInfoEnabled()) { - log.info("Publishing group activated event: [application] " + appId + + log.info("Publishing group instance activated event: [application] " + appId + " [group] " + groupId + " [instance] " + instanceId); } GroupInstanceActivatedEvent groupActivatedEvent = @@ -58,9 +60,10 @@ public class ApplicationsEventPublisher { publishEvent(groupActivatedEvent); } - public static void sendGroupInstanceInactivateEvent(String appId, String groupId, String instanceId) { + public static void sendGroupInstanceInactivateEvent(String appId, String groupId, + String instanceId) { if (log.isInfoEnabled()) { - log.info("Publishing group inactivate event: [application] " + appId + + log.info("Publishing group instance inactivate event: [application] " + appId + " [group] " + groupId + " [instance] " + instanceId); } GroupInstanceInactivatedEvent groupInactivateEvent = @@ -68,9 +71,10 @@ public class ApplicationsEventPublisher { publishEvent(groupInactivateEvent); } - public static void sendGroupInstanceTerminatingEvent(String appId, String groupId, String instanceId) { + public static void sendGroupInstanceTerminatingEvent(String appId, String groupId, + String instanceId) { if (log.isInfoEnabled()) { - log.info("Publishing group terminating event: [application] " + appId + + log.info("Publishing group instance terminating event: [application] " + appId + " [group] " + groupId + " [instance] " + instanceId); } GroupInstanceTerminatingEvent groupInTerminatingEvent = @@ -78,10 +82,11 @@ public class ApplicationsEventPublisher { publishEvent(groupInTerminatingEvent); } - public static void sendGroupInstanceTerminatedEvent(String appId, String groupId, String instanceId) { + public static void sendGroupInstanceTerminatedEvent(String appId, String groupId, + String instanceId) { if (log.isInfoEnabled()) { - log.info("Publishing group terminated event: [application] " + appId + + log.info("Publishing group instance terminated event: [application] " + appId + " [group] " + groupId + " [instance] " + instanceId); } GroupInstanceTerminatedEvent groupInTerminatedEvent = @@ -91,7 +96,7 @@ public class ApplicationsEventPublisher { public static void sendApplicationInstanceActivatedEvent(String appId, String instanceId) { if (log.isInfoEnabled()) { - log.info("Publishing application active event: [application] " + appId + log.info("Publishing application instance active event: [application] " + appId + " [instance] " + instanceId); } ApplicationInstanceActivatedEvent applicationActivatedEvent = @@ -102,7 +107,7 @@ public class ApplicationsEventPublisher { public static void sendApplicationInstanceInactivatedEvent(String appId, String instanceId) { if (log.isInfoEnabled()) { - log.info("Publishing application inactivated event: [application] " + appId + + log.info("Publishing application instance in-activated event: [application] " + appId + " [instance] " + instanceId); } ApplicationInstanceInactivatedEvent applicationInactivatedEvent = @@ -113,7 +118,7 @@ public class ApplicationsEventPublisher { public static void sendApplicationInstanceTerminatingEvent(String appId, String instanceId) { if (log.isInfoEnabled()) { - log.info("Publishing application terminating event: [application] " + appId + + log.info("Publishing application instance terminating event: [application] " + appId + " [instance] " + instanceId); } ApplicationInstanceTerminatingEvent applicationTerminatingEvent = @@ -123,7 +128,7 @@ public class ApplicationsEventPublisher { public static void sendApplicationInstanceTerminatedEvent(String appId, String instanceId) { if (log.isInfoEnabled()) { - log.info("Publishing application terminated event: [application] " + appId + + log.info("Publishing application instance terminated event: [application] " + appId + " [instance] " + instanceId); } ApplicationInstanceTerminatedEvent applicationTerminatedEvent = http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/AbstractClusterContext.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/AbstractClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/AbstractClusterContext.java index a2d887e..4a1c117 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/AbstractClusterContext.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/AbstractClusterContext.java @@ -25,6 +25,7 @@ import org.apache.stratos.messaging.domain.instance.ClusterInstance; import java.io.Serializable; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /* * It holds the runtime data of a service cluster @@ -43,7 +44,7 @@ public class AbstractClusterContext implements Serializable { public AbstractClusterContext(String clusterId, String serviceId) { this.clusterId = clusterId; this.serviceId = serviceId; - clusterInstanceMap = new HashMap<String, ClusterInstance>(); + clusterInstanceMap = new ConcurrentHashMap<String, ClusterInstance>(); } public String getServiceId() { http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/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 314be1e..0228a15 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 @@ -471,7 +471,7 @@ public class ApplicationMonitor extends ParentComponentMonitor { } boolean burstNPFound = false; - String instanceId = null; + List<String> instanceIdList = new ArrayList<String>(); ApplicationPolicy applicationPolicy = PolicyManager.getInstance(). getApplicationPolicy(application.getApplicationPolicyId()); @@ -517,7 +517,7 @@ public class ApplicationMonitor extends ParentComponentMonitor { for (String networkPartitionId : nextNetworkPartitions) { if (!this.getNetworkPartitionCtxts().containsKey(networkPartitionId)) { - + String instanceId = null; ApplicationLevelNetworkPartitionContext context = new ApplicationLevelNetworkPartitionContext(networkPartitionId); @@ -534,6 +534,9 @@ public class ApplicationMonitor extends ParentComponentMonitor { "in the ApplicationsTopology. Hence not creating new AppInstance."); instanceId = handleApplicationInstanceCreation(application, context, appInstance); } + if(instanceId != null) { + instanceIdList.add(instanceId); + } burstNPFound = true; } } @@ -541,7 +544,7 @@ public class ApplicationMonitor extends ParentComponentMonitor { if (!burstNPFound) { log.warn("[Application] " + appId + " cannot be burst as no available resources found"); } else { - startDependency(application, instanceId); + startDependency(application, instanceIdList); } } http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/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 75b18f1..0265501 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 @@ -113,7 +113,7 @@ public abstract class ParentComponentMonitor extends Monitor { // Create the executor service with identifier and thread pool size executorService = StratosThreadPool.getExecutorService(AutoscalerConstants.AUTOSCALER_THREAD_POOL_ID, AutoscalerConstants.AUTOSCALER_THREAD_POOL_SIZE); - networkPartitionCtxts = new HashMap<String, NetworkPartitionContext>(); + networkPartitionCtxts = new ConcurrentHashMap<String, NetworkPartitionContext>(); } /** http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/StatusProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/StatusProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/StatusProcessor.java index 3d0512c..89982c9 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/StatusProcessor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/StatusProcessor.java @@ -19,7 +19,7 @@ package org.apache.stratos.autoscaler.status.processor; /** - * Created by reka on 11/25/14. + * Abstract class to calculate the status of application/group/cluster */ public abstract class StatusProcessor { /** http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java index eb35f4f..468d172 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusActiveProcessor.java @@ -45,7 +45,7 @@ public class ClusterStatusActiveProcessor extends ClusterStatusProcessor { if (type == null || (ClusterStatusActiveProcessor.class.getName().equals(type))) { statusChanged = doProcess(clusterId, instanceId); if (statusChanged) { - return statusChanged; + return true; } } else { http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInactiveProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInactiveProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInactiveProcessor.java index 8383513..ed918e3 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInactiveProcessor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusInactiveProcessor.java @@ -45,7 +45,7 @@ public class ClusterStatusInactiveProcessor extends ClusterStatusProcessor { if (type == null || (ClusterStatusInactiveProcessor.class.getName().equals(type))) { statusChanged = doProcess(clusterId, instanceId); if (statusChanged) { - return statusChanged; + return true; } } else { @@ -54,15 +54,15 @@ public class ClusterStatusInactiveProcessor extends ClusterStatusProcessor { return nextProcessor.process(type, clusterId, instanceId); } else { - log.warn(String.format("No possible state change found for [type] %s [cluster] %s [instance]", - type, clusterId, instanceId)); + log.warn(String.format("No possible state change found for [type] %s [cluster] %s " + + "[instance] %s", type, clusterId, instanceId)); } } return false; } private boolean doProcess(String clusterId, String instanceId) { - ClusterMonitor monitor = (ClusterMonitor) AutoscalerContext.getInstance(). + ClusterMonitor monitor = AutoscalerContext.getInstance(). getClusterMonitor(clusterId); boolean clusterInactive; http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java index 9a6216a..f56a29a 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java @@ -50,7 +50,7 @@ public class ClusterStatusTerminatedProcessor extends ClusterStatusProcessor { if (type == null || (ClusterStatusTerminatedProcessor.class.getName().equals(type))) { statusChanged = doProcess(clusterId, instanceId); if (statusChanged) { - return statusChanged; + return true; } } else { @@ -118,7 +118,6 @@ public class ClusterStatusTerminatedProcessor extends ClusterStatusProcessor { * @return whether has members or not */ private boolean clusterInstanceHasMembers(ClusterMonitor monitor, String instanceId) { - boolean hasMember = false; for (ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext : monitor.getAllNetworkPartitionCtxts().values()) { //minimum check per partition @@ -130,16 +129,13 @@ public class ClusterStatusTerminatedProcessor extends ClusterStatusProcessor { for (ClusterLevelPartitionContext partitionContext : clusterInstanceContext.getPartitionCtxts()) { if (partitionContext.getNonTerminatedMemberCount() > 0) { - hasMember = true; - return hasMember; - } else { - hasMember = false; + return true; } } } } } - return hasMember; + return false; } } http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusActiveProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusActiveProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusActiveProcessor.java index 7f824a7..e8c5b0b 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusActiveProcessor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusActiveProcessor.java @@ -85,28 +85,25 @@ public class GroupStatusActiveProcessor extends GroupStatusProcessor { groups = component.getAliasToGroupMap(); clusterData = component.getClusterDataMap(); - if (groups.isEmpty() && getAllClusterInSameState(clusterData, ClusterStatus.Active, instanceId) || - clusterData.isEmpty() && getAllGroupInSameState(groups, GroupStatus.Active, instanceId) || + if (groups.isEmpty() && + getAllClusterInSameState(clusterData, ClusterStatus.Active, instanceId) || + clusterData.isEmpty() && + getAllGroupInSameState(groups, GroupStatus.Active, instanceId) || getAllClusterInSameState(clusterData, ClusterStatus.Active, instanceId) && getAllGroupInSameState(groups, GroupStatus.Active, instanceId)) { - //send activation event + if (component instanceof Application) { //send application activated event - - if (log.isInfoEnabled()) { - log.info(String.format("Sending application active for [application] %s [instance] %s ", appId - , instanceId)); - } + log.info("Sending application instance active for [application] " + appId + + " [instance] " + instanceId); ApplicationBuilder.handleApplicationInstanceActivatedEvent(appId, instanceId); return true; } else if (component instanceof Group) { //send activation to the parent - - if (log.isInfoEnabled()) { - log.info(String.format("Sending group instance active for [group] %s [instance] %s ", component.getUniqueIdentifier() - , instanceId)); - } - ApplicationBuilder.handleGroupInstanceActivatedEvent(appId, component.getUniqueIdentifier(), instanceId); + log.info("Sending group instance active for [group] " + + component.getUniqueIdentifier() + " [instance] " + instanceId); + ApplicationBuilder.handleGroupInstanceActivatedEvent(appId, + component.getUniqueIdentifier(), instanceId); return true; } http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusInactiveProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusInactiveProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusInactiveProcessor.java index 8d77230..a69db5a 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusInactiveProcessor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusInactiveProcessor.java @@ -26,15 +26,17 @@ import org.apache.stratos.autoscaler.status.processor.StatusProcessor; import org.apache.stratos.messaging.domain.application.*; import org.apache.stratos.messaging.domain.instance.ClusterInstance; import org.apache.stratos.messaging.domain.instance.GroupInstance; +import org.apache.stratos.messaging.domain.instance.Instance; import org.apache.stratos.messaging.domain.topology.Cluster; import org.apache.stratos.messaging.domain.topology.ClusterStatus; import org.apache.stratos.messaging.domain.topology.Service; import org.apache.stratos.messaging.message.receiver.topology.TopologyManager; +import java.util.List; import java.util.Map; /** - * Cluster active status processor + * Cluster in-active status processor */ public class GroupStatusInactiveProcessor extends GroupStatusProcessor { private static final Log log = LogFactory.getLog(GroupStatusInactiveProcessor.class); @@ -50,7 +52,7 @@ public class GroupStatusInactiveProcessor extends GroupStatusProcessor { boolean statusChanged; statusChanged = doProcess(idOfComponent, appId, instanceId); if (statusChanged) { - return statusChanged; + return true; } if (nextProcessor != null) { @@ -91,34 +93,31 @@ public class GroupStatusInactiveProcessor extends GroupStatusProcessor { if (groups.isEmpty() && getAllClusterInactive(clusterData, instanceId) || clusterData.isEmpty() && getAllGroupInactive(groups, instanceId) || - getAllClusterInactive(clusterData, instanceId) || getAllGroupInactive(groups, instanceId)) { - //send the in activation event + getAllClusterInactive(clusterData, instanceId) || + getAllGroupInactive(groups, instanceId)) { + //send the in-activation event if (component instanceof Application) { - //send application activated event + //send application in-activated event log.warn("Sending application instance inactive for [Application] " + appId + " [ApplicationInstance] " + instanceId); ApplicationBuilder.handleApplicationInstanceInactivateEvent(appId, instanceId); return true; - //ApplicationBuilder.handleApp(appId); - } else if (component instanceof Group) { - //send activation to the parent + } else { + //send group in-activated event if (((Group) component).getStatus(instanceId) != GroupStatus.Inactive) { - log.info("sending group instance Inactive for [group] " + + log.info("Sending group instance Inactive for [group] " + component.getUniqueIdentifier() + " [instance] " + instanceId); - ApplicationBuilder.handleGroupInactivateEvent(appId, component.getUniqueIdentifier(), instanceId); + ApplicationBuilder.handleGroupInactivateEvent(appId, + component.getUniqueIdentifier(), instanceId); return true; } } } - - } finally { ApplicationHolder.releaseWriteLock(); } - - return false; } @@ -130,26 +129,20 @@ public class GroupStatusInactiveProcessor extends GroupStatusProcessor { * @return whether inactive or not */ - private boolean getAllClusterInactive(Map<String, ClusterDataHolder> clusterData, String instanceId) { - boolean clusterStat = false; + private boolean getAllClusterInactive(Map<String, ClusterDataHolder> clusterData, + String instanceId) { for (Map.Entry<String, ClusterDataHolder> clusterDataHolderEntry : clusterData.entrySet()) { - Service service = TopologyManager.getTopology().getService(clusterDataHolderEntry.getValue().getServiceType()); + Service service = TopologyManager.getTopology(). + getService(clusterDataHolderEntry.getValue().getServiceType()); Cluster cluster = service.getCluster(clusterDataHolderEntry.getValue().getClusterId()); ClusterInstance context = cluster.getInstanceContexts(instanceId); if (context != null) { if (context.getStatus() == ClusterStatus.Inactive) { - clusterStat = true; - return clusterStat; - } else { - clusterStat = false; - + return true; } - } else { - clusterStat = false; } - } - return clusterStat; + return false; } @@ -160,21 +153,29 @@ public class GroupStatusInactiveProcessor extends GroupStatusProcessor { * @return whether inactive or not */ private boolean getAllGroupInactive(Map<String, Group> groups, String instanceId) { - boolean groupStat = false; for (Group group : groups.values()) { GroupInstance context = group.getInstanceContexts(instanceId); if (context != null) { if (context.getStatus() == GroupStatus.Inactive) { - groupStat = true; - return groupStat; - } else { - groupStat = false; + return true; } - //TODO get by parent } else { - groupStat = false; + List<Instance> instanceList = group.getInstanceContextsWithParentId(instanceId); + //if no instances found and requested status is terminated, + // then considering this group as terminated + if (instanceList != null && !instanceList.isEmpty()) { + int sameStateInstances = 0; + for (Instance context1 : instanceList) { + if (((GroupInstance) context1).getStatus().equals(GroupStatus.Inactive)) { + sameStateInstances++; + } + } + if (sameStateInstances >= 1) { + return true; + } + } } } - return groupStat; + return false; } } http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/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 bdf8f7e..d14bcbd 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 @@ -65,15 +65,14 @@ public abstract class GroupStatusProcessor extends StatusProcessor { if (context.getStatus() == status) { groupStat = true; } else { - groupStat = false; - return groupStat; + return false; } } else { //Checking the minimum of the group instances to be satisfied List<Instance> contexts = group.getInstanceContextsWithParentId(instanceId); //if no instances found and requested status is terminated, // then considering this group as terminated - if (context == null && contexts.isEmpty() && status == GroupStatus.Terminated) { + if (contexts == null || contexts.isEmpty() && status == GroupStatus.Terminated) { groupStat = true; } else { int minGroupInstances = group.getGroupMinInstances(); @@ -86,12 +85,9 @@ public abstract class GroupStatusProcessor extends StatusProcessor { if (sameStateInstances >= minGroupInstances) { groupStat = true; } else { - groupStat = false; - return groupStat; + return false; } } - - } } return groupStat; @@ -123,16 +119,14 @@ public abstract class GroupStatusProcessor extends StatusProcessor { if (context.getStatus() == status) { clusterStat = true; } else { - clusterStat = false; - return clusterStat; + return false; } } else { //Checking whether non-existent context is for a terminated state change if (status == ClusterStatus.Terminated) { clusterStat = true; } else { - clusterStat = false; - return clusterStat; + return false; } } } finally { http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusTerminatedProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusTerminatedProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusTerminatedProcessor.java index 133feaa..8cade3c 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusTerminatedProcessor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusTerminatedProcessor.java @@ -29,7 +29,7 @@ import org.apache.stratos.messaging.domain.topology.ClusterStatus; import java.util.Map; /** - * Cluster active status processor + * Cluster Terminated status processor */ public class GroupStatusTerminatedProcessor extends GroupStatusProcessor { private static final Log log = LogFactory.getLog(GroupStatusTerminatedProcessor.class); @@ -86,18 +86,20 @@ public class GroupStatusTerminatedProcessor extends GroupStatusProcessor { groups = component.getAliasToGroupMap(); clusterData = component.getClusterDataMap(); - if (groups.isEmpty() && getAllClusterInSameState(clusterData, ClusterStatus.Terminated, instanceId) || - clusterData.isEmpty() && getAllGroupInSameState(groups, GroupStatus.Terminated, instanceId) || + if (groups.isEmpty() && + getAllClusterInSameState(clusterData, ClusterStatus.Terminated, instanceId) || + clusterData.isEmpty() && + getAllGroupInSameState(groups, GroupStatus.Terminated, instanceId) || getAllClusterInSameState(clusterData, ClusterStatus.Terminated, instanceId) && getAllGroupInSameState(groups, GroupStatus.Terminated, instanceId)) { //send the terminated event if (component instanceof Application) { - log.info("sending application terminated for [application] " + appId + " [instance] " - + instanceId); + log.info("Sending application instance terminated for [application] " + appId + + " [instance] " + instanceId); ApplicationBuilder.handleApplicationInstanceTerminatedEvent(appId, instanceId); return true; } else if (component instanceof Group) { - log.info("sending group instance terminated for [group] " + + log.info("Sending group instance terminated for [group] " + component.getUniqueIdentifier() + " [instance] " + instanceId); ApplicationBuilder.handleGroupInstanceTerminatedEvent(appId, component.getUniqueIdentifier(), instanceId); http://git-wip-us.apache.org/repos/asf/stratos/blob/015e89b7/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusTerminatingProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusTerminatingProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusTerminatingProcessor.java index d3a29ae..fd83833 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusTerminatingProcessor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusTerminatingProcessor.java @@ -29,7 +29,7 @@ import org.apache.stratos.messaging.domain.topology.ClusterStatus; import java.util.Map; /** - * Cluster active status processor + * Cluster terminating status processor */ public class GroupStatusTerminatingProcessor extends GroupStatusProcessor { private static final Log log = LogFactory.getLog(GroupStatusTerminatingProcessor.class); @@ -86,19 +86,21 @@ public class GroupStatusTerminatingProcessor extends GroupStatusProcessor { groups = component.getAliasToGroupMap(); clusterData = component.getClusterDataMap(); - if (groups.isEmpty() && getAllClusterInSameState(clusterData, ClusterStatus.Terminating, instanceId) || - clusterData.isEmpty() && getAllGroupInSameState(groups, GroupStatus.Terminating, instanceId) || + if (groups.isEmpty() && + getAllClusterInSameState(clusterData, ClusterStatus.Terminating, instanceId) || + clusterData.isEmpty() && + getAllGroupInSameState(groups, GroupStatus.Terminating, instanceId) || getAllClusterInSameState(clusterData, ClusterStatus.Terminating, instanceId) && getAllGroupInSameState(groups, GroupStatus.Terminating, instanceId)) { - //send the terminated event + //send the terminating event if (component instanceof Application) { - log.info("sending app terminating for [application] " + appId + " and for " + - " [instance] " + instanceId); + log.info("Sending application instance terminating for [application] " + + appId + " and for " + " [instance] " + instanceId); ApplicationBuilder.handleApplicationInstanceTerminatedEvent(appId, instanceId); return true; } else if (component instanceof Group) { //send activation to the parent - log.info("sending group terminating for [group] " + + log.info("Sending group terminating for [group] " + component.getUniqueIdentifier() + " and for [instance] " + instanceId); ApplicationBuilder.handleGroupTerminatingEvent(appId,
