diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerQueueManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerQueueManager.java index eb50123..d0fab80 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerQueueManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerQueueManager.java @@ -136,7 +136,18 @@ public void addQueue(String queueName, CSQueue queue) { @Override public CSQueue getQueue(String queueName) { - return queues.get(queueName); + CSQueue queue = queues.get(queueName); + if (queue == null && queueName.contains(".")) { + String queuePath = + queueName.startsWith("root.") ? queueName : "root." + queueName; + String confirmedQueueName = + queueName.substring(queueName.lastIndexOf(".") + 1); + queue = queues.get(confirmedQueueName); + if (queue != null && !queue.getQueuePath().equals(queuePath)) { + queue = null; + } + } + return queue; } /** diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java index e91f734..1096201 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java @@ -4881,4 +4881,51 @@ private void waitforNMRegistered(ResourceScheduler scheduler, int nodecount, } } } + + @Test(timeout = 30000) + public void testSubmitAppWithQueuePath() throws Exception { + Configuration conf = + TestUtils.getConfigurationWithQueueLabels(new Configuration(false)); + + final RMNodeLabelsManager mgr = new NullRMNodeLabelsManager(); + mgr.init(conf); + + MockRM rm = new MockRM(conf) { + protected RMNodeLabelsManager createNodeLabelManager() { + return mgr; + } + }; + + rm.start(); + MockNM nm1 = + new MockNM("h1:1234", 200 * GB, rm.getResourceTrackerService()); + nm1.registerNode(); + + // launch app1 successfully with queue path : root.a.a1 + RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "root.a.a1", false); + waitUnitAcceptedOrFailed(app1); + Assert.assertEquals(RMAppState.ACCEPTED, app1.getState()); + + // launch app2 successfully with non-root queue path : a.a1 + RMApp app2 = rm.submitApp(1 * GB, "app", "user", null, "a.a1", false); + waitUnitAcceptedOrFailed(app2); + Assert.assertEquals(RMAppState.ACCEPTED, app2.getState()); + + // fail to launch app3 with incorrect queue path : root.b.a1 + RMApp app3 = rm.submitApp(1 * GB, "app", "user", null, "root.b.a1", false); + waitUnitAcceptedOrFailed(app3); + Assert.assertEquals(RMAppState.FAILED, app3.getState()); + } + + private void waitUnitAcceptedOrFailed(RMApp app) throws InterruptedException { + int msecToWait = 5000; + int msecToSleep = 500; + while (app.getState() != RMAppState.ACCEPTED + && app.getState() != RMAppState.FAILED && msecToWait > 0) { + LOG.info("Waiting for AppAttempt to reach LAUNCHED state. " + + "Current state is " + app.getState()); + Thread.sleep(msecToSleep); + msecToWait -= msecToSleep; + } + } }