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);
     }
 }

Reply via email to