You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by re...@apache.org on 2015/04/28 21:05:10 UTC

[4/5] stratos git commit: fixing scale down issue with Groups and refactoring

fixing scale down issue with Groups and refactoring


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/5e79bbfa
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/5e79bbfa
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/5e79bbfa

Branch: refs/heads/master
Commit: 5e79bbfa4a7b7f9f01d237bd59cfba403631ad5e
Parents: 6087244
Author: reka <rt...@gmail.com>
Authored: Tue Apr 28 23:54:08 2015 +0530
Committer: reka <rt...@gmail.com>
Committed: Wed Apr 29 00:05:46 2015 +0530

----------------------------------------------------------------------
 .../autoscaler/monitor/EventHandler.java        |  3 +-
 .../stratos/autoscaler/monitor/Monitor.java     | 12 ++--
 .../monitor/component/ApplicationMonitor.java   | 21 ++++--
 .../monitor/component/GroupMonitor.java         | 68 +++-----------------
 .../component/ParentComponentMonitor.java       | 56 +++++++++++++++-
 5 files changed, 87 insertions(+), 73 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/5e79bbfa/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/EventHandler.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/EventHandler.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/EventHandler.java
index d5be50d..e7edd1e 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/EventHandler.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/EventHandler.java
@@ -38,6 +38,7 @@ public interface EventHandler {
      * Triggered when a status event is received from the parent.
      *
      * @param statusEvent
+     * @throws MonitorNotFoundException
      */
     public abstract void onParentStatusEvent(MonitorStatusEvent statusEvent) throws
             MonitorNotFoundException;
@@ -45,7 +46,7 @@ public interface EventHandler {
     /**
      * Triggered when a scaling event is received from a child.
      *
-     * @param scalingEvent
+     * @param scalingEvent the event which passed when scaling
      */
     public abstract void onChildScalingEvent(ScalingEvent scalingEvent);
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/5e79bbfa/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 0a9d7f1..b5f5997 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
@@ -51,7 +51,7 @@ public abstract class Monitor implements EventHandler {
     }
 
     /**
-     * This will destroy the monitor thread
+     * Implement this method to destroy the monitor thread
      */
     public abstract void destroy();
 
@@ -141,7 +141,7 @@ public abstract class Monitor implements EventHandler {
      * @param hasDependent whether monitor has dependent or not
      */
     public void setHasStartupDependents(boolean hasDependent) {
-        this.hasStartupDependents = hasDependent;
+        hasStartupDependents = hasDependent;
     }
 
     /**
@@ -150,7 +150,7 @@ public abstract class Monitor implements EventHandler {
      * @param instance instance to be added
      */
     public void addInstance(Instance instance) {
-        this.instanceIdToInstanceMap.put(instance.getInstanceId(), instance);
+        instanceIdToInstanceMap.put(instance.getInstanceId(), instance);
 
     }
 
@@ -161,7 +161,7 @@ public abstract class Monitor implements EventHandler {
      * @return the instance
      */
     public Instance getInstance(String instanceId) {
-        return this.instanceIdToInstanceMap.get(instanceId);
+        return instanceIdToInstanceMap.get(instanceId);
     }
 
     /**
@@ -170,7 +170,7 @@ public abstract class Monitor implements EventHandler {
      * @param instanceId instance id
      */
     public void removeInstance(String instanceId) {
-        this.instanceIdToInstanceMap.remove(instanceId);
+        instanceIdToInstanceMap.remove(instanceId);
     }
 
     /**
@@ -181,7 +181,7 @@ public abstract class Monitor implements EventHandler {
      */
     public List<String> getInstancesByParentInstanceId(String parentInstanceId) {
         List<String> instances = new ArrayList<String>();
-        for (Instance instance : this.instanceIdToInstanceMap.values()) {
+        for (Instance instance : instanceIdToInstanceMap.values()) {
             if (instance.getParentId().equals(parentInstanceId)) {
                 instances.add(instance.getInstanceId());
             }

http://git-wip-us.apache.org/repos/asf/stratos/blob/5e79bbfa/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 c097b2b..072ffbb 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
@@ -70,7 +70,7 @@ public class ApplicationMonitor extends ParentComponentMonitor {
     //Flag to set whether application is terminating
     private boolean isTerminating;
 
-    // Flag to set if forcefull undeployment is invoked for the application.
+    // Flag to set if forceful undeployment is invoked for the application.
     private boolean force;
 
     public ApplicationMonitor(Application application) throws DependencyBuilderException,
@@ -221,10 +221,10 @@ public class ApplicationMonitor extends ParentComponentMonitor {
 
         for (Monitor monitor : monitors.values()) {
             if (monitor instanceof ParentComponentMonitor) {
-                Monitor monitor1 = findGroupMonitor(id, ((ParentComponentMonitor) monitor).
+                Monitor groupMonitor = findGroupMonitor(id, ((ParentComponentMonitor) monitor).
                         getAliasToActiveMonitorsMap());
-                if (monitor1 != null) {
-                    return monitor1;
+                if (groupMonitor != null) {
+                    return groupMonitor;
                 }
             }
         }
@@ -287,7 +287,17 @@ public class ApplicationMonitor extends ParentComponentMonitor {
                     ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(this.id,
                             appId, instanceId);
                 } else {
-                    onChildTerminatedEvent(childId, instanceId);
+                    Monitor monitor = this.getMonitor(childId);
+                    boolean active = false;
+                    if (monitor instanceof GroupMonitor) {
+                        active = verifyGroupStatus(childId, instanceId, GroupStatus.Active);
+                    }
+                    if (!active) {
+                        onChildTerminatedEvent(childId, instanceId);
+                    } else {
+                        log.info("[Group Instance] " + instanceId + " is still active " +
+                                "upon termination of the [child ] " + childId);
+                    }
                 }
             } else {
                 log.warn("The required instance cannot be found in the the [GroupMonitor] " +
@@ -548,6 +558,7 @@ public class ApplicationMonitor extends ParentComponentMonitor {
 
     /**
      * Whether application is in-terminating or not
+     *
      * @return application state
      */
     public boolean isTerminating() {

http://git-wip-us.apache.org/repos/asf/stratos/blob/5e79bbfa/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 426c169..980503f 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
@@ -48,7 +48,6 @@ import org.apache.stratos.messaging.domain.application.Application;
 import org.apache.stratos.messaging.domain.application.ApplicationStatus;
 import org.apache.stratos.messaging.domain.application.Group;
 import org.apache.stratos.messaging.domain.application.GroupStatus;
-import org.apache.stratos.messaging.domain.instance.ApplicationInstance;
 import org.apache.stratos.messaging.domain.instance.GroupInstance;
 import org.apache.stratos.messaging.domain.instance.Instance;
 import org.apache.stratos.messaging.domain.topology.ClusterStatus;
@@ -159,7 +158,7 @@ public class GroupMonitor extends ParentComponentMonitor {
                                 int activeAppInstances = appMonitor.
                                         getNetworkPartitionContext(networkPartitionContext.getId()).
                                         getActiveInstancesCount();
-                                if(activeAppInstances > 0) {
+                                if (activeAppInstances > 0) {
                                     //Creating new group instance based on the existing parent instances
                                     createInstanceOnDemand(parentInstanceContext.getId());
                                 }
@@ -413,16 +412,7 @@ public class GroupMonitor extends ParentComponentMonitor {
         } else if (status1 == ClusterStatus.Terminated || status1 == GroupStatus.Terminated) {
             //Verifying whether all the minimum no of instances of child
             // became active to take next action
-            if (status1 == GroupStatus.Terminated) {
-                /*boolean childTerminated = verifyGroupStatus(instanceId, (GroupStatus) status1);
-                if (childTerminated) {*/
-                onTerminationOfInstance(childId, instanceId);
-                /*} else {
-                    log.info("Waiting for other group instances to be terminated");
-                }*/
-            } else {
-                onTerminationOfInstance(childId, instanceId);
-            }
+            onTerminationOfInstance(childId, instanceId);
         }
     }
 
@@ -438,7 +428,13 @@ public class GroupMonitor extends ParentComponentMonitor {
                 ServiceReferenceHolder.getInstance().getGroupStatusProcessorChain().process(id,
                         appId, instanceId);
             } else {
-                onChildTerminatedEvent(childId, instanceId);
+                boolean active = verifyGroupStatus(childId, instanceId, GroupStatus.Active);
+                if (!active) {
+                    onTerminationOfInstance(childId, instanceId);
+                } else {
+                    log.info("[Group Instance] " + instanceId + " is still active upon termination" +
+                            " of the [child] " + childId);
+                }
             }
         } else {
             log.warn("The required instance cannot be found in the the [GroupMonitor] " +
@@ -916,52 +912,6 @@ public class GroupMonitor extends ParentComponentMonitor {
     }
 
 
-    public boolean verifyGroupStatus(String childId, String instanceId, GroupStatus requiredStatus) {
-        Monitor monitor = this.getMonitor(childId);
-        List<String> groupInstances;
-        GroupInstance groupInstance = (GroupInstance) monitor.getInstance(instanceId);
-        if (groupInstance == null) {
-            groupInstances = monitor.getInstancesByParentInstanceId(instanceId);
-        } else {
-            if (groupInstance.getStatus() == requiredStatus) {
-                return true;
-            } else {
-                return false;
-            }
-        }
-
-        String networkPartitionId = null;
-        int noOfInstancesOfRequiredStatus = 0;
-        for (String childInstanceId : groupInstances) {
-            GroupInstance childGroupInstance = (GroupInstance) monitor.getInstance(childInstanceId);
-            networkPartitionId = childGroupInstance.getNetworkPartitionId();
-            if (childGroupInstance.getStatus() == requiredStatus) {
-                noOfInstancesOfRequiredStatus++;
-            }
-        }
-
-        if (!groupInstances.isEmpty()) {
-            GroupLevelNetworkPartitionContext networkPartitionContext =
-                    (GroupLevelNetworkPartitionContext) this.getNetworkPartitionCtxts().
-                            get(networkPartitionId);
-            int minInstances = networkPartitionContext.getMinInstanceCount();
-            //if terminated all the instances in this instances map should be in terminated state
-            //if terminated all the instances in this instances map should be in terminated state
-            if (noOfInstancesOfRequiredStatus == this.inactiveInstancesMap.size() &&
-                    requiredStatus == GroupStatus.Terminated) {
-                return true;
-            } else if (noOfInstancesOfRequiredStatus >= minInstances) {
-                return true;
-            } else {
-                //of only one is inActive implies that the whole group is Inactive
-                if (requiredStatus == GroupStatus.Inactive && noOfInstancesOfRequiredStatus >= 1) {
-                    return true;
-                }
-            }
-
-        }
-        return false;
-    }
 
 
     @Override

http://git-wip-us.apache.org/repos/asf/stratos/blob/5e79bbfa/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 6b69065..8c25447 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
@@ -29,6 +29,7 @@ import org.apache.stratos.autoscaler.applications.dependency.DependencyTree;
 import org.apache.stratos.autoscaler.applications.dependency.context.ApplicationChildContext;
 import org.apache.stratos.autoscaler.applications.topic.ApplicationBuilder;
 import org.apache.stratos.autoscaler.context.InstanceContext;
+import org.apache.stratos.autoscaler.context.partition.network.GroupLevelNetworkPartitionContext;
 import org.apache.stratos.autoscaler.context.partition.network.NetworkPartitionContext;
 import org.apache.stratos.autoscaler.event.publisher.ClusterStatusEventPublisher;
 import org.apache.stratos.autoscaler.exception.application.DependencyBuilderException;
@@ -51,6 +52,7 @@ import org.apache.stratos.messaging.domain.application.GroupStatus;
 import org.apache.stratos.messaging.domain.application.ParentComponent;
 import org.apache.stratos.messaging.domain.application.ScalingDependentList;
 import org.apache.stratos.messaging.domain.instance.ClusterInstance;
+import org.apache.stratos.messaging.domain.instance.GroupInstance;
 import org.apache.stratos.messaging.domain.topology.ClusterStatus;
 import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
 
@@ -517,10 +519,9 @@ public abstract class ParentComponentMonitor extends Monitor implements Runnable
                 Monitor monitor = this.aliasToActiveMonitorsMap.get(context1.getId());
 
                 if (monitor instanceof GroupMonitor) {
-                    GroupMonitor monitor1 = (GroupMonitor) monitor;
                     try {
                         ApplicationHolder.acquireReadLock();
-                        if (monitor1.verifyGroupStatus(context1.getId(), instanceId, GroupStatus.Active)) {
+                        if (verifyGroupStatus(context1.getId(), instanceId, GroupStatus.Active)) {
                             parentsActive = true;
 
                         }
@@ -547,6 +548,57 @@ public abstract class ParentComponentMonitor extends Monitor implements Runnable
         return parentsActive;
     }
 
+    public boolean verifyGroupStatus(String childId, String instanceId, GroupStatus requiredStatus) {
+        Monitor monitor = this.getMonitor(childId);
+        if(!(monitor instanceof GroupMonitor)) {
+            return false;
+        }
+        List<String> groupInstances;
+        GroupInstance groupInstance = (GroupInstance) monitor.getInstance(instanceId);
+        if (groupInstance == null) {
+            groupInstances = monitor.getInstancesByParentInstanceId(instanceId);
+        } else {
+            if (groupInstance.getStatus() == requiredStatus) {
+                return true;
+            } else {
+                return false;
+            }
+        }
+
+        String networkPartitionId = null;
+        int noOfInstancesOfRequiredStatus = 0;
+        for (String childInstanceId : groupInstances) {
+            GroupInstance childGroupInstance = (GroupInstance) monitor.getInstance(childInstanceId);
+            networkPartitionId = childGroupInstance.getNetworkPartitionId();
+            if (childGroupInstance.getStatus() == requiredStatus) {
+                noOfInstancesOfRequiredStatus++;
+            }
+        }
+
+        if (!groupInstances.isEmpty()) {
+                GroupLevelNetworkPartitionContext networkPartitionContext =
+                    (GroupLevelNetworkPartitionContext) ((GroupMonitor)monitor).
+                            getNetworkPartitionCtxts().get(networkPartitionId);
+            int minInstances = networkPartitionContext.getMinInstanceCount();
+            //if terminated all the instances in this instances map should be in terminated state
+            //if terminated all the instances in this instances map should be in terminated state
+            if (noOfInstancesOfRequiredStatus == this.inactiveInstancesMap.size() &&
+                    requiredStatus == GroupStatus.Terminated) {
+                return true;
+            } else if (noOfInstancesOfRequiredStatus >= minInstances) {
+                return true;
+            } else {
+                //of only one is inActive implies that the whole group is Inactive
+                if (requiredStatus == GroupStatus.Inactive && noOfInstancesOfRequiredStatus >= 1) {
+                    return true;
+                }
+            }
+
+        }
+        return false;
+    }
+
+
     protected void handleDependentScaling(InstanceContext instanceContext,
                                           NetworkPartitionContext networkPartitionContext) {
         /**