refactoring and fixing instance communication issue when having more than one instance
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/b8ecae23 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/b8ecae23 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/b8ecae23 Branch: refs/heads/master Commit: b8ecae23e97a31cb6c339ff03b55df022f96e0b4 Parents: f994da1 Author: reka <[email protected]> Authored: Tue Dec 16 14:47:08 2014 +0530 Committer: Udara Liyanage <[email protected]> Committed: Thu Dec 18 12:06:57 2014 +0530 ---------------------------------------------------------------------- .../parser/DefaultApplicationParser.java | 4 +- .../applications/topic/ApplicationBuilder.java | 106 ++++++++++--------- .../monitor/cluster/VMClusterMonitor.java | 4 +- .../monitor/component/GroupMonitor.java | 26 +++-- .../processor/group/GroupStatusProcessor.java | 4 +- .../group/GroupStatusProcessorChain.java | 5 +- 6 files changed, 82 insertions(+), 67 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/b8ecae23/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/parser/DefaultApplicationParser.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/parser/DefaultApplicationParser.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/parser/DefaultApplicationParser.java index fbde278..6d7db2b 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/parser/DefaultApplicationParser.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/parser/DefaultApplicationParser.java @@ -651,8 +651,8 @@ public class DefaultApplicationParser implements ApplicationParser { PayloadData payloadData = ApplicationUtils.createPayload(appId, groupName, cartridgeInfo, subscriptionKey, tenantId, clusterId, hostname, repoUrl, alias, null, dependencyAliases, properties); - //String oAuth_token = createToken(appId); - //payloadData.add(TOKEN_PAYLOD_PARAM_NAME, oAuth_token); + String oAuth_token = createToken(appId); + payloadData.add(TOKEN_PAYLOD_PARAM_NAME, oAuth_token); String textPayload = payloadData.toString(); http://git-wip-us.apache.org/repos/asf/stratos/blob/b8ecae23/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 6768fa9..e842a6e 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 @@ -141,8 +141,8 @@ public class ApplicationBuilder { } ApplicationStatus status = ApplicationStatus.Active; - ApplicationInstance context = application.getInstanceContexts(instanceId); - if (context.isStateTransitionValid(status)) { + ApplicationInstance applicationInstance = application.getInstanceContexts(instanceId); + if (applicationInstance.isStateTransitionValid(status)) { //setting the status, persist and publish application.setStatus(status, instanceId); updateApplicationMonitor(appId, status, instanceId); @@ -151,7 +151,7 @@ public class ApplicationBuilder { } else { log.warn(String.format("Application state transition is not valid: [application-id] %s " + " [instance-id] %s [current-status] %s [status-requested] %s", - appId, instanceId, context.getStatus(), status)); + appId, instanceId, applicationInstance.getStatus(), status)); } } @@ -171,8 +171,8 @@ public class ApplicationBuilder { } ApplicationStatus status = ApplicationStatus.Inactive; - ApplicationInstance context = application.getInstanceContexts(instanceId); - if (context.isStateTransitionValid(status)) { + ApplicationInstance applicationInstance = application.getInstanceContexts(instanceId); + if (applicationInstance.isStateTransitionValid(status)) { //setting the status, persist and publish application.setStatus(status, instanceId); updateApplicationMonitor(appId, status, instanceId); @@ -181,7 +181,7 @@ public class ApplicationBuilder { } else { log.warn(String.format("Application state transition is not valid: [application-id] %s " + " [instance-id] %s [current-status] %s [status-requested] %s", - appId, instanceId, context.getStatus(), status)); + appId, instanceId, applicationInstance.getStatus(), status)); } } @@ -241,15 +241,16 @@ public class ApplicationBuilder { log.warn("Application does not exist: [application-id] " + appId); } else { Application application = applications.getApplication(appId); - ApplicationInstance instance = application.getInstanceContexts(instanceId); + ApplicationInstance applicationInstance = application.getInstanceContexts(instanceId); ApplicationStatus status = ApplicationStatus.Terminated; - if (instance.isStateTransitionValid(status)) { + if (applicationInstance.isStateTransitionValid(status)) { //setting the status, persist and publish - instance.setStatus(status); + applicationInstance.setStatus(status); updateApplicationMonitor(appId, status, instanceId); ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance(). getAppMonitor(appId); - applicationMonitor.getNetworkPartitionContext(instance.getNetworkPartitionId()). + applicationMonitor.getNetworkPartitionContext(applicationInstance. + getNetworkPartitionId()). removeClusterApplicationContext(instanceId); applicationMonitor.removeInstance(instanceId); application.removeInstance(instanceId); @@ -313,12 +314,14 @@ public class ApplicationBuilder { return; } - GroupInstance context = group.getInstanceContexts(instanceId); + GroupInstance groupInstance = group.getInstanceContexts(instanceId); GroupStatus status = GroupStatus.Terminated; - if (context != null) { - if (context.isStateTransitionValid(status)) { + String parentId; + if (groupInstance != null) { + if (groupInstance.isStateTransitionValid(status)) { //setting the status, persist and publish - context.setStatus(status); + groupInstance.setStatus(status); + parentId = groupInstance.getParentId(); //removing the group instance and context GroupMonitor monitor = getGroupMonitor(appId, groupId); ApplicationMonitor applicationMonitor = AutoscalerContext.getInstance(). @@ -332,21 +335,21 @@ public class ApplicationBuilder { } } GroupLevelNetworkPartitionContext networkPartitionContext = - monitor.getNetworkPartitionContext(context.getNetworkPartitionId()); + monitor.getNetworkPartitionContext(groupInstance.getNetworkPartitionId()); networkPartitionContext.removeClusterGroupContext(instanceId); - if (context.getPartitionId() != null) { - networkPartitionContext.getPartitionCtxt(context.getPartitionId()). - removeActiveInstance(context); + if (groupInstance.getPartitionId() != null) { + networkPartitionContext.getPartitionCtxt(groupInstance.getPartitionId()). + removeActiveInstance(groupInstance); } monitor.removeInstance(instanceId); group.removeInstance(instanceId); ApplicationHolder.persistApplication(application); ApplicationsEventPublisher.sendGroupInstanceTerminatedEvent(appId, groupId, instanceId); - monitor.setStatus(status, instanceId); + monitor.setStatus(status, instanceId, parentId); } } else { log.warn("Group state transition is not valid: [group-id] " + groupId + - " [instance-id] " + instanceId + " [current-state] " + context.getStatus() + " [instance-id] " + instanceId + " [current-state] " + groupInstance.getStatus() + "[requested-state] " + status); } @@ -379,18 +382,18 @@ public class ApplicationBuilder { return; } - GroupInstance context = group.getInstanceContexts(instanceId); + GroupInstance groupInstance = group.getInstanceContexts(instanceId); GroupStatus status = GroupStatus.Active; - if (context != null) { - if (context.isStateTransitionValid(status)) { + if (groupInstance != null) { + if (groupInstance.isStateTransitionValid(status)) { //setting the status, persist and publish - context.setStatus(status); - updateGroupMonitor(appId, groupId, status, instanceId); + groupInstance.setStatus(status); + updateGroupMonitor(appId, groupId, status, instanceId, groupInstance.getParentId()); ApplicationHolder.persistApplication(application); ApplicationsEventPublisher.sendGroupInstanceActivatedEvent(appId, groupId, instanceId); } else { log.warn("Group state transition is not valid: [group-id] " + groupId + - " [instance-id] " + instanceId + " [current-state] " + context.getStatus() + " [instance-id] " + instanceId + " [current-state] " + groupInstance.getStatus() + "[requested-state] " + status); } @@ -404,7 +407,7 @@ public class ApplicationBuilder { String parentId, String networkPartitionId, String partitionId) { - GroupInstance instance = null; + GroupInstance groupInstance = null; ApplicationHolder.acquireWriteLock(); try { if (log.isDebugEnabled()) { @@ -417,14 +420,14 @@ public class ApplicationBuilder { if (application == null) { log.warn(String.format("Application %s does not exist", appId)); - return instance; + return groupInstance; } Group group = application.getGroupRecursively(groupId); if (group == null) { log.warn(String.format("Group %s does not exist when creating group", groupId)); - return instance; + return groupInstance; } GroupStatus status = GroupStatus.Created; @@ -441,15 +444,15 @@ public class ApplicationBuilder { if (!group.containsInstanceContext(instanceId)) { //setting the status, persist and publish - instance = new GroupInstance(groupId, instanceId); - instance.setParentId(parentId); - instance.setPartitionId(partitionId); - instance.setNetworkPartitionId(networkPartitionId); - instance.setStatus(status); - group.addInstance(instanceId, instance); + groupInstance = new GroupInstance(groupId, instanceId); + groupInstance.setParentId(parentId); + groupInstance.setPartitionId(partitionId); + groupInstance.setNetworkPartitionId(networkPartitionId); + groupInstance.setStatus(status); + group.addInstance(instanceId, groupInstance); //updateGroupMonitor(appId, groupId, status); ApplicationHolder.persistApplication(application); - ApplicationsEventPublisher.sendGroupInstanceCreatedEvent(appId, groupId, instance); + ApplicationsEventPublisher.sendGroupInstanceCreatedEvent(appId, groupId, groupInstance); } else { log.warn("Group Instance Context already exists: [group-id] " + groupId + " [Group-Instance-Id] " + instanceId); @@ -459,7 +462,7 @@ public class ApplicationBuilder { } - return instance; + return groupInstance; } @@ -485,18 +488,18 @@ public class ApplicationBuilder { return; } - GroupInstance context = group.getInstanceContexts(instanceId); + GroupInstance groupInstance = group.getInstanceContexts(instanceId); GroupStatus status = GroupStatus.Inactive; - if (context != null) { - if (context.isStateTransitionValid(status)) { + if (groupInstance != null) { + if (groupInstance.isStateTransitionValid(status)) { //setting the status, persist and publish - context.setStatus(status); - updateGroupMonitor(appId, groupId, status, instanceId); + groupInstance.setStatus(status); + updateGroupMonitor(appId, groupId, status, instanceId, groupInstance.getParentId()); ApplicationHolder.persistApplication(application); ApplicationsEventPublisher.sendGroupInstanceInactivateEvent(appId, groupId, instanceId); } else { log.warn("Group state transition is not valid: [group-id] " + groupId + - " [instance-id] " + instanceId + " [current-state] " + context.getStatus() + " [instance-id] " + instanceId + " [current-state] " + groupInstance.getStatus() + "[requested-state] " + status); } @@ -530,18 +533,18 @@ public class ApplicationBuilder { try { ApplicationHolder.acquireWriteLock(); - GroupInstance context = group.getInstanceContexts(instanceId); + GroupInstance groupInstance = group.getInstanceContexts(instanceId); GroupStatus status = GroupStatus.Terminating; - if (context != null) { - if (context.isStateTransitionValid(status)) { + if (groupInstance != null) { + if (groupInstance.isStateTransitionValid(status)) { //setting the status, persist and publish - context.setStatus(status); - updateGroupMonitor(appId, groupId, status, instanceId); + groupInstance.setStatus(status); + updateGroupMonitor(appId, groupId, status, instanceId, groupInstance.getParentId()); ApplicationHolder.persistApplication(application); ApplicationsEventPublisher.sendGroupInstanceTerminatingEvent(appId, groupId, instanceId); } else { log.warn("Group state transition is not valid: [group-id] " + groupId + - " [instance-id] " + instanceId + " [current-state] " + context.getStatus() + " [instance-id] " + instanceId + " [current-state] " + groupInstance.getStatus() + "[requested-state] " + status); } @@ -568,10 +571,11 @@ public class ApplicationBuilder { } - private static void updateGroupMonitor(String appId, String groupId, GroupStatus status, String instanceId) { + private static void updateGroupMonitor(String appId, String groupId, + GroupStatus status, String instanceId, String parentInstanceId) { GroupMonitor monitor = getGroupMonitor(appId, groupId); if (monitor != null) { - monitor.setStatus(status, instanceId); + monitor.setStatus(status, instanceId, parentInstanceId); } else { log.warn("Group monitor cannot be found: [group-id] " + groupId + " [application-id] " + appId); http://git-wip-us.apache.org/repos/asf/stratos/blob/b8ecae23/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java index 7d8f2b4..3ee14d2 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/cluster/VMClusterMonitor.java @@ -369,8 +369,8 @@ public class VMClusterMonitor extends AbstractClusterMonitor { if (statusEvent.getStatus() == GroupStatus.Terminating || statusEvent.getStatus() == ApplicationStatus.Terminating) { if (log.isInfoEnabled()) { - log.info("Publishing Cluster terminating event for [application]: " + appId + - " [cluster]: " + this.getClusterId()); + log.info("Publishing Cluster terminating event for [application] " + appId + + " [cluster] " + this.getClusterId() + " [instance] " + instanceId); } ClusterStatusEventPublisher.sendClusterTerminatingEvent(getAppId(), getServiceId(), getClusterId(), instanceId); } http://git-wip-us.apache.org/repos/asf/stratos/blob/b8ecae23/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 0052f647..6c487a7 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 @@ -140,7 +140,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable { * * @param status status of the group */ - public void setStatus(GroupStatus status, String instanceId) { + public void setStatus(GroupStatus status, String instanceId, String parentInstanceId) { GroupInstance groupInstance = (GroupInstance) this.instanceIdToInstanceMap.get(instanceId); if (groupInstance == null) { if (status != GroupStatus.Terminated) { @@ -151,8 +151,7 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable { groupInstance.setStatus(status); } } - // notify parent - log.info("[Group] " + this.id + "is notifying the [parent] " + this.parent.getId()); + if (this.isGroupScalingEnabled()) { try { ApplicationHolder.acquireReadLock(); @@ -164,14 +163,20 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable { Group group = application.getGroupRecursively(this.id); if (group != null) { GroupInstance context = group.getInstanceContexts(instanceId); + // notify parent + log.info("[Group] " + this.id + "is notifying the [parent] " + this.parent.getId() + + " [instance] " + context.getParentId()); MonitorStatusEventBuilder.handleGroupStatusEvent(this.parent, - status, this.id, context.getParentId()); + status, this.id, parentInstanceId); } } } finally { ApplicationHolder.releaseReadLock(); } } else { + // notify parent + log.info("[Group] " + this.id + "is notifying the [parent] " + this.parent.getId() + + " [instance] " + instanceId); MonitorStatusEventBuilder.handleGroupStatusEvent(this.parent, status, this.id, instanceId); } @@ -265,12 +270,21 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable { //Get all the instances which related to this instanceId GroupInstance instance = (GroupInstance) this.instanceIdToInstanceMap.get(instanceId); if (instance != null) { + if (log.isInfoEnabled()) { + log.info("Publishing Cluster terminating event for [application] " + appId + + " [group] " + id + " [instance] " + instanceId); + } ApplicationBuilder.handleGroupTerminatingEvent(appId, id, instanceId); } else { - //Using parentId need to get the children + //Using parentId need to get the all the children and ask them to terminate + // as they can't exist without the parent List<String> instanceIds = this.getInstancesByParentInstanceId(instanceId); if (!instanceIds.isEmpty()) { for (String instanceId1 : instanceIds) { + if (log.isInfoEnabled()) { + log.info("Publishing Cluster terminating event for [application] " + appId + + " [group] " + id + " [instance] " + instanceId1); + } ApplicationBuilder.handleGroupTerminatingEvent(appId, id, instanceId1); } } @@ -278,8 +292,6 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable { } } else if (statusEvent.getStatus() == ClusterStatus.Created || statusEvent.getStatus() == GroupStatus.Created) { - Application application = ApplicationHolder.getApplications().getApplication(this.appId); - Group group = application.getGroupRecursively(statusEvent.getId()); //starting a new instance of this monitor createInstanceOnDemand(statusEvent.getInstanceId()); } http://git-wip-us.apache.org/repos/asf/stratos/blob/b8ecae23/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 057b57c..a22c265 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 @@ -115,8 +115,8 @@ public abstract class GroupStatusProcessor extends StatusProcessor { Cluster cluster = service.getCluster(clusterId); ClusterInstance context = cluster.getInstanceContexts(instanceId); if (context != null) { - if(log.isInfoEnabled()) { - log.info("Checking the status of cluster " + clusterId + " instance status is: " + + if(log.isDebugEnabled()) { + log.debug("Checking the status of cluster " + clusterId + " instance status is: " + context.getStatus().toString()); } if(context.getStatus() == status) { http://git-wip-us.apache.org/repos/asf/stratos/blob/b8ecae23/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessorChain.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessorChain.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessorChain.java index d522738..f43d2bd 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessorChain.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/group/GroupStatusProcessorChain.java @@ -57,11 +57,10 @@ public class GroupStatusProcessorChain extends StatusProcessorChain { if (root == null) { throw new RuntimeException("Message processor chain is not initialized"); } - if (log.isInfoEnabled()) { - log.info("GroupProcessor chain calculating the status for the group " + + if (log.isDebugEnabled()) { + log.debug("GroupProcessor chain calculating the status for the group " + "[ " + idOfComponent + " ]"); } - root.process(idOfComponent, appId, instanceId); } }
