/** * Create a plan of tasks to be executed in order to perform the cluster operation. Each item in the list represents * a stage of tasks that can be performed. All tasks in a stage may be run in parallel, but every task in a stage * must be successfully completed before moving on to the next stage. * * @return Plan of tasks to be executed in order to perform a cluster operation. */ public List<Set<TaskNode>> linearizeDependentTasks() { TaskDag taskDag = createTaskDag(); long start = System.currentTimeMillis(); List<Set<TaskNode>> linearizedTasks = taskDag.linearize(); long dur = System.currentTimeMillis() - start; LOG.debug("took {} ms to linearize action plan.", dur); return linearizedTasks; }
@Test public void testNoEdgeNodesInDag() { Service s1 = Service.builder().setName("s1").build(); Node node1 = new Node("node1", "1", ImmutableSet.<Service>of(s1), NodeProperties.builder().setHostname("host1").addIPAddress("access_v4", "ip1").build()); Node node2 = new Node("node2", "1", ImmutableSet.<Service>of(s1), NodeProperties.builder().setHostname("host2").addIPAddress("access_v4", "ip2").build()); Set<Node> clusterNodes = ImmutableSet.of(node1, node2); TaskDag expected = new TaskDag(); TaskNode taskNode1 = new TaskNode(node1.getId(), ProvisionerAction.DELETE.name(), ""); TaskNode taskNode2 = new TaskNode(node2.getId(), ProvisionerAction.DELETE.name(), ""); expected.addTaskNode(taskNode1); expected.addTaskNode(taskNode2); ClusterJob job = new ClusterJob(JobId.fromString("123-001"), ClusterAction.CLUSTER_DELETE); JobPlanner planner = new JobPlanner(job, clusterNodes); TaskDag actual = planner.createTaskDag(); Assert.assertEquals(expected, actual); List<Set<TaskNode>> linearizedTasks = actual.linearize(); Assert.assertEquals(1, linearizedTasks.size()); Assert.assertEquals(2, linearizedTasks.get(0).size()); Assert.assertTrue(linearizedTasks.get(0).contains(taskNode1)); Assert.assertTrue(linearizedTasks.get(0).contains(taskNode2)); }
new TaskNode("1", "initialize", "region_server")); // cross dependency List<Set<TaskNode>> actual = taskDag.linearize();
taskDag.addDependency(new TaskNode("2", "configure", "hbase_master"), new TaskNode("2", "start", "hbase_master")); List<Set<TaskNode>> actual = taskDag.linearize();
@Test(expected = IllegalStateException.class) public void testNoDag() { TaskDag taskDag = new TaskDag(); taskDag.addDependency(new TaskNode("1", "provision", ""), new TaskNode("1", "bootstrap", "")); taskDag.addDependency(new TaskNode("1", "bootstrap", ""), new TaskNode("1", "install", "datanode")); taskDag.addDependency(new TaskNode("1", "install", "datanode"), new TaskNode("1", "configure", "datanode")); taskDag.addDependency(new TaskNode("1", "configure", "datanode"), new TaskNode("1", "start", "datanode")); taskDag.addDependency(new TaskNode("1", "provision", ""), new TaskNode("1", "bootstrap", "")); taskDag.addDependency(new TaskNode("1", "bootstrap", ""), new TaskNode("1", "bootstrap", "")); // cycle taskDag.addDependency(new TaskNode("1", "bootstrap", ""), new TaskNode("1", "install", "region_server")); taskDag.addDependency(new TaskNode("1", "install", "region_server"), new TaskNode("1", "configure", "region_server")); taskDag.addDependency(new TaskNode("1", "start", "datanode"), new TaskNode("1", "configure", "region_server")); // cross dependency taskDag.addDependency(new TaskNode("1", "configure", "region_server"), new TaskNode("1", "start", "region_server")); taskDag.linearize(); // Should throw exception as there is a cycle. }