Repository: stratos Updated Branches: refs/heads/4.0.0-grouping d3a1e64b5 -> f1ccd9b04
fixing issues while starting group monitors Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/f1ccd9b0 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/f1ccd9b0 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/f1ccd9b0 Branch: refs/heads/4.0.0-grouping Commit: f1ccd9b049989501d6c1a8c0cb6ff4d5a2bd69ab Parents: d3a1e64 Author: reka <[email protected]> Authored: Wed Sep 24 22:57:04 2014 +0530 Committer: reka <[email protected]> Committed: Wed Sep 24 22:57:04 2014 +0530 ---------------------------------------------------------------------- .../autoscaler/grouping/DependencyBuilder.java | 30 ++++++-- .../AutoscalerTopologyEventReceiver.java | 18 +++-- .../stratos/autoscaler/monitor/Monitor.java | 78 +++++++------------- .../monitor/application/ApplicationMonitor.java | 35 +++++++++ .../autoscaler/monitor/group/GroupMonitor.java | 50 +++++++++++++ 5 files changed, 143 insertions(+), 68 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/f1ccd9b0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/DependencyBuilder.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/DependencyBuilder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/DependencyBuilder.java index 6b43c37..afec818 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/DependencyBuilder.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/grouping/DependencyBuilder.java @@ -60,22 +60,36 @@ public class DependencyBuilder { } } //TODO adding all the missed groups or clusters as the top child to the list - for(String grpAlias: component.getAliasToGroupMap().keySet()) { - if(!startup.contains("group." + grpAlias)) { - startup.add("group." + grpAlias); + //TODO handle by application and group itself groupName and serviceName + + if(component instanceof Application) { + for(Group group: component.getAliasToGroupMap().values()) { + if(!startup.contains("group." + group.getAlias())) { + startup.add("group." + group.getAlias()); + } } - } - Set<String> cartridgeAliases = component.getClusterDataMap().keySet(); + Set<String> cartridgeAliases = component.getClusterDataMap().keySet(); - for(String carAlias : cartridgeAliases) { + for(String carAlias : cartridgeAliases) { if(!startup.contains("cartridge." + carAlias)) { startup.add("cartridge." + carAlias); + } } - } - + } else if(component instanceof Group) { + for(Group group: component.getAliasToGroupMap().values()) { + if(!startup.contains("group." + group.getName())) { + startup.add("group." + group.getName()); + } + } + for(ClusterDataHolder dataHolder : component.getClusterDataMap().values()) { + if(!startup.contains("cartridge." + dataHolder.getServiceType())) { + startup.add("cartridge." + dataHolder.getServiceType()); + } + } + } return startup; } http://git-wip-us.apache.org/repos/asf/stratos/blob/f1ccd9b0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java index f056de2..575e1a5 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/message/receiver/topology/AutoscalerTopologyEventReceiver.java @@ -90,9 +90,9 @@ public class AutoscalerTopologyEventReceiver implements Runnable { @Override protected void onEvent(Event event) { try { + TopologyManager.acquireReadLock(); if(!topologyInitialized) { topologyInitialized = true; - TopologyManager.acquireReadLock(); for (Application application : TopologyManager.getTopology().getApplications()) { startApplicationMonitor(application); } @@ -500,9 +500,16 @@ public class AutoscalerTopologyEventReceiver implements Runnable { ApplicationMonitor applicationMonitor = null; int retries = 5; boolean success = false; - while (!success && retries != 0) { + do { + try { + Thread.sleep(5000); + } catch (InterruptedException e1) { + } try { + long start = System.currentTimeMillis(); applicationMonitor = AutoscalerUtil.getApplicationMonitor(application); + long end = System.currentTimeMillis(); + log.info("***********************time taken to start app mon: " + (end - start)/1000); success = true; //TODO exception handling } catch (Exception e) { @@ -510,13 +517,10 @@ public class AutoscalerTopologyEventReceiver implements Runnable { application.getId(); log.debug(msg, e); retries--; - try { - Thread.sleep(5000); - } catch (InterruptedException e1) { - } + } - } + } while (!success && retries != 0); if (applicationMonitor == null) { String msg = "Application monitor creation failed, even after retrying for 5 times, " http://git-wip-us.apache.org/repos/asf/stratos/blob/f1ccd9b0/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 9a47600..a584584 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 @@ -60,6 +60,8 @@ public abstract class Monitor extends Observable implements Observer { startDependency(); } + protected abstract void startDependency(); + public Map<String, GroupMonitor> getGroupMonitors() { return groupMonitors; @@ -112,38 +114,7 @@ public abstract class Monitor extends Observable implements Observer { this.id = id; } - public void startDependency() { - //Need to get the order every time as group/cluster might already been started - //TODO breadth first search in a tree and find the parallel one - //TODO build up the tree with ordered manner - - preOrderTraverse = DependencyBuilder.getStartupOrder(component); - - //start the first dependency - if(!preOrderTraverse.isEmpty()) { - String dependency = preOrderTraverse.poll(); - if (dependency.contains("group")) { - startGroupMonitor(this, dependency.substring(6), component); - } else if (dependency.contains("cartridge")) { - ClusterDataHolder clusterDataHolder = component.getClusterData(dependency.substring(10)); - String clusterId = clusterDataHolder.getClusterId(); - String serviceName = clusterDataHolder.getServiceType(); - Cluster cluster = null; - TopologyManager.acquireReadLock(); - cluster = TopologyManager.getTopology().getService(serviceName).getCluster(clusterId); - TopologyManager.releaseReadLock(); - if (cluster != null) { - startClusterMonitor(cluster); - } else { - //TODO throw exception since Topology is inconsistent - } - - } - } else { - //all the groups/clusters have been started and waiting for activation - log.info("All the groups/clusters of the [group]: " + this.id + " have been started."); - } - } + protected synchronized void startClusterMonitor(Cluster cluster) { Thread th = null; if (cluster.isLbCluster() @@ -156,10 +127,10 @@ public abstract class Monitor extends Observable implements Observer { } if (th != null) { th.start(); - try { + /*try { th.join(); } catch (InterruptedException ignore) { - } + }*/ if (log.isDebugEnabled()) { log.debug(String @@ -178,10 +149,10 @@ public abstract class Monitor extends Observable implements Observer { if (th != null) { th.start(); - try { + /*try { th.join(); } catch (InterruptedException ignore) { - } + }*/ if (log.isDebugEnabled()) { log.debug(String @@ -203,7 +174,11 @@ public abstract class Monitor extends Observable implements Observer { ClusterMonitor monitor = null; int retries = 5; boolean success = false; - while (!success && retries != 0) { + do { + try { + Thread.sleep(5000); + } catch (InterruptedException e1) { + } try { monitor = AutoscalerUtil.getClusterMonitor(cluster); success = true; @@ -212,24 +187,19 @@ public abstract class Monitor extends Observable implements Observer { String msg = "Cluster monitor creation failed for cluster: " + cluster.getClusterId(); log.debug(msg, e); retries--; - try { - Thread.sleep(5000); - } catch (InterruptedException e1) { - } + } catch (PartitionValidationException e) { String msg = "Cluster monitor creation failed for cluster: " + cluster.getClusterId(); log.debug(msg, e); retries--; - try { - Thread.sleep(5000); - } catch (InterruptedException e1) { - } + } - } + } while (!success && retries != 0); - if (monitor == null) { + + if (monitor == null) { String msg = "Cluster monitor creation failed, even after retrying for 5 times, " + "for cluster: " + cluster.getClusterId(); log.error(msg); @@ -263,7 +233,12 @@ public abstract class Monitor extends Observable implements Observer { GroupMonitor monitor = null; int retries = 5; boolean success = false; - while (!success && retries != 0) { + do { + try { + Thread.sleep(5000); + } catch (InterruptedException e1) { + } + try { monitor = AutoscalerUtil.getGroupMonitor(group.getGroup(dependency)); monitor.addObserver(parent); @@ -273,13 +248,10 @@ public abstract class Monitor extends Observable implements Observer { String msg = "Group monitor creation failed for group: " + dependency; log.debug(msg, e); retries--; - try { - Thread.sleep(5000); - } catch (InterruptedException e1) { - } + } - } + } while (!success && retries != 0); if (monitor == null) { String msg = "Group monitor creation failed, even after retrying for 5 times, " http://git-wip-us.apache.org/repos/asf/stratos/blob/f1ccd9b0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java index d3c4113..b5dcbdb 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/application/ApplicationMonitor.java @@ -56,6 +56,41 @@ public class ApplicationMonitor extends Monitor { } + @Override + protected void startDependency() { + //Need to get the order every time as group/cluster might already been started + //TODO breadth first search in a tree and find the parallel one + //TODO build up the tree with ordered manner + + preOrderTraverse = DependencyBuilder.getStartupOrder(component); + + //start the first dependency + if(!preOrderTraverse.isEmpty()) { + String dependency = preOrderTraverse.poll(); + if (dependency.contains("group")) { + startGroupMonitor(this, dependency.substring(6), component); + } else if (dependency.contains("cartridge")) { + ClusterDataHolder clusterDataHolder = component.getClusterData(dependency.substring(10)); + String clusterId = clusterDataHolder.getClusterId(); + String serviceName = clusterDataHolder.getServiceType(); + Cluster cluster = null; + TopologyManager.acquireReadLock(); + cluster = TopologyManager.getTopology().getService(serviceName).getCluster(clusterId); + TopologyManager.releaseReadLock(); + if (cluster != null) { + startClusterMonitor(cluster); + } else { + //TODO throw exception since Topology is inconsistent + } + + } + } else { + //all the groups/clusters have been started and waiting for activation + log.info("All the groups/clusters of the [group]: " + this.id + " have been started."); + } + + + } /** http://git-wip-us.apache.org/repos/asf/stratos/blob/f1ccd9b0/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/group/GroupMonitor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/group/GroupMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/group/GroupMonitor.java index 28662c6..2f297bb 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/group/GroupMonitor.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/group/GroupMonitor.java @@ -18,9 +18,15 @@ */ package org.apache.stratos.autoscaler.monitor.group; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.stratos.autoscaler.grouping.DependencyBuilder; import org.apache.stratos.autoscaler.monitor.Monitor; +import org.apache.stratos.messaging.domain.topology.Cluster; +import org.apache.stratos.messaging.domain.topology.ClusterDataHolder; import org.apache.stratos.messaging.domain.topology.Group; import org.apache.stratos.messaging.event.Event; +import org.apache.stratos.messaging.message.receiver.topology.TopologyManager; import java.util.List; import java.util.Map; @@ -30,6 +36,8 @@ import java.util.Map; * groups and clusters */ public class GroupMonitor extends Monitor { + private static final Log log = LogFactory.getLog(GroupMonitor.class); + @@ -39,6 +47,48 @@ public class GroupMonitor extends Monitor { } + @Override + public void startDependency() { + //Need to get the order every time as group/cluster might already been started + //TODO breadth first search in a tree and find the parallel one + //TODO build up the tree with ordered manner + + preOrderTraverse = DependencyBuilder.getStartupOrder(component); + + //start the first dependency + if(!preOrderTraverse.isEmpty()) { + String dependency = preOrderTraverse.poll(); + if (dependency.contains("group")) { + for(Group group: component.getAliasToGroupMap().values()) { + if(group.getName().equals(dependency.substring(6))) { + startGroupMonitor(this, group.getAlias(), component); + } + } + } else if (dependency.contains("cartridge")) { + for(ClusterDataHolder dataHolder : component.getClusterDataMap().values()) { + if(dataHolder.getServiceType().equals(dependency.substring(10))) { + String clusterId = dataHolder.getClusterId(); + String serviceName = dataHolder.getServiceType(); + Cluster cluster = null; + TopologyManager.acquireReadLock(); + cluster = TopologyManager.getTopology().getService(serviceName).getCluster(clusterId); + TopologyManager.releaseReadLock(); + if (cluster != null) { + startClusterMonitor(cluster); + } else { + //TODO throw exception since Topology is inconsistent + } + } + } + + + } + } else { + //all the groups/clusters have been started and waiting for activation + log.info("All the groups/clusters of the [group]: " + this.id + " have been started."); + } + } + //monitor the status of the cluster and the groups public void monitor() {
