Repository: stratos Updated Branches: refs/heads/4.0.0-grouping f6c0cfcb5 -> f00e2f369
refacting monitors to have their own status Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/f00e2f36 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/f00e2f36 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/f00e2f36 Branch: refs/heads/4.0.0-grouping Commit: f00e2f369fcde531784fd65c8e38e5e9f61757b9 Parents: f6c0cfc Author: reka <[email protected]> Authored: Sat Oct 18 21:56:01 2014 +0530 Committer: reka <[email protected]> Committed: Sat Oct 18 21:56:01 2014 +0530 ---------------------------------------------------------------------- .../AutoscalerTopologyEventReceiver.java | 2 +- .../monitor/ApplicationMonitorFactory.java | 202 ++++++++++++------- .../stratos/autoscaler/monitor/Monitor.java | 11 +- .../monitor/ParentComponentMonitor.java | 18 +- .../monitor/application/ApplicationMonitor.java | 12 +- .../autoscaler/monitor/group/GroupMonitor.java | 76 ++++--- .../status/checker/StatusChecker.java | 24 ++- 7 files changed, 188 insertions(+), 157 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/f00e2f36/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java index 5b765d4..1e20937 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java @@ -306,7 +306,7 @@ public class AutoscalerTopologyEventReceiver implements Runnable { AbstractClusterMonitor monitor; if (AutoscalerContext.getInstance().monitorExist((cluster.getClusterId()))) { monitor = (AbstractClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterMaitenanceEvent.getClusterId()); - monitor.setStatus(Status.In_Maintenance); + monitor.setStatus(Status.In_Active); } else if (AutoscalerContext.getInstance(). lbMonitorExist((cluster.getClusterId()))) { AutoscalerContext.getInstance().getLBMonitor(clusterMaitenanceEvent.getClusterId()). http://git-wip-us.apache.org/repos/asf/stratos/blob/f00e2f36/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ApplicationMonitorFactory.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ApplicationMonitorFactory.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ApplicationMonitorFactory.java index 5f810d7..86e0931 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ApplicationMonitorFactory.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ApplicationMonitorFactory.java @@ -38,6 +38,7 @@ import org.apache.stratos.autoscaler.monitor.group.GroupMonitor; import org.apache.stratos.autoscaler.partition.PartitionGroup; import org.apache.stratos.autoscaler.policy.PolicyManager; import org.apache.stratos.autoscaler.policy.model.AutoscalePolicy; +import org.apache.stratos.autoscaler.status.checker.StatusChecker; import org.apache.stratos.cloud.controller.stub.deployment.partition.Partition; import org.apache.stratos.cloud.controller.stub.pojo.MemberContext; import org.apache.stratos.cloud.controller.stub.pojo.Properties; @@ -54,17 +55,29 @@ import java.util.Map; public class ApplicationMonitorFactory { private static final Log log = LogFactory.getLog(ApplicationMonitorFactory.class); - public static Monitor getMonitor(ApplicationContext context, String appId) + /** + * Factor method used to create relevant monitors based on the given context + * + * @param context Application/Group/Cluster context + * @param appId appId of the application which requires to create app monitor + * @param parentMonitor parent of the monitor + * @return Monitor which can be ApplicationMonitor/GroupMonitor/ClusterMonitor + * @throws TopologyInConsistentException throws while traversing thr topology + * @throws DependencyBuilderException throws while building dependency for app monitor + * @throws PolicyValidationException throws while validating the policy associated with cluster + * @throws PartitionValidationException throws while validating the partition used in a cluster + */ + public static Monitor getMonitor(ParentComponentMonitor parentMonitor, ApplicationContext context, String appId) throws TopologyInConsistentException, DependencyBuilderException, PolicyValidationException, PartitionValidationException { Monitor monitor; if (context instanceof GroupContext) { - monitor = getGroupMonitor(context.getId(), appId); + monitor = getGroupMonitor(parentMonitor, context.getId(), appId); } else if (context instanceof ClusterContext) { - monitor = getClusterMonitor((ClusterContext) context, appId); + monitor = getClusterMonitor(parentMonitor, (ClusterContext) context, appId); //Start the thread - Thread th = new Thread((AbstractClusterMonitor)monitor); + Thread th = new Thread((AbstractClusterMonitor) monitor); th.start(); } else { monitor = getApplicationMonitor(appId); @@ -72,7 +85,18 @@ public class ApplicationMonitorFactory { return monitor; } - public static Monitor getGroupMonitor(String groupId, String appId) throws DependencyBuilderException, + /** + * This will create the GroupMonitor based on given groupId by going thr Topology + * + * @param parentMonitor parent of the monitor + * @param groupId groupId of the group + * @param appId appId of the relevant application + * @return Group monitor + * @throws DependencyBuilderException throws while building dependency for app monitor + * @throws TopologyInConsistentException throws while traversing thr topology + */ + public static Monitor getGroupMonitor(ParentComponentMonitor parentMonitor, String groupId, String appId) + throws DependencyBuilderException, TopologyInConsistentException { GroupMonitor groupMonitor; TopologyManager.acquireReadLockForApplication(appId); @@ -81,8 +105,10 @@ public class ApplicationMonitorFactory { Group group = TopologyManager.getTopology().getApplication(appId).getGroupRecursively(groupId); groupMonitor = new GroupMonitor(group, appId); groupMonitor.setAppId(appId); + groupMonitor.setParent(parentMonitor); if (group.getStatus() != groupMonitor.getStatus()) { - //updating the status, so that it will notify the parent + //updating the status, if the group is not in created state when creating group Monitor + //so that groupMonitor will notify the parent (useful when restarting stratos) groupMonitor.setStatus(group.getStatus()); } } finally { @@ -93,6 +119,15 @@ public class ApplicationMonitorFactory { } + /** + * This will create a new app monitor based on the give appId by getting the + * application from Topology + * + * @param appId appId of the application which requires to create app monitor + * @return ApplicationMonitor + * @throws DependencyBuilderException throws while building dependency for app monitor + * @throws TopologyInConsistentException throws while traversing thr topology + */ public static ApplicationMonitor getApplicationMonitor(String appId) throws DependencyBuilderException, TopologyInConsistentException { @@ -117,12 +152,14 @@ public class ApplicationMonitorFactory { /** * Updates ClusterContext for given cluster * + * @param parentMonitor parent of the monitor * @param context * @return ClusterMonitor - Updated ClusterContext * @throws org.apache.stratos.autoscaler.exception.PolicyValidationException * @throws org.apache.stratos.autoscaler.exception.PartitionValidationException */ - public static ClusterMonitor getClusterMonitor(ClusterContext context, String appId) + public static ClusterMonitor getClusterMonitor(ParentComponentMonitor parentMonitor, + ClusterContext context, String appId) throws PolicyValidationException, PartitionValidationException, TopologyInConsistentException { @@ -131,6 +168,7 @@ public class ApplicationMonitorFactory { String serviceName = context.getServiceName(); Cluster cluster; + ClusterMonitor clusterMonitor; //acquire read lock for the service and cluster TopologyManager.acquireReadLockForCluster(serviceName, clusterId); try { @@ -154,101 +192,111 @@ public class ApplicationMonitorFactory { throw new TopologyInConsistentException(msg); } - } finally { - //release read lock for the service and cluster - TopologyManager.releaseReadLockForCluster(serviceName, clusterId); - } - String autoscalePolicyName = cluster.getAutoscalePolicyName(); - String deploymentPolicyName = cluster.getDeploymentPolicyName(); + String autoscalePolicyName = cluster.getAutoscalePolicyName(); + String deploymentPolicyName = cluster.getDeploymentPolicyName(); - if (log.isDebugEnabled()) { - log.debug("Deployment policy name: " + deploymentPolicyName); - log.debug("Autoscaler policy name: " + autoscalePolicyName); - } + if (log.isDebugEnabled()) { + log.debug("Deployment policy name: " + deploymentPolicyName); + log.debug("Autoscaler policy name: " + autoscalePolicyName); + } - AutoscalePolicy policy = - PolicyManager.getInstance() - .getAutoscalePolicy(autoscalePolicyName); - DeploymentPolicy deploymentPolicy = - PolicyManager.getInstance() - .getDeploymentPolicy(deploymentPolicyName); - - if (deploymentPolicy == null) { - String msg = "Deployment Policy is null. Policy name: " + deploymentPolicyName; - log.error(msg); - throw new PolicyValidationException(msg); - } + AutoscalePolicy policy = + PolicyManager.getInstance() + .getAutoscalePolicy(autoscalePolicyName); + DeploymentPolicy deploymentPolicy = + PolicyManager.getInstance() + .getDeploymentPolicy(deploymentPolicyName); + + if (deploymentPolicy == null) { + String msg = "Deployment Policy is null. Policy name: " + deploymentPolicyName; + log.error(msg); + throw new PolicyValidationException(msg); + } - Partition[] allPartitions = deploymentPolicy.getAllPartitions(); - if (allPartitions == null) { - String msg = - "Deployment Policy's Partitions are null. Policy name: " + - deploymentPolicyName; - log.error(msg); - throw new PolicyValidationException(msg); - } + Partition[] allPartitions = deploymentPolicy.getAllPartitions(); + if (allPartitions == null) { + String msg = + "Deployment Policy's Partitions are null. Policy name: " + + deploymentPolicyName; + log.error(msg); + throw new PolicyValidationException(msg); + } - CloudControllerClient.getInstance().validateDeploymentPolicy(cluster.getServiceName(), deploymentPolicy); + CloudControllerClient.getInstance().validateDeploymentPolicy(cluster.getServiceName(), deploymentPolicy); - ClusterMonitor clusterMonitor = - new ClusterMonitor(cluster.getClusterId(), - cluster.getServiceName(), - deploymentPolicy, policy); - clusterMonitor.setAppId(cluster.getAppId()); + clusterMonitor = new ClusterMonitor(cluster.getClusterId(), cluster.getServiceName(), + deploymentPolicy, policy); + clusterMonitor.setAppId(cluster.getAppId()); - for (PartitionGroup partitionGroup : deploymentPolicy.getPartitionGroups()) { + for (PartitionGroup partitionGroup : deploymentPolicy.getPartitionGroups()) { - NetworkPartitionContext networkPartitionContext = new NetworkPartitionContext(partitionGroup.getId(), - partitionGroup.getPartitionAlgo(), partitionGroup.getPartitions()); + NetworkPartitionContext networkPartitionContext = new NetworkPartitionContext(partitionGroup.getId(), + partitionGroup.getPartitionAlgo(), partitionGroup.getPartitions()); - for (Partition partition : partitionGroup.getPartitions()) { - PartitionContext partitionContext = new PartitionContext(partition); - partitionContext.setServiceName(cluster.getServiceName()); - partitionContext.setProperties(cluster.getProperties()); - partitionContext.setNetworkPartitionId(partitionGroup.getId()); + for (Partition partition : partitionGroup.getPartitions()) { + PartitionContext partitionContext = new PartitionContext(partition); + partitionContext.setServiceName(cluster.getServiceName()); + partitionContext.setProperties(cluster.getProperties()); + partitionContext.setNetworkPartitionId(partitionGroup.getId()); - for (Member member : cluster.getMembers()) { - String memberId = member.getMemberId(); - if (member.getPartitionId().equalsIgnoreCase(partition.getId())) { - MemberContext memberContext = new MemberContext(); - memberContext.setClusterId(member.getClusterId()); - memberContext.setMemberId(memberId); - memberContext.setPartition(partition); - memberContext.setProperties(convertMemberPropsToMemberContextProps(member.getProperties())); + for (Member member : cluster.getMembers()) { + String memberId = member.getMemberId(); + if (member.getPartitionId().equalsIgnoreCase(partition.getId())) { + MemberContext memberContext = new MemberContext(); + memberContext.setClusterId(member.getClusterId()); + memberContext.setMemberId(memberId); + memberContext.setPartition(partition); + memberContext.setProperties(convertMemberPropsToMemberContextProps(member.getProperties())); - if (MemberStatus.Activated.equals(member.getStatus())) { - partitionContext.addActiveMember(memberContext); + if (MemberStatus.Activated.equals(member.getStatus())) { + partitionContext.addActiveMember(memberContext); + //triggering the status checker // networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(), 1); // partitionContext.incrementCurrentActiveMemberCount(1); - } else if (MemberStatus.Created.equals(member.getStatus()) || MemberStatus.Starting.equals(member.getStatus())) { - partitionContext.addPendingMember(memberContext); + } else if (MemberStatus.Created.equals(member.getStatus()) || MemberStatus.Starting.equals(member.getStatus())) { + partitionContext.addPendingMember(memberContext); // networkPartitionContext.increaseMemberCountOfPartition(partition.getNetworkPartitionId(), 1); - } else if (MemberStatus.Suspended.equals(member.getStatus())) { + } else if (MemberStatus.Suspended.equals(member.getStatus())) { // partitionContext.addFaultyMember(memberId); + } + partitionContext.addMemberStatsContext(new MemberStatsContext(memberId)); + if (log.isInfoEnabled()) { + log.info(String.format("Member stat context has been added: [member] %s", memberId)); + } } - partitionContext.addMemberStatsContext(new MemberStatsContext(memberId)); - if (log.isInfoEnabled()) { - log.info(String.format("Member stat context has been added: [member] %s", memberId)); - } - } + } + if (cluster.hasMembers()) { + //triggering the status checker if cluster has members to decide + // on the current status of the cluster + StatusChecker.getInstance().onMemberStatusChange(clusterId); + } + networkPartitionContext.addPartitionContext(partitionContext); + if (log.isInfoEnabled()) { + log.info(String.format("Partition context has been added: [partition] %s", + partitionContext.getPartitionId())); + } } - networkPartitionContext.addPartitionContext(partitionContext); + + clusterMonitor.addNetworkPartitionCtxt(networkPartitionContext); + clusterMonitor.setParent(parentMonitor); + //clusterMonitor.setCurrentStatus(Status.Created); if (log.isInfoEnabled()) { - log.info(String.format("Partition context has been added: [partition] %s", - partitionContext.getPartitionId())); + log.info(String.format("Network partition context has been added: [network partition] %s", + networkPartitionContext.getId())); } } - clusterMonitor.addNetworkPartitionCtxt(networkPartitionContext); - //clusterMonitor.setCurrentStatus(Status.Created); - if (log.isInfoEnabled()) { - log.info(String.format("Network partition context has been added: [network partition] %s", - networkPartitionContext.getId())); + if (cluster.getStatus() != clusterMonitor.getStatus()) { + //updating the status, so that it will notify the parent + clusterMonitor.setStatus(cluster.getStatus()); } + } finally { + //release read lock for the service and cluster + TopologyManager.releaseReadLockForCluster(serviceName, clusterId); } // set hasPrimary property http://git-wip-us.apache.org/repos/asf/stratos/blob/f00e2f36/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 bb09811..f08be7f 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 @@ -18,22 +18,19 @@ */ package org.apache.stratos.autoscaler.monitor; -import org.apache.stratos.autoscaler.monitor.events.MonitorStatusEvent; -import org.apache.stratos.messaging.domain.topology.ParentComponent; - import java.util.Map; /** * Abstract class for the monitoring functionality in autoscaler. */ public abstract class Monitor implements EventHandler { + //Id of the monitor, cluster=clusterId, group=group-alias, application=app-alias protected String id; - + //The parent app which this monitor relates to protected String appId; - + //Parent monitor of this monitor, for appMonitor parent will be none. protected ParentComponentMonitor parent; - - //GroupMonitor map, key=GroupAlias and value=GroupMonitor + //monitors map, key=GroupAlias/clusterId and value=GroupMonitor/AbstractClusterMonitor protected Map<String, Monitor> aliasToMonitorsMap; public String getId() { http://git-wip-us.apache.org/repos/asf/stratos/blob/f00e2f36/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java index 1168883..3cd2d9f 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/ParentComponentMonitor.java @@ -30,7 +30,6 @@ import org.apache.stratos.autoscaler.grouping.dependency.DependencyTree; import org.apache.stratos.autoscaler.grouping.dependency.context.ApplicationContext; import org.apache.stratos.autoscaler.monitor.events.MonitorStatusEvent; import org.apache.stratos.messaging.domain.topology.ParentComponent; -import org.apache.stratos.messaging.domain.topology.Status; import java.util.HashMap; import java.util.List; @@ -44,13 +43,8 @@ public abstract class ParentComponentMonitor extends Monitor { //id of the monitor, it can be alias or the id protected String id; - - //AbstractMonitor map, key=clusterId and value=AbstractMonitors - //protected Map<String, AbstractClusterMonitor> clusterIdToClusterMonitorsMap; //The monitors dependency tree with all the startable/killable dependencies protected DependencyTree dependencyTree; - //status of the monitor whether it is running/in_maintainable/terminated - protected Status status; //Application id of this particular monitor protected String appId; @@ -58,7 +52,6 @@ public abstract class ParentComponentMonitor extends Monitor { aliasToMonitorsMap = new HashMap<String, Monitor>(); //clusterIdToClusterMonitorsMap = new HashMap<String, AbstractClusterMonitor>(); this.id = component.getUniqueIdentifier(); - this.status = component.getStatus(); //Building the dependency for this monitor within the immediate children dependencyTree = DependencyBuilder.getInstance().buildDependency(component); } @@ -118,10 +111,6 @@ public abstract class ParentComponentMonitor extends Monitor { } - public Status getStatus() { - return status; - } - public String getId() { return this.id; } @@ -171,7 +160,7 @@ public abstract class ParentComponentMonitor extends Monitor { public void run() { Monitor monitor = null; int retries = 5; - boolean success = false; + boolean success; do { try { Thread.sleep(5000); @@ -183,10 +172,7 @@ public abstract class ParentComponentMonitor extends Monitor { + context.getId()); } try { - monitor = ApplicationMonitorFactory.getMonitor(context, appId); - monitor.setParent(parent); - //TODO start the status checker - + monitor = ApplicationMonitorFactory.getMonitor(parent, context, appId); } catch (DependencyBuilderException e) { String msg = "Monitor creation failed for: " + context.getId(); log.warn(msg, e); http://git-wip-us.apache.org/repos/asf/stratos/blob/f00e2f36/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java index 92bf6fa..5df3367 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java @@ -40,10 +40,13 @@ import java.util.List; */ public class ApplicationMonitor extends ParentComponentMonitor { private static final Log log = LogFactory.getLog(ApplicationMonitor.class); + //status of the monitor whether it is running/in_maintainable/terminated + protected Status status; public ApplicationMonitor(Application application) throws DependencyBuilderException, - TopologyInConsistentException { + TopologyInConsistentException { super(application); + //setting the appId for the application this.appId = application.getUniqueIdentifier(); //starting the first set of dependencies from its children startDependency(); @@ -107,6 +110,7 @@ public class ApplicationMonitor extends ParentComponentMonitor { } */ + /** * Find the group monitor by traversing recursively in the hierarchical monitors. * @@ -183,18 +187,18 @@ public class ApplicationMonitor extends ParentComponentMonitor { String id = statusEvent.getId(); ApplicationContext context = this.dependencyTree. findApplicationContextWithId(id); - if(context.getStatusLifeCycle().isEmpty()) { + if (context.getStatusLifeCycle().isEmpty()) { try { //if life cycle is empty, need to start the monitor boolean startDep = startDependency(statusEvent.getId()); - if(log.isDebugEnabled()) { + if (log.isDebugEnabled()) { log.debug("started a child: " + startDep + " by the group/cluster: " + id); } //updating the life cycle and current status context.setCurrentStatus(statusEvent.getStatus()); context.addStatusToLIfeCycle(statusEvent.getStatus()); - if(!startDep) { + if (!startDep) { //Checking in the children whether all are active, // since no dependency found to be started. StatusChecker.getInstance().onChildStatusChange(id, this.appId); http://git-wip-us.apache.org/repos/asf/stratos/blob/f00e2f36/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/group/GroupMonitor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/group/GroupMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/group/GroupMonitor.java index c76f02b..9f83578 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/group/GroupMonitor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/group/GroupMonitor.java @@ -24,8 +24,8 @@ import org.apache.stratos.autoscaler.exception.DependencyBuilderException; import org.apache.stratos.autoscaler.exception.TopologyInConsistentException; import org.apache.stratos.autoscaler.grouping.dependency.context.ApplicationContext; import org.apache.stratos.autoscaler.monitor.EventHandler; -import org.apache.stratos.autoscaler.monitor.ParentComponentMonitor; import org.apache.stratos.autoscaler.monitor.MonitorStatusEventBuilder; +import org.apache.stratos.autoscaler.monitor.ParentComponentMonitor; import org.apache.stratos.autoscaler.monitor.events.MonitorStatusEvent; import org.apache.stratos.autoscaler.status.checker.StatusChecker; import org.apache.stratos.messaging.domain.topology.Group; @@ -40,35 +40,24 @@ import java.util.List; */ public class GroupMonitor extends ParentComponentMonitor implements EventHandler { private static final Log log = LogFactory.getLog(GroupMonitor.class); - - //Parent monitor of this monitor - private ParentComponentMonitor parent; + //status of the monitor whether it is running/in_maintainable/terminated + private Status status; /** * Constructor of GroupMonitor + * * @param group Takes the group from the Topology - * @throws DependencyBuilderException throws when couldn't build the Topology + * @throws DependencyBuilderException throws when couldn't build the Topology * @throws TopologyInConsistentException throws when topology is inconsistent */ public GroupMonitor(Group group, String appId) throws DependencyBuilderException, - TopologyInConsistentException { + TopologyInConsistentException { super(group); this.appId = appId; + this.setStatus(group.getStatus()); startDependency(); } - /** - * Will set the status of the monitor based on Topology Group status/child status like scaling - * @param status - */ - public void setStatus(Status status) { - log.info(String.format("[Monitor] %s is notifying the parent" + - "on its state change from %s to %s", id, this.status, status)); - this.status = status; - //notifying the parent - MonitorStatusEventBuilder.handleGroupStatusEvent(this.parent, this.status, this.id); - } - @Override public void onEvent(MonitorStatusEvent statusEvent) { monitor(statusEvent); @@ -81,8 +70,8 @@ public class GroupMonitor extends ParentComponentMonitor implements EventHandler ApplicationContext context = this.dependencyTree.findApplicationContextWithId(id); //Events coming from parent are In_Active(in faulty detection), Scaling events, termination //TODO if statusEvent is for active, then start the next one if any available - if(!isParent(id)) { - if(status1 == Status.Activated) { + if (!isParent(id)) { + if (status1 == Status.Activated) { try { //if life cycle is empty, need to start the monitor boolean startDep = startDependency(statusEvent.getId()); @@ -102,7 +91,7 @@ public class GroupMonitor extends ParentComponentMonitor implements EventHandler //TODO revert the siblings and notify parent, change a flag for reverting/un-subscription log.error(e); } - } else if(status1 == Status.In_Maintenance) { + } else if (status1 == Status.In_Active) { //TODO if C1 depends on C2, then if C2 is in_active, then by getting killdepend as C1 and //TODO need to send in_active for c1. When C1 in_active receives, get dependent and //TODO check whether dependent in_active. Then kill c1. @@ -112,8 +101,8 @@ public class GroupMonitor extends ParentComponentMonitor implements EventHandler terminationList = this.dependencyTree.getTerminationDependencies(id); //check whether all the children are in_active state - for(ApplicationContext terminationContext : terminationList) { - //terminationContext + for (ApplicationContext terminationContext : terminationList) { + //terminationContext } /*if(terminationList != null && !terminationList.isEmpty()) { @@ -135,23 +124,16 @@ public class GroupMonitor extends ParentComponentMonitor implements EventHandler if(canTerminate) { // }*/ - } else { - //TODO get dependents - List<ApplicationContext> dependents = this.dependencyTree.getTerminationDependencies(id); - } - - - - - - } else if(status1 == Status.Created) { - //the dependent goes to be created state, so terminate the dependents + } else { + //TODO get dependents + List<ApplicationContext> dependents = this.dependencyTree.getTerminationDependencies(id); } - } - - + } else if (status1 == Status.Created) { + //the dependent goes to be created state, so terminate the dependents + } + } public ParentComponentMonitor getParent() { return parent; @@ -170,15 +152,27 @@ public class GroupMonitor extends ParentComponentMonitor implements EventHandler } private boolean isParent(String id) { - if(this.parent.getId().equals(id)) { + if (this.parent.getId().equals(id)) { return true; } else { return false; } } + public Status getStatus() { + return status; + } - - - + /** + * Will set the status of the monitor based on Topology Group status/child status like scaling + * + * @param status + */ + public void setStatus(Status status) { + log.info(String.format("[Monitor] %s is notifying the parent" + + "on its state change from %s to %s", id, this.status, status)); + this.status = status; + //notifying the parent + MonitorStatusEventBuilder.handleGroupStatusEvent(this.parent, this.status, this.id); + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/f00e2f36/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java index 04ed325..c76df01 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/checker/StatusChecker.java @@ -51,11 +51,14 @@ public class StatusChecker { /** * Calculating whether the cluster has all min instances as active and send the * ClusterActivatedEvent. + * * @param clusterId id of the cluster */ public void onMemberStatusChange(String clusterId) { ClusterMonitor monitor = (ClusterMonitor) AutoscalerContext.getInstance().getMonitor(clusterId); boolean clusterActive = clusterActive(monitor); + log.info("Status checker running for [cluster] " + clusterId + + " the status [clusterActive] " + clusterActive); // if active then notify upper layer if (clusterActive) { //send event to cluster status topic @@ -104,7 +107,7 @@ public class StatusChecker { } else { boolean clusterActive = clusterActive(monitor); - if(clusterActive) { + if (clusterActive) { //TODO evaluate life cycle //send clusterActive event to cluster status topic } @@ -127,7 +130,6 @@ public class StatusChecker { } /** - * * @param idOfChild * @param groupId * @param appId @@ -140,6 +142,7 @@ public class StatusChecker { /** * This will calculate whether the children of an application are active or not. If active, then * it will send the ApplicationActivatedEvent. + * * @param idOfChild * @param appId */ @@ -192,10 +195,9 @@ public class StatusChecker { } - - /** * This will use to calculate whether all children of a particular component is active by travesing Top + * * @param appId * @param id * @param groups @@ -211,8 +213,8 @@ public class StatusChecker { boolean childFound = false; boolean clusterFound = false; - for(ClusterDataHolder clusterDataHolder : clusterData.values()) { - if(clusterDataHolder.getClusterId().equals(id)) { + for (ClusterDataHolder clusterDataHolder : clusterData.values()) { + if (clusterDataHolder.getClusterId().equals(id)) { clusterFound = true; } } @@ -220,29 +222,29 @@ public class StatusChecker { if (clusterFound || groups.containsKey(id)) { childFound = true; if (!clusterData.isEmpty() && !groups.isEmpty()) { - if(log.isDebugEnabled()) { + if (log.isDebugEnabled()) { log.debug("group active found: " + clusterFound); } clustersActive = getClusterStatus(clusterData); groupsActive = getGroupStatus(groups); - if(log.isDebugEnabled()) { + if (log.isDebugEnabled()) { log.debug("Active cluster" + clustersActive + " and group: " + groupActive); } groupActive = clustersActive && groupsActive; } else if (!groups.isEmpty()) { groupsActive = getGroupStatus(groups); - if(log.isDebugEnabled()) { + if (log.isDebugEnabled()) { log.info("group active found: " + clusterFound); } groupActive = groupsActive; } else if (!clusterData.isEmpty()) { clustersActive = getClusterStatus(clusterData); - if(log.isDebugEnabled()) { + if (log.isDebugEnabled()) { log.debug("Active cluster" + clustersActive + " and group: " + groupActive); } groupActive = clustersActive; } else { - log.warn("Clusters/groups not found in this [component] "+ appId); + log.warn("Clusters/groups not found in this [component] " + appId); } //send the activation event if (parent instanceof Application && groupActive) {
