You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by sa...@apache.org on 2014/12/12 14:43:03 UTC

[2/2] stratos git commit: Dependent scaling related changes.

Dependent scaling related changes.


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

Branch: refs/heads/4.1.0-test
Commit: 1ee24837736a28465beda7a44b884aab309d8904
Parents: 23087d1
Author: sajhak <sa...@gmail.com>
Authored: Fri Dec 12 19:08:25 2014 +0530
Committer: sajhak <sa...@gmail.com>
Committed: Fri Dec 12 19:12:04 2014 +0530

----------------------------------------------------------------------
 .../autoscaler/api/AutoScalerServiceImpl.java   |  10 +-
 .../dependency/DependencyBuilder.java           |  96 ++----
 .../parser/DefaultApplicationParser.java        |   1 +
 .../context/cluster/ClusterInstanceContext.java |  13 +-
 .../context/cluster/VMClusterContext.java       |  35 +-
 .../AutoscalerTopologyEventReceiver.java        |   4 +-
 .../autoscaler/monitor/MonitorFactory.java      |   7 +-
 .../monitor/cluster/VMClusterMonitor.java       |   2 +-
 .../monitor/component/GroupMonitor.java         |  30 +-
 .../component/ParentComponentMonitor.java       |   9 +-
 .../stratos/autoscaler/pojo/Dependencies.java   |  15 +-
 .../autoscaler/rule/RuleTasksDelegator.java     |   3 +
 .../definitions/DependencyDefinitions.java      |  15 +-
 .../deployer/DefaultServiceGroupDeployer.java   |  12 +-
 .../domain/applications/DependencyOrder.java    |  16 +-
 .../src/main/conf/drools/scaling.drl            |   9 +-
 .../src/main/resources/AutoScalerService.wsdl   | 344 +++++++++----------
 17 files changed, 308 insertions(+), 313 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/1ee24837/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
index 41d027f..66f6be8 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
@@ -341,15 +341,15 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface {
                     log.debug("StartupOrder: is null");
                 }
             }
