AMBARI-21161 Able to safe guard Ambari server against circular dependencies in role command order (dili)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/acb2f989 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/acb2f989 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/acb2f989 Branch: refs/heads/branch-feature-AMBARI-20859 Commit: acb2f9896e55db202f5b054565d09c0e598011ed Parents: 1586a1a Author: Di Li <d...@apache.org> Authored: Wed Jun 7 12:26:47 2017 -0400 Committer: Di Li <d...@apache.org> Committed: Wed Jun 7 12:26:47 2017 -0400 ---------------------------------------------------------------------- .../ambari/server/stageplanner/RoleGraph.java | 49 ++++- .../server/stageplanner/TestStagePlanner.java | 197 +++++++++++++++++-- .../stacks/HDP/2.0.6.1/role_command_order.json | 101 ++-------- 3 files changed, 241 insertions(+), 106 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/acb2f989/ambari-server/src/main/java/org/apache/ambari/server/stageplanner/RoleGraph.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stageplanner/RoleGraph.java b/ambari-server/src/main/java/org/apache/ambari/server/stageplanner/RoleGraph.java index 024a5e1..d6d26c9 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/stageplanner/RoleGraph.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/stageplanner/RoleGraph.java @@ -19,10 +19,12 @@ package org.apache.ambari.server.stageplanner; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeMap; +import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.Role; import org.apache.ambari.server.RoleCommand; import org.apache.ambari.server.actionmanager.CommandExecutionType; @@ -165,10 +167,15 @@ public class RoleGraph { * Returns a list of stages that need to be executed one after another * to execute the DAG generated in the last {@link #build(Stage)} call. */ - public List<Stage> getStages() { + public List<Stage> getStages() throws AmbariException { long initialStageId = initialStage.getStageId(); List<Stage> stageList = new ArrayList<>(); List<RoleGraphNode> firstStageNodes = new ArrayList<>(); + if(!graph.isEmpty()){ + LOG.info("Detecting cycle graphs"); + LOG.info(stringifyGraph()); + breakCycleGraph(); + } while (!graph.isEmpty()) { if (LOG.isDebugEnabled()) { LOG.debug(stringifyGraph()); @@ -313,4 +320,44 @@ public class RoleGraph { } return builder.toString(); } + + /** + * Cycle graphs indicate circular dependencies such as the following example + * that can cause Ambari enter an infinite loop while building stages. + * (DATANODE, START, 2) --> (NAMENODE, START, 2) --> (SECONDARY_NAMENODE, START, 3) + * (HDFS_CLIENT, INSTALL, 0) --> (DATANODE, START, 2) --> (NAMENODE, START, 2) --> (SECONDARY_NAMENODE, START, 3) + * (NAMENODE, START, 2) --> (DATANODE, START, 2) --> (SECONDARY_NAMENODE, START, 3) + * (SECONDARY_NAMENODE, START, 3) + * It is important to safe guard against cycle graphs, + * when Ambari supports mpacks, custom services and service level role command order. + * */ + public void breakCycleGraph() throws AmbariException{ + List<String> edges = new ArrayList<String>(); + for (String role : graph.keySet()){ + RoleGraphNode fromNode = graph.get(role); + String fnRole = fromNode.getRole().name(); + String fnCommand = fromNode.getCommand().name(); + + Iterator<RoleGraphNode> it = fromNode.getEdges().iterator(); + while(it.hasNext()){ + RoleGraphNode toNode = it.next(); + String tnRole = toNode.getRole().name(); + String tnCommand = toNode.getCommand().name(); + //Check if the reversed edge exists in the list already + //If the edit exists, print an error message and break the edge + String format = "%s:%s --> %s:%s"; + String edge = String.format(format, fnRole, fnCommand, tnRole, tnCommand); + String reversedEdge = String.format(format, tnRole, tnCommand, fnRole, fnCommand); + if (edges.contains(reversedEdge)){ + String msg = String.format( + "Circular dependencies detected between %s and %s for %s. " + + "%s already exists in the role command order.", fnRole, tnRole, edge, reversedEdge); + LOG.error(msg); + throw new AmbariException(msg); + } else { + edges.add(edge); + } + } + } + } } http://git-wip-us.apache.org/repos/asf/ambari/blob/acb2f989/ambari-server/src/test/java/org/apache/ambari/server/stageplanner/TestStagePlanner.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/stageplanner/TestStagePlanner.java b/ambari-server/src/test/java/org/apache/ambari/server/stageplanner/TestStagePlanner.java index 271ee89..ae3b316 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/stageplanner/TestStagePlanner.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/stageplanner/TestStagePlanner.java @@ -44,13 +44,18 @@ import org.apache.ambari.server.utils.StageUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.common.collect.ImmutableMap; import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; +import junit.framework.Assert; + public class TestStagePlanner { + private static final Logger log = LoggerFactory.getLogger(TestStagePlanner.class); private Injector injector; @@ -88,7 +93,7 @@ public class TestStagePlanner { rg.build(stage); List<Stage> outStages = rg.getStages(); for (Stage s: outStages) { - System.out.println(s.toString()); + log.info(s.toString()); } assertEquals(1, outStages.size()); assertEquals(stage.getExecutionCommands(hostname), outStages.get(0) @@ -96,7 +101,165 @@ public class TestStagePlanner { } @Test - public void testMultiStagePlan() { + public void testSCCInGraphDetectedShort() { + ClusterImpl cluster = mock(ClusterImpl.class); + when(cluster.getCurrentStackVersion()).thenReturn(new StackId("HDP-2.0.6.1")); + + Service hbaseService = mock(Service.class); + when(hbaseService.getDesiredStackId()).thenReturn(new StackId("HDP-2.0.6.1")); + Service zkService = mock(Service.class); + when(zkService.getDesiredStackId()).thenReturn(new StackId("HDP-2.0.6.1")); + + when(cluster.getServices()).thenReturn(ImmutableMap.<String, Service>builder() + .put("HBASE", hbaseService) + .put("ZOOKEEPER", zkService) + .build()); + + RoleCommandOrder rco = roleCommandOrderProvider.getRoleCommandOrder(cluster); + RoleGraph rg = roleGraphFactory.createNew(rco); + long now = System.currentTimeMillis(); + Stage stage = StageUtils.getATestStage(1, 1, "host1", "", ""); + stage.addHostRoleExecutionCommand("host2", Role.HBASE_MASTER, + RoleCommand.START, new ServiceComponentHostStartEvent("HBASE_MASTER", + "host2", now), "cluster1", "HBASE", false, false); + stage.addHostRoleExecutionCommand("host3", Role.ZOOKEEPER_SERVER, + RoleCommand.START, new ServiceComponentHostStartEvent("ZOOKEEPER_SERVER", + "host3", now), "cluster1", "ZOOKEEPER", false, false); + log.info("Build and ready to detect circular dependencies - short chain"); + rg.build(stage); + boolean exceptionThrown = false; + try { + List<Stage> outStages = rg.getStages(); + } catch (AmbariException e) { + exceptionThrown = true; + } + Assert.assertTrue(exceptionThrown); + } + + @Test + public void testSCCInGraphDetectedLong() { + ClusterImpl cluster = mock(ClusterImpl.class); + when(cluster.getCurrentStackVersion()).thenReturn(new StackId("HDP-2.0.6.1")); + + Service hbaseService = mock(Service.class); + when(hbaseService.getDesiredStackId()).thenReturn(new StackId("HDP-2.0.6.1")); + Service zkService = mock(Service.class); + when(zkService.getDesiredStackId()).thenReturn(new StackId("HDP-2.0.6.1")); + Service yarnService = mock(Service.class); + when(yarnService.getDesiredStackId()).thenReturn(new StackId("HDP-2.0.6.1")); + + when(cluster.getServices()).thenReturn(ImmutableMap.<String, Service>builder() + .put("HBASE", hbaseService) + .put("ZOOKEEPER", zkService) + .put("YARN", yarnService) + .build()); + + RoleCommandOrder rco = roleCommandOrderProvider.getRoleCommandOrder(cluster); + RoleGraph rg = roleGraphFactory.createNew(rco); + long now = System.currentTimeMillis(); + Stage stage = StageUtils.getATestStage(1, 1, "host1", "", ""); + stage.addHostRoleExecutionCommand("host2", Role.HBASE_MASTER, + RoleCommand.STOP, new ServiceComponentHostStartEvent("HBASE_MASTER", + "host2", now), "cluster1", "HBASE", false, false); + stage.addHostRoleExecutionCommand("host3", Role.ZOOKEEPER_SERVER, + RoleCommand.STOP, new ServiceComponentHostStartEvent("ZOOKEEPER_SERVER", + "host3", now), "cluster1", "ZOOKEEPER", false, false); + stage.addHostRoleExecutionCommand("host2", Role.RESOURCEMANAGER, + RoleCommand.STOP, new ServiceComponentHostStartEvent("RESOURCEMANAGER", + "host4", now), "cluster1", "YARN", false, false); + + log.info("Build and ready to detect circular dependencies - long chain"); + rg.build(stage); + boolean exceptionThrown = false; + try { + List<Stage> outStages = rg.getStages(); + } catch (AmbariException e) { + exceptionThrown = true; + } + Assert.assertTrue(exceptionThrown); + } + + @Test + public void testSCCInGraphDetectedLongTwo() { + ClusterImpl cluster = mock(ClusterImpl.class); + when(cluster.getCurrentStackVersion()).thenReturn(new StackId("HDP-2.0.6.1")); + + Service hbaseService = mock(Service.class); + when(hbaseService.getDesiredStackId()).thenReturn(new StackId("HDP-2.0.6.1")); + Service zkService = mock(Service.class); + when(zkService.getDesiredStackId()).thenReturn(new StackId("HDP-2.0.6.1")); + + when(cluster.getServices()).thenReturn(ImmutableMap.<String, Service>builder() + .put("HBASE", hbaseService) + .put("ZOOKEEPER", zkService) + .build()); + + RoleCommandOrder rco = roleCommandOrderProvider.getRoleCommandOrder(cluster); + RoleGraph rg = roleGraphFactory.createNew(rco); + long now = System.currentTimeMillis(); + Stage stage = StageUtils.getATestStage(1, 1, "host1", "", ""); + stage.addHostRoleExecutionCommand("host2", Role.HBASE_MASTER, + RoleCommand.UPGRADE, new ServiceComponentHostStartEvent("HBASE_MASTER", + "host2", now), "cluster1", "HBASE", false, false); + stage.addHostRoleExecutionCommand("host3", Role.ZOOKEEPER_SERVER, + RoleCommand.UPGRADE, new ServiceComponentHostStartEvent("ZOOKEEPER_SERVER", + "host3", now), "cluster1", "ZOOKEEPER", false, false); + stage.addHostRoleExecutionCommand("host2", Role.HBASE_REGIONSERVER, + RoleCommand.UPGRADE, new ServiceComponentHostStartEvent("HBASE_REGIONSERVER", + "host4", now), "cluster1", "HBASE", false, false); + + log.info("Build and ready to detect circular dependencies - long chain"); + rg.build(stage); + boolean exceptionThrown = false; + try { + List<Stage> outStages = rg.getStages(); + } catch (AmbariException e) { + exceptionThrown = true; + } + Assert.assertTrue(exceptionThrown); + } + + @Test + public void testNoSCCInGraphDetected() { + ClusterImpl cluster = mock(ClusterImpl.class); + when(cluster.getCurrentStackVersion()).thenReturn(new StackId("HDP-2.0.6")); + + Service hbaseService = mock(Service.class); + when(hbaseService.getDesiredStackId()).thenReturn(new StackId("HDP-2.0.6")); + Service zkService = mock(Service.class); + when(zkService.getDesiredStackId()).thenReturn(new StackId("HDP-2.0.6")); + + when(cluster.getServices()).thenReturn(ImmutableMap.<String, Service>builder() + .put("HBASE", hbaseService) + .put("ZOOKEEPER", zkService) + .build()); + + RoleCommandOrder rco = roleCommandOrderProvider.getRoleCommandOrder(cluster); + RoleGraph rg = roleGraphFactory.createNew(rco); + long now = System.currentTimeMillis(); + Stage stage = StageUtils.getATestStage(1, 1, "host1", "", ""); + stage.addHostRoleExecutionCommand("host2", Role.HBASE_MASTER, + RoleCommand.STOP, new ServiceComponentHostStartEvent("HBASE_MASTER", + "host2", now), "cluster1", "HBASE", false, false); + stage.addHostRoleExecutionCommand("host3", Role.ZOOKEEPER_SERVER, + RoleCommand.STOP, new ServiceComponentHostStartEvent("ZOOKEEPER_SERVER", + "host3", now), "cluster1", "ZOOKEEPER", false, false); + stage.addHostRoleExecutionCommand("host2", Role.HBASE_REGIONSERVER, + RoleCommand.STOP, new ServiceComponentHostStartEvent("HBASE_REGIONSERVER", + "host4", now), "cluster1", "HBASE", false, false); + log.info("Build and ready to detect circular dependencies"); + rg.build(stage); + boolean exceptionThrown = false; + try { + List<Stage> outStages = rg.getStages(); + } catch (AmbariException e) { + exceptionThrown = true; + } + Assert.assertFalse(exceptionThrown); + } + + @Test + public void testMultiStagePlan() throws Throwable { ClusterImpl cluster = mock(ClusterImpl.class); when(cluster.getCurrentStackVersion()).thenReturn(new StackId("HDP-2.0.6")); @@ -121,19 +284,19 @@ public class TestStagePlanner { stage.addHostRoleExecutionCommand("host3", Role.ZOOKEEPER_SERVER, RoleCommand.START, new ServiceComponentHostStartEvent("ZOOKEEPER_SERVER", "host3", now), "cluster1", "ZOOKEEPER", false, false); - System.out.println(stage.toString()); + log.info(stage.toString()); rg.build(stage); - System.out.println(rg.stringifyGraph()); + log.info(rg.stringifyGraph()); List<Stage> outStages = rg.getStages(); for (Stage s: outStages) { - System.out.println(s.toString()); + log.info(s.toString()); } assertEquals(3, outStages.size()); } @Test - public void testRestartStagePlan() { + public void testRestartStagePlan() throws Throwable { ClusterImpl cluster = mock(ClusterImpl.class); when(cluster.getCurrentStackVersion()).thenReturn(new StackId("HDP-2.0.6")); @@ -158,19 +321,19 @@ public class TestStagePlanner { RoleCommand.CUSTOM_COMMAND, "cluster1", new ServiceComponentHostServerActionEvent("host2", System.currentTimeMillis()), null, "command detail", null, null, false, false); - System.out.println(stage.toString()); + log.info(stage.toString()); rg.build(stage); - System.out.println(rg.stringifyGraph()); + log.info(rg.stringifyGraph()); List<Stage> outStages = rg.getStages(); for (Stage s: outStages) { - System.out.println(s.toString()); + log.info(s.toString()); } assertEquals(2, outStages.size()); } @Test - public void testManyStages() { + public void testManyStages() throws Throwable { ClusterImpl cluster = mock(ClusterImpl.class); when(cluster.getCurrentStackVersion()).thenReturn(new StackId("HDP-2.0.6")); @@ -244,18 +407,18 @@ public class TestStagePlanner { RoleCommand.START, new ServiceComponentHostStartEvent("GANGLIA_SERVER", "host9", now), "cluster1", "GANGLIA", false, false); - System.out.println(stage.toString()); + log.info(stage.toString()); rg.build(stage); - System.out.println(rg.stringifyGraph()); + log.info(rg.stringifyGraph()); List<Stage> outStages = rg.getStages(); for (Stage s : outStages) { - System.out.println(s.toString()); + log.info(s.toString()); } assertEquals(4, outStages.size()); } @Test - public void testDependencyOrderedStageCreate() { + public void testDependencyOrderedStageCreate() throws Throwable { ClusterImpl cluster = mock(ClusterImpl.class); when(cluster.getCurrentStackVersion()).thenReturn(new StackId("HDP-2.0.6")); RoleCommandOrder rco = roleCommandOrderProvider.getRoleCommandOrder(cluster); @@ -296,12 +459,12 @@ public class TestStagePlanner { stage.addHostRoleExecutionCommand("host9", Role.GANGLIA_SERVER, RoleCommand.START, new ServiceComponentHostStartEvent("GANGLIA_SERVER", "host9", now), "cluster1", "GANGLIA", false, false); - System.out.println(stage.toString()); + log.info(stage.toString()); rg.build(stage); - System.out.println(rg.stringifyGraph()); + log.info(rg.stringifyGraph()); List<Stage> outStages = rg.getStages(); for (Stage s : outStages) { - System.out.println(s.toString()); + log.info(s.toString()); } assertEquals(1, outStages.size()); } http://git-wip-us.apache.org/repos/asf/ambari/blob/acb2f989/ambari-server/src/test/resources/stacks/HDP/2.0.6.1/role_command_order.json ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/resources/stacks/HDP/2.0.6.1/role_command_order.json b/ambari-server/src/test/resources/stacks/HDP/2.0.6.1/role_command_order.json index 6154004..4d63fe3 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.0.6.1/role_command_order.json +++ b/ambari-server/src/test/resources/stacks/HDP/2.0.6.1/role_command_order.json @@ -1,92 +1,17 @@ { - "_comment" : "Record format:", - "_comment" : "blockedRole-blockedCommand: [blockerRole1-blockerCommand1, blockerRole2-blockerCommand2, ...]", "general_deps" : { - "_comment" : "dependencies for all cases", + "_comment" : "circular dependencies, short link", "HBASE_MASTER-START": ["ZOOKEEPER_SERVER-START"], - "HBASE_REGIONSERVER-START": ["HBASE_MASTER-START"], - "OOZIE_SERVER-START": ["JOBTRACKER-START", "TASKTRACKER-START"], - "WEBHCAT_SERVER-START": ["TASKTRACKER-START", "HIVE_SERVER-START"], - "HIVE_METASTORE-START": ["MYSQL_SERVER-START"], - "HIVE_SERVER-START": ["TASKTRACKER-START", "MYSQL_SERVER-START"], - "HUE_SERVER-START": ["HIVE_SERVER-START", "HCAT-START", "OOZIE_SERVER-START"], - "FLUME_HANDLER-START": ["OOZIE_SERVER-START"], - "MAPREDUCE_SERVICE_CHECK-SERVICE_CHECK": ["JOBTRACKER-START", "TASKTRACKER-START"], - "OOZIE_SERVICE_CHECK-SERVICE_CHECK": ["OOZIE_SERVER-START", "MAPREDUCE2_SERVICE_CHECK-SERVICE_CHECK"], - "WEBHCAT_SERVICE_CHECK-SERVICE_CHECK": ["WEBHCAT_SERVER-START"], - "HBASE_SERVICE_CHECK-SERVICE_CHECK": ["HBASE_MASTER-START", "HBASE_REGIONSERVER-START"], - "HIVE_SERVICE_CHECK-SERVICE_CHECK": ["HIVE_SERVER-START", "HIVE_METASTORE-START"], - "HCAT_SERVICE_CHECK-SERVICE_CHECK": ["HIVE_SERVER-START"], - "PIG_SERVICE_CHECK-SERVICE_CHECK": ["JOBTRACKER-START", "TASKTRACKER-START"], - "SQOOP_SERVICE_CHECK-SERVICE_CHECK": ["JOBTRACKER-START", "TASKTRACKER-START"], - "ZOOKEEPER_SERVICE_CHECK-SERVICE_CHECK": ["ZOOKEEPER_SERVER-START"], - "ZOOKEEPER_QUORUM_SERVICE_CHECK-SERVICE_CHECK": ["ZOOKEEPER_SERVER-START"], - "ZOOKEEPER_SERVER-STOP" : ["HBASE_MASTER-STOP", "HBASE_REGIONSERVER-STOP"], - "HBASE_MASTER-STOP": ["HBASE_REGIONSERVER-STOP"], - "TASKTRACKER-UPGRADE": ["JOBTRACKER-UPGRADE"], - "MAPREDUCE_CLIENT-UPGRADE": ["TASKTRACKER-UPGRADE", "JOBTRACKER-UPGRADE"], - "ZOOKEEPER_SERVER-UPGRADE": ["MAPREDUCE_CLIENT-UPGRADE"], - "ZOOKEEPER_CLIENT-UPGRADE": ["ZOOKEEPER_SERVER-UPGRADE"], - "HBASE_MASTER-UPGRADE": ["ZOOKEEPER_CLIENT-UPGRADE"], - "HBASE_REGIONSERVER-UPGRADE": ["HBASE_MASTER-UPGRADE"], - "HBASE_CLIENT-UPGRADE": ["HBASE_REGIONSERVER-UPGRADE"], - "HIVE_SERVER-UPGRADE" : ["HBASE_CLIENT-UPGRADE"], - "HIVE_METASTORE-UPGRADE" : ["HIVE_SERVER-UPGRADE"], - "MYSQL_SERVER-UPGRADE": ["HIVE_METASTORE-UPGRADE"], - "HIVE_CLIENT-UPGRADE": ["MYSQL_SERVER-UPGRADE"], - "HCAT-UPGRADE": ["HIVE_CLIENT-UPGRADE"], - "OOZIE_SERVER-UPGRADE" : ["HCAT-UPGRADE"], - "OOZIE_CLIENT-UPGRADE" : ["OOZIE_SERVER-UPGRADE"], - "WEBHCAT_SERVER-UPGRADE" : ["OOZIE_CLIENT-UPGRADE"], - "PIG-UPGRADE" : ["WEBHCAT_SERVER-UPGRADE"], - "SQOOP-UPGRADE" : ["PIG-UPGRADE"], - "GANGLIA_SERVER-UPGRADE" : ["SQOOP-UPGRADE"], - "GANGLIA_MONITOR-UPGRADE" : ["GANGLIA_SERVER-UPGRADE"] - }, - "_comment" : "GLUSTERFS-specific dependencies", - "optional_glusterfs": { - "HBASE_MASTER-START": ["PEERSTATUS-START"], - "JOBTRACKER-START": ["PEERSTATUS-START"], - "TASKTRACKER-START": ["PEERSTATUS-START"], - "GLUSTERFS_SERVICE_CHECK-SERVICE_CHECK": ["PEERSTATUS-START"], - "JOBTRACKER-UPGRADE": ["GLUSTERFS_CLIENT-UPGRADE"] - }, - "_comment" : "Dependencies that are used when GLUSTERFS is not present in cluster", - "optional_no_glusterfs": { - "SECONDARY_NAMENODE-START": ["NAMENODE-START"], - "RESOURCEMANAGER-START": ["NAMENODE-START", "DATANODE-START"], - "NODEMANAGER-START": ["NAMENODE-START", "DATANODE-START", "RESOURCEMANAGER-START"], - "HISTORYSERVER-START": ["NAMENODE-START", "DATANODE-START"], - "HBASE_MASTER-START": ["NAMENODE-START", "DATANODE-START"], - "JOBTRACKER-START": ["NAMENODE-START", "DATANODE-START"], - "TASKTRACKER-START": ["NAMENODE-START", "DATANODE-START"], - "HIVE_SERVER-START": ["DATANODE-START"], - "WEBHCAT_SERVER-START": ["DATANODE-START"], - "HDFS_SERVICE_CHECK-SERVICE_CHECK": ["NAMENODE-START", "DATANODE-START", - "SECONDARY_NAMENODE-START"], - "MAPREDUCE2_SERVICE_CHECK-SERVICE_CHECK": ["NODEMANAGER-START", - "RESOURCEMANAGER-START", "HISTORYSERVER-START", "YARN_SERVICE_CHECK-SERVICE_CHECK"], - "YARN_SERVICE_CHECK-SERVICE_CHECK": ["NODEMANAGER-START", "RESOURCEMANAGER-START"], - "RESOURCEMANAGER_SERVICE_CHECK-SERVICE_CHECK": ["RESOURCEMANAGER-START"], - "PIG_SERVICE_CHECK-SERVICE_CHECK": ["RESOURCEMANAGER-START", "NODEMANAGER-START"], - "NAMENODE-STOP": ["JOBTRACKER-STOP", "TASKTRACKER-STOP", "RESOURCEMANAGER-STOP", - "NODEMANAGER-STOP", "HISTORYSERVER-STOP", "HBASE_MASTER-STOP"], - "DATANODE-STOP": ["JOBTRACKER-STOP", "TASKTRACKER-STOP", "RESOURCEMANAGER-STOP", - "NODEMANAGER-STOP", "HISTORYSERVER-STOP", "HBASE_MASTER-STOP"], - "SECONDARY_NAMENODE-UPGRADE": ["NAMENODE-UPGRADE"], - "DATANODE-UPGRADE": ["SECONDARY_NAMENODE-UPGRADE"], - "HDFS_CLIENT-UPGRADE": ["DATANODE-UPGRADE"], - "JOBTRACKER-UPGRADE": ["HDFS_CLIENT-UPGRADE"] - }, - "_comment" : "Dependencies that are used in HA NameNode cluster", - "namenode_optional_ha": { - "NAMENODE-START": ["JOURNALNODE-START", "ZOOKEEPER_SERVER-START"], - "ZKFC-START": ["NAMENODE-START"], - "HDFS_SERVICE_CHECK-SERVICE_CHECK": ["ZKFC-START"] - }, - "_comment" : "Dependencies that are used in ResourceManager HA cluster", - "resourcemanager_optional_ha" : { - "RESOURCEMANAGER-START": ["ZOOKEEPER_SERVER-START"] - } -} + "ZOOKEEPER_SERVER-START": ["HBASE_MASTER-START"], + + "_comment" : "circular dependencies, long link", + "ZOOKEEPER_SERVER-STOP" : ["HBASE_MASTER-STOP"], + "HBASE_MASTER-STOP": ["RESOURCEMANAGER-STOP"], + "RESOURCEMANAGER-STOP": ["ZOOKEEPER_SERVER-STOP"], + "_comment" : "circular dependencies, long link", + "ZOOKEEPER_SERVER-UPGRADE" : ["HBASE_MASTER-UPGRADE"], + "HBASE_MASTER-UPGRADE": ["HBASE_REGIONSERVER-UPGRADE"], + "HBASE_REGIONSERVER-UPGRADE": ["ZOOKEEPER_SERVER-UPGRADE"] + } +} \ No newline at end of file