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..4476779 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
@@ -392,6 +392,39 @@ public void testGroupContainsPeriod() throws Exception {
conf.setClass(CommonConfigurationKeys.HADOOP_SECURITY_GROUP_MAPPING,
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.