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/fair/QueuePlacementPolicy.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/QueuePlacementPolicy.java index 30ea213..45e62b8 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/QueuePlacementPolicy.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/QueuePlacementPolicy.java @@ -166,7 +166,13 @@ public String assignAppToQueue(String requestedQueue, String user) for (QueuePlacementRule rule : rules) { String queue = rule.assignAppToQueue(requestedQueue, user, groups, configuredQueues); - if (queue == null || !queue.isEmpty()) { + // Reject + if (queue == null) { + return queue; + } + // Queue must be leaf queue + if (!queue.isEmpty() + && !configuredQueues.get(FSQueueType.PARENT).contains(queue)) { 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/fair/TestQueuePlacementPolicy.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestQueuePlacementPolicy.java index 32dba5c..9ea3911 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestQueuePlacementPolicy.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestQueuePlacementPolicy.java @@ -393,6 +393,40 @@ public void testGroupContainsPeriod() throws Exception { SimpleGroupsMapping.class, GroupMappingServiceProvider.class); } + @Test + public void testPolicyWithParentQueue() throws Exception { + // User Queue is Parent Queue + StringBuffer sb = new StringBuffer(); + sb.append(""); + sb.append(" "); + sb.append(" "); + sb.append(""); + QueuePlacementPolicy policy = parse(sb.toString()); + configuredQueues.get(FSQueueType.PARENT).add("root.user1"); + assertEquals("root.default", + policy.assignAppToQueue("root.user1", "user1")); + // Primary Group Queue is Parent Queue + sb = new StringBuffer(); + sb.append(""); + sb.append(" "); + sb.append(" "); + sb.append(""); + policy = parse(sb.toString()); + configuredQueues.get(FSQueueType.PARENT).add("root.user1group"); + assertEquals("root.default", + policy.assignAppToQueue("root.user1group", "user1")); + // Secondary Group Queue is Parent Queue + sb = new StringBuffer(); + sb.append(""); + sb.append(" "); + sb.append(" "); + sb.append(""); + policy = parse(sb.toString()); + configuredQueues.get(FSQueueType.PARENT).add("root.user1subgroup1"); + assertEquals("root.default", + policy.assignAppToQueue("root.user1subgroup1", "user1")); + } + private QueuePlacementPolicy parse(String str) throws Exception { // Read and parse the allocations file. DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory