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 cdde25d23e6..de128e6d12d 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 @@ -66,6 +66,9 @@ private static final Logger LOG = LoggerFactory.getLogger( CapacitySchedulerQueueManager.class); + private static final String NON_ROOT_QUEUE_PATH_PREFIX = + CapacitySchedulerConfiguration.ROOT + CapacitySchedulerConfiguration.DOT; + static final Comparator NON_PARTITIONED_QUEUE_COMPARATOR = new Comparator() { @Override @@ -136,7 +139,19 @@ 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(CapacitySchedulerConfiguration.DOT)) { + String queuePath = queueName.startsWith(NON_ROOT_QUEUE_PATH_PREFIX) ? + queueName : NON_ROOT_QUEUE_PATH_PREFIX + queueName; + String confirmedQueueName = queueName.substring( + queueName.lastIndexOf(CapacitySchedulerConfiguration.DOT) + 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 855c793edc5..bb90e69b586 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 @@ -5506,4 +5506,34 @@ public void testCSQueueMetrics() throws Exception { assertEquals(51200, ((CSQueueMetrics)cs.getQueue("a2").getMetrics()).getMaxCapacityMB()); assertEquals(25600, ((CSQueueMetrics)cs.getQueue("a3").getMetrics()).getMaxCapacityMB()); } + + @Test(timeout = 30000) + public void testSubmitAppWithQueuePath() throws Exception { + Configuration conf = + TestUtils.getConfigurationWithQueueLabels(new Configuration(false)); + + MockRM rm = new MockRM(conf); + rm.start(); + MockNM nm1 = + new MockNM("h1:1234", 200 * GB, rm.getResourceTrackerService()); + nm1.registerNode(); + + // launch app1 successfully with queue name : a1 + RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "a1", true); + Assert.assertEquals(RMAppState.ACCEPTED, app1.getState()); + + // launch app2 successfully with queue path : root.a.a1 + RMApp app2 = rm.submitApp(1 * GB, "app", "user", null, "root.a.a1", true); + Assert.assertEquals(RMAppState.ACCEPTED, app2.getState()); + + // launch app3 successfully with non-root queue path : a.a1 + RMApp app3 = rm.submitApp(1 * GB, "app", "user", null, "a.a1", true); + Assert.assertEquals(RMAppState.ACCEPTED, app3.getState()); + + // fail to launch app4 with incorrect queue path : root.b.a1 + RMApp app4 = rm.submitApp(1 * GB, "app", "user", null, "root.b.a1", false); + GenericTestUtils + .waitFor(() -> app4.getState() == RMAppState.FAILED, 100, 5000); + Assert.assertEquals(RMAppState.FAILED, app4.getState()); + } }