-            String[] scalingOrders = dependencies.getScalingOrders();
+            String[] scalingDependents = dependencies.getScalingDependants();
 
             if (log.isDebugEnabled()) {
-                log.debug("ScalingOrders " + scalingOrders);
+                log.debug("ScalingDependent " + scalingDependents);
 
-                if (scalingOrders != null) {
-                    log.debug("ScalingOrder:size " + scalingOrders.length);
+                if (scalingDependents != null) {
+                    log.debug("ScalingDependents:size " + scalingDependents.length);
                 } else {
-                    log.debug("ScalingOrder: is null");
+                    log.debug("ScalingDependent: is null");
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/stratos/blob/1ee24837/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java
index 7c9f792..745aaa5 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/dependency/DependencyBuilder.java
@@ -27,6 +27,7 @@ import org.apache.stratos.autoscaler.exception.application.DependencyBuilderExce
 import org.apache.stratos.messaging.domain.applications.*;
 
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.Set;
 
 /**
@@ -131,69 +132,7 @@ public class DependencyBuilder {
                 }
             }
 
-            //Parsing the scaling order
-            Set<ScalingDependentList> scalingDependentLists = dependencyOrder.getScalingDependentLists();
-
-            if (scalingDependentLists != null) {
-                for (ScalingDependentList scalingDependentList : scalingDependentLists) {
-                    foundContext = null;
-                    parentContext = null;
-
-
-                    for (String scalingOrderComponent : scalingDependentList.getScalingDependentListComponents()) {
-
-
-                        if (scalingOrderComponent != null){
-                            String applicationContextId = null;
-                            if (scalingOrderComponent.startsWith(Constants.GROUP + ".")) {
-                                //getting the group alias
-                                applicationContextId = getGroupFromStartupOrder(scalingOrderComponent);
-
-                            } else if (scalingOrderComponent.startsWith(Constants.CARTRIDGE + ".")) {
-                                //getting the cluster alias
-                                applicationContextId = getClusterFromStartupOrder(scalingOrderComponent);
-
-                            } else {
-                                log.warn("[Scaling Order]: " + scalingOrderComponent + " contains unknown reference");
-                            }
-
-                            if(applicationContextId != null) {
-                                ApplicationChildContext applicationContext
-                                         = dependencyTree.findApplicationContextWithIdInPrimaryTree(applicationContextId);
-
-                                ApplicationChildContext existingApplicationContext =
-                                        dependencyTree.findApplicationContextWithIdInScalingDependencyTree(applicationContextId);
-                                if (existingApplicationContext == null) {
-
-                                    if (parentContext != null) {
-
-                                        parentContext.setGroupScalingEnabled(true);
-                                        //appending the scaling order to already added parent group/cluster
-                                        parentContext.addApplicationContext(applicationContext);
-                                        parentContext = applicationContext;
-                                        if (log.isDebugEnabled()) {
-                                            log.debug("Found an existing [dependency] " + parentContext.getId() +
-                                                    " and adding the [dependency] " + applicationContextId + " as the child");
-                                        }
-                                    } else {
-                                        //adding list of scaling order to the dependency tree
-                                        dependencyTree.addScalingApplicationContext(applicationContext);
-                                        parentContext = applicationContext;
-                                    }
-                                } else {
-                                    String msg = "Scaling order is not consistent. It contains the group/cluster " +
-                                            "which has been already used in another scaling order";
-                                    throw new DependencyBuilderException(msg);
-
-                                }
-                            }
-                        }
-                    }
-
-
-                }
-            }
-
+            
         }
 
         //adding the rest of the children who are independent to the top level
@@ -216,6 +155,36 @@ public class DependencyBuilder {
         }
         return dependencyTree;
     }
+    
+    /**
+     * 
+     * Utility method to build scaling dependencies
+     * 
+     */
+	public Set<String> buildScalingDependencies(ParentComponent component) {
+		log.info(" ******* in build scaling dependencies ************ "); // TODO - remove
+		Set<String> scalingDependencies = new HashSet<String>();
+		if(component.getDependencyOrder() != null && component.getDependencyOrder().getScalingDependents() != null) {
+			log.info(" ******* in build scaling dependencies 22 ************ "); // TODO - remove
+		for (String string : component.getDependencyOrder().getScalingDependents()) {
+	    
+			log.info(" ******* in build scaling dependencies 33 ************ "); // TODO - remove
+		        if (string.startsWith(Constants.GROUP + ".")) {
+		            //getting the group alias            
+		            scalingDependencies.add(getGroupFromStartupOrder(string));
+		        } else if (string.startsWith(Constants.CARTRIDGE + ".")) {
+		            //getting the cluster alias
+		            String id = getClusterFromStartupOrder(string);
+		            //getting the cluster-id from cluster alias
+		            ClusterDataHolder clusterDataHolder = (ClusterDataHolder) component.getClusterDataMap().get(id);
+		            scalingDependencies.add(clusterDataHolder.getClusterId());
+		        } else {
+		            log.warn("[Scaling Dependency]: " + string + " contains unknown reference");
+		        }
+        }
+		}
+	    return scalingDependencies;
+    }
 
     /**
      * Utility method to get the group alias from the startup order Eg: group.mygroup
@@ -238,4 +207,5 @@ public class DependencyBuilder {
     }
 
 
+
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/1ee24837/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 eaaf19e..364274c 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
@@ -453,6 +453,7 @@ public class DefaultApplicationParser implements ApplicationParser {
             dependencyOrder.setStartupOrders(ParserUtils.convert(startupOrders, groupCtxt));
         }
         dependencyOrder.setTerminationBehaviour(getKillbehaviour(groupCtxt.getName(),serviceGroup));
+        //dependencyOrder.setScalingDependents(scalingDependents);
         group.setDependencyOrder(dependencyOrder);
 
         Map<String, ClusterDataHolder> clusterDataMap;

http://git-wip-us.apache.org/repos/asf/stratos/blob/1ee24837/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterInstanceContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterInstanceContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterInstanceContext.java
index ae63615..884c25e 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterInstanceContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/ClusterInstanceContext.java
@@ -64,9 +64,12 @@ public class ClusterInstanceContext extends InstanceContext {
     private int currentPartitionIndex;
 
     private String networkPartitionId;
+    
+    private boolean hasScalingDependants;
 
     public ClusterInstanceContext(String clusterInstanceId, String partitionAlgo,
-                                  int min, int max, String networkPartitionId) {
+                                  int min, int max, String networkPartitionId,
+                                  boolean hasScalingDependants) {
 
         super(clusterInstanceId);
         this.networkPartitionId = networkPartitionId;
@@ -80,8 +83,7 @@ public class ClusterInstanceContext extends InstanceContext {
         memoryConsumption = new MemoryConsumption();
         requiredInstanceCountBasedOnStats = minInstanceCount;
         requiredInstanceCountBasedOnDependencies = minInstanceCount;
-
-
+        this.hasScalingDependants = hasScalingDependants;
     }
 
     public List<ClusterLevelPartitionContext> getPartitionCtxts() {
@@ -459,4 +461,9 @@ public class ClusterInstanceContext extends InstanceContext {
     public boolean isAverageRequestServedPerInstanceReset() {
         return averageRequestServedPerInstanceReset;
     }
+
+	public boolean isHasScalingDependants() {
+		return hasScalingDependants;
+	}
+   
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/1ee24837/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
index 0c1931e..fba52ac 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
@@ -18,6 +18,9 @@
  */
 package org.apache.stratos.autoscaler.context.cluster;
 
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.autoscaler.applications.ApplicationHolder;
@@ -41,16 +44,14 @@ import org.apache.stratos.messaging.domain.topology.Cluster;
 import org.apache.stratos.messaging.domain.topology.Member;
 import org.apache.stratos.messaging.domain.topology.MemberStatus;
 
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
 /*
  * It holds the runtime data of a VM cluster
  */
 public class VMClusterContext extends AbstractClusterContext {
 
-    private static final Log log = LogFactory.getLog(VMClusterContext.class);
+    private static final long serialVersionUID = 17570842529682141L;
+
+	private static final Log log = LogFactory.getLog(VMClusterContext.class);
 
     // Map<NetworkpartitionId, Network Partition Context>
     protected Map<String, ClusterLevelNetworkPartitionContext> networkPartitionCtxts;
@@ -120,7 +121,7 @@ public class VMClusterContext extends AbstractClusterContext {
         return null;
     }
 
-    public void addInstanceContext(String instanceId, Cluster cluster)
+    public void addInstanceContext(String instanceId, Cluster cluster, boolean hasGroupScalingDependent)
             throws PolicyValidationException, PartitionValidationException {
         ClusterLevelNetworkPartitionContext networkPartitionContext = null;
         ClusterInstance clusterInstance = cluster.getInstanceContexts(instanceId);
@@ -147,10 +148,10 @@ public class VMClusterContext extends AbstractClusterContext {
         if (clusterInstance.getPartitionId() != null) {
             //Need to add partition Context based on the given one from the parent
             networkPartitionContext = addPartition(clusterInstance, cluster,
-                    networkPartitionContext, null);
+                    networkPartitionContext, null, hasGroupScalingDependent);
         } else {
             networkPartitionContext = parseDeploymentPolicy(clusterInstance, cluster,
-                    policy, networkPartitionContext);
+                    policy, networkPartitionContext, hasGroupScalingDependent);
         }
         if (!networkPartitionCtxts.containsKey(clusterInstance.getNetworkPartitionId())) {
             this.networkPartitionCtxts.put(clusterInstance.getNetworkPartitionId(),
@@ -168,7 +169,8 @@ public class VMClusterContext extends AbstractClusterContext {
             ClusterInstance clusterInstance,
             Cluster cluster,
             ChildPolicy childPolicy,
-            ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext)
+            ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext,
+            boolean hasGroupScalingDependent)
             throws PolicyValidationException, PartitionValidationException {
 
         if (childPolicy == null) {
@@ -197,16 +199,10 @@ public class VMClusterContext extends AbstractClusterContext {
         ChildLevelNetworkPartition networkPartition;
         networkPartition = childPolicy.
                 getChildLevelNetworkPartition(clusterInstance.getNetworkPartitionId());
-        if (clusterLevelNetworkPartitionContext == null) {
-            clusterLevelNetworkPartitionContext = new ClusterLevelNetworkPartitionContext(
-                    networkPartition.getId(),
-                    networkPartition.getPartitionAlgo(),
-                    networkPartition.getMin());
-        }
-
+        
         //Fill cluster instance context with child level partitions
         for (ChildLevelPartition childLevelPartition : networkPartition.getChildLevelPartitions()) {
-            addPartition(clusterInstance, cluster, clusterLevelNetworkPartitionContext, childLevelPartition);
+            addPartition(clusterInstance, cluster, clusterLevelNetworkPartitionContext, childLevelPartition, hasGroupScalingDependent);
         }
         return clusterLevelNetworkPartitionContext;
     }
@@ -215,7 +211,8 @@ public class VMClusterContext extends AbstractClusterContext {
             ClusterInstance clusterInstance,
             Cluster cluster,
             ClusterLevelNetworkPartitionContext clusterLevelNetworkPartitionContext,
-            ChildLevelPartition childLevelPartition)
+            ChildLevelPartition childLevelPartition,
+            boolean hasGroupScalingDependent)
             throws PolicyValidationException, PartitionValidationException {
         if (clusterLevelNetworkPartitionContext == null) {
             String msg =
@@ -256,7 +253,7 @@ public class VMClusterContext extends AbstractClusterContext {
             }
             clusterInstanceContext = new ClusterInstanceContext(clusterInstance.getInstanceId(),
                     clusterLevelNetworkPartitionContext.getPartitionAlgorithm(),
-                    minInstances, maxInstances, nPartitionId);
+                    minInstances, maxInstances, nPartitionId, hasGroupScalingDependent);
         }
         String partitionId;
         if (childLevelPartition != null) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/1ee24837/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java
index b1217db..8b41824 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java
@@ -453,7 +453,9 @@ public class AutoscalerTopologyEventReceiver {
                                         clusterMonitor.setClusterContext(clusterContext);
 
                                     }
-                                    clusterContext.addInstanceContext(instanceId, cluster);
+                                    log.info(" Cluster monitor has scaling dependents"
+                                    		+ "  ["+clusterMonitor.hasGroupScalingDependent()+"] "); // TODO -- remove this log..
+                                    clusterContext.addInstanceContext(instanceId, cluster, clusterMonitor.hasGroupScalingDependent());
                                     if (clusterMonitor.getInstance(instanceId) == null) {
                                         // adding the same instance in topology to monitor as a reference
                                         ClusterInstance clusterInstance1 = cluster.getInstanceContexts(instanceId);

http://git-wip-us.apache.org/repos/asf/stratos/blob/1ee24837/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
index 5ee986b..3f83741 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
@@ -125,13 +125,14 @@ public class MonitorFactory {
                     groupMonitor.setHasStartupDependents(false);
                 }
             }
+            
+                       
             if (group.isGroupScalingEnabled()) {
                 groupMonitor.setGroupScalingEnabled(true);
             } else if (parentMonitor instanceof GroupMonitor) {
-                if (((GroupMonitor) parentMonitor).isGroupScalingEnabled() ||
-                        parentMonitor.hasGroupScalingDependent()) {
+                /*if (parentMonitor.hasGroupScalingDependent() || parentMonitor.getList --> not empty) {
                     groupMonitor.setHasGroupScalingDependent(true);
-                }
+                }*/
             }
         } finally {
             ApplicationHolder.releaseReadLock();

http://git-wip-us.apache.org/repos/asf/stratos/blob/1ee24837/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 9ebd24f..bd841ba 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
@@ -1148,7 +1148,7 @@ public class VMClusterMonitor extends AbstractClusterMonitor {
                 }
 
                 // create VMClusterContext and then add all the instanceContexts
-                clusterContext.addInstanceContext(parentInstanceId, cluster);
+                clusterContext.addInstanceContext(parentInstanceId, cluster, this.hasGroupScalingDependent());
                 if (this.getInstance(clusterInstance.getInstanceId()) == null) {
                     this.addInstance(clusterInstance);
                 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/1ee24837/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 35cb6c5..0928e93 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
@@ -52,9 +52,11 @@ import org.apache.stratos.messaging.domain.topology.ClusterStatus;
 import org.apache.stratos.messaging.domain.topology.lifecycle.LifeCycleState;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * This is GroupMonitor to monitor the group which consists of
@@ -263,23 +265,19 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
                     + ", [event] " + scalingEvent.getId() + ", [group instance] " + scalingEvent.getInstanceId());
         }
 
-        //find the child context of this group, from scaling dependency tree
-        GroupChildContext currentChildContextInScalingTree =
-                (GroupChildContext) scalingDependencyTree.findApplicationContextWithIdInScalingDependencyTree(id);
-
+        //find the child context of this group,        
         //Notifying children, if this group has scaling dependencies
-        if (currentChildContextInScalingTree.isGroupScalingEnabled()) {
-            for (ApplicationChildContext applicationChildContext :
-                    currentChildContextInScalingTree.getApplicationChildContextList()) {
-
-                //Get group monitor so that it can notify it's children
-                Monitor monitor = aliasToActiveMonitorsMap.get(applicationChildContext.getId());
-
-                if (monitor instanceof GroupMonitor || monitor instanceof ApplicationMonitor) {
-
-                    monitor.onParentScalingEvent(scalingEvent);
-                }
-            }
+        if(scalingDependencies != null && !scalingDependencies.isEmpty()) {
+        	// has dependencies. Notify children
+			if (aliasToActiveMonitorsMap != null
+			        && !aliasToActiveMonitorsMap.values().isEmpty()) {
+				for (String dependent : scalingDependencies) {
+					Monitor monitor = aliasToActiveMonitorsMap.get(dependent);
+					if (monitor instanceof GroupMonitor || monitor instanceof ApplicationMonitor) {
+	                    monitor.onParentScalingEvent(scalingEvent);
+	                }
+                }				
+			}
         }
     }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/1ee24837/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 33bc4cb..3912029 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
@@ -44,6 +44,7 @@ import org.apache.stratos.autoscaler.monitor.cluster.VMClusterMonitor;
 import org.apache.stratos.autoscaler.util.ServiceReferenceHolder;
 import org.apache.stratos.messaging.domain.applications.GroupStatus;
 import org.apache.stratos.messaging.domain.applications.ParentComponent;
+import org.apache.stratos.messaging.domain.applications.ScalingDependentList;
 import org.apache.stratos.messaging.domain.instance.ClusterInstance;
 import org.apache.stratos.messaging.domain.instance.Instance;
 import org.apache.stratos.messaging.domain.topology.ClusterStatus;
@@ -65,7 +66,7 @@ public abstract class ParentComponentMonitor extends Monitor {
     //The monitors dependency tree with all the start-able/kill-able dependencies
     protected DependencyTree startupDependencyTree;
     //The monitors dependency tree with all the scaling dependencies
-    protected DependencyTree scalingDependencyTree;
+    protected Set<String> scalingDependencies;
     //monitors map, key=GroupAlias/clusterId and value=GroupMonitor/AbstractClusterMonitor
     protected Map<String, Monitor> aliasToActiveMonitorsMap;
     //Pending monitors list
@@ -84,8 +85,7 @@ public abstract class ParentComponentMonitor extends Monitor {
         this.id = component.getUniqueIdentifier();
         //Building the startup dependencies for this monitor within the immediate children
         startupDependencyTree = DependencyBuilder.getInstance().buildDependency(component);
-        //Building the scaling dependencies for this monitor within the immediate children
-        scalingDependencyTree = DependencyBuilder.getInstance().buildDependency(component);
+        scalingDependencies  =  DependencyBuilder.getInstance().buildScalingDependencies(component);
     }
 
     /**
@@ -706,5 +706,8 @@ private class MonitorAdder implements Runnable {
     }
 }
 
+	public Set<String> getScalingDependencies() {
+		return scalingDependencies;
+	}    
 
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/1ee24837/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/Dependencies.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/Dependencies.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/Dependencies.java
index da63a4d..a9e3548 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/Dependencies.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/pojo/Dependencies.java
@@ -26,7 +26,7 @@ public class Dependencies implements Serializable {
 
     private String [] startupOrders;
 
-    private String [] scalingOrders;
+    private String [] scalingDependants;
 
     private String terminationBehaviour;
 
@@ -46,11 +46,12 @@ public class Dependencies implements Serializable {
         this.startupOrders = startupOrders;
     }
 
-    public String[] getScalingOrders() {
-        return scalingOrders;
-    }
+	public String[] getScalingDependants() {
+		return scalingDependants;
+	}
 
-    public void setScalingOrders(String[] scalingOrders) {
-        this.scalingOrders = scalingOrders;
-    }
+	public void setScalingDependants(String[] scalingDependants) {
+		this.scalingDependants = scalingDependants;
+	}
+    
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/1ee24837/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
index 0e89a80..09dd518 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/rule/RuleTasksDelegator.java
@@ -309,6 +309,9 @@ public class RuleTasksDelegator {
 
     public void delegateScalingDependencyNotification(String clusterId, String networkPartitionId, float factor) {
 
+    	if(log.isDebugEnabled()) {
+    		log.debug("In Delegate scaling dependent notification..");
+    	}
         //Notify parent for checking scaling dependencies
         AbstractClusterMonitor clusterMonitor = AutoscalerContext.getInstance().getClusterMonitor(clusterId);
         if (clusterMonitor instanceof VMClusterMonitor) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/1ee24837/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/definitions/DependencyDefinitions.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/definitions/DependencyDefinitions.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/definitions/DependencyDefinitions.java
index 3b71e8e..d6934a9 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/definitions/DependencyDefinitions.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/definitions/DependencyDefinitions.java
@@ -33,7 +33,7 @@ public class DependencyDefinitions implements Serializable {
 
     private List<String> startupOrders;
 
-    private List<String> scalingOrders;
+    private List<String> scalingDependants;
 
     private String terminationBehaviour;
 
@@ -53,11 +53,12 @@ public class DependencyDefinitions implements Serializable {
 		this.startupOrders = startupOrders;
 	}
 
-    public List<String> getScalingOrders() {
-        return scalingOrders;
-    }
+	public List<String> getScalingDependants() {
+		return scalingDependants;
+	}
 
-    public void setScalingOrders(List<String> scalingOrders) {
-        this.scalingOrders = scalingOrders;
-    }
+	public void setScalingDependants(List<String> scalingDependants) {
+		this.scalingDependants = scalingDependants;
+	}
+	
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/1ee24837/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/deployer/DefaultServiceGroupDeployer.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/deployer/DefaultServiceGroupDeployer.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/deployer/DefaultServiceGroupDeployer.java
index 891a85f..d075775 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/deployer/DefaultServiceGroupDeployer.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/grouping/deployer/DefaultServiceGroupDeployer.java
@@ -312,6 +312,10 @@ public class DefaultServiceGroupDeployer implements ServiceGroupDeployer {
             // validate termination behavior
             validateTerminationBehavior(depDefs.getTerminationBehaviour());
             deps.setTerminationBehaviour(depDefs.getTerminationBehaviour());
+			if (depDefs.getScalingDependants() != null) {
+				deps.setScalingDependants(depDefs.getScalingDependants()
+				        .toArray(new String[depDefs.getScalingDependants().size()]));
+			}
             servicegroup.setDependencies(deps);
         }
 
@@ -340,10 +344,10 @@ public class DefaultServiceGroupDeployer implements ServiceGroupDeployer {
                 depsDef.setStartupOrders(startupOrdersDef);
             }
 
-            String [] scalingOrders = deps.getScalingOrders();
-            if (scalingOrders != null && scalingOrders[0] != null) {
-                List<String> scalingOrdersDef = Arrays.asList(scalingOrders);
-                depsDef.setStartupOrders(scalingOrdersDef);
+            String [] scalingDependants = deps.getScalingDependants();
+            if (scalingDependants != null && scalingDependants[0] != null) {
+                List<String> scalingDependenciesDef = Arrays.asList(scalingDependants);
+                depsDef.setScalingDependants(scalingDependenciesDef);
             }
 
             depsDef.setTerminationBehaviour(deps.getTerminationBehaviour());

http://git-wip-us.apache.org/repos/asf/stratos/blob/1ee24837/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/DependencyOrder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/DependencyOrder.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/DependencyOrder.java
index 127cd4f..1225fe0 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/DependencyOrder.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/applications/DependencyOrder.java
@@ -28,7 +28,7 @@ public class DependencyOrder implements Serializable {
 
 	private Set<StartupOrder> startupOrders;
 
-	private Set<ScalingDependentList> scalingDependentLists;
+	private Set<String> scalingDependents;
 
     private String terminationBehaviour;
 
@@ -52,11 +52,13 @@ public class DependencyOrder implements Serializable {
 		this.startupOrders = startupOrders;
 	}
 
-    public Set<ScalingDependentList> getScalingDependentLists() {
-        return scalingDependentLists;
-    }
+	public Set<String> getScalingDependents() {
+		return scalingDependents;
+	}
 
-    public void setScalingDependentLists(Set<ScalingDependentList> scalingDependentLists) {
-        this.scalingDependentLists = scalingDependentLists;
-    }
+	public void setScalingDependents(Set<String> scalingDependents) {
+		this.scalingDependents = scalingDependents;
+	}
+
+	
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/1ee24837/products/stratos/modules/distribution/src/main/conf/drools/scaling.drl
----------------------------------------------------------------------
diff --git a/products/stratos/modules/distribution/src/main/conf/drools/scaling.drl b/products/stratos/modules/distribution/src/main/conf/drools/scaling.drl
index 0b70dfd..346dd00 100644
--- a/products/stratos/modules/distribution/src/main/conf/drools/scaling.drl
+++ b/products/stratos/modules/distribution/src/main/conf/drools/scaling.drl
@@ -129,7 +129,7 @@ dialect "mvel"
     //            delegator.delegateScalingDependencyNotification(clusterId, clusterInstanceContext.getId(), factor);
 
                 boolean partitionsAvailable = true;
-                int count = 0;
+                int count = 0;                
                 while(count != additionalInstances && partitionsAvailable){
 
                     ClusterLevelPartitionContext partitionContext =  (ClusterLevelPartitionContext)autoscaleAlgorithm.getNextScaleUpPartitionContext(clusterInstanceContext.getPartitionCtxtsAsAnArray());
@@ -137,7 +137,12 @@ dialect "mvel"
 
                         log.info("[scale-up] Partition available, hence trying to spawn an instance to scale up!" );
                         log.debug("[scale-up] " + " [partition] " + partitionContext.getPartitionId() + " [cluster] " + clusterId );
-                        delegator.delegateSpawn(partitionContext, clusterId, clusterInstanceContext.getId(), isPrimary);
+                        log.debug("[scale-up] " + " has scaling dependents " + clusterInstanceContext.isHasScalingDependants() + " [cluster] " + clusterId );
+                        if(clusterInstanceContext.isHasScalingDependants()) {
+                        	delegator.delegateScalingDependencyNotification(clusterId, clusterInstanceContext.getNetworkPartitionId(), factor);
+                        } else {
+                        	delegator.delegateSpawn(partitionContext, clusterId, clusterInstanceContext.getId(), isPrimary);
+                        }
                         count++;
                     } else {