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/QueuePlacementRule.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/QueuePlacementRule.java index 6acba27..031e70d 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/QueuePlacementRule.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/QueuePlacementRule.java @@ -31,6 +31,7 @@ public abstract class QueuePlacementRule { protected boolean create; + protected String prefix; /** * Initializes the rule with any arguments. @@ -40,6 +41,16 @@ */ public QueuePlacementRule initialize(boolean create, Map args) { this.create = create; + String parent = (args != null) ? args.get("parent") : null; + if (parent != null) { + if (parent.endsWith(".")) + parent = parent.substring(0, parent.length() - 1); + if (parent.startsWith("root")) + parent = parent.replace("root", ""); + this.prefix = "root." + parent + "."; + } else { + this.prefix = "root."; + } return this; } @@ -113,7 +124,7 @@ protected abstract String getQueueForApp(String requestedQueue, String user, @Override protected String getQueueForApp(String requestedQueue, String user, Groups groups, Collection configuredQueues) { - return "root." + user; + return prefix + user; } @Override @@ -130,7 +141,7 @@ public boolean isTerminal() { protected String getQueueForApp(String requestedQueue, String user, Groups groups, Collection configuredQueues) throws IOException { - return "root." + groups.getGroups(user).get(0); + return prefix + groups.getGroups(user).get(0); } @Override @@ -152,8 +163,8 @@ protected String getQueueForApp(String requestedQueue, Collection configuredQueues) throws IOException { List groupNames = groups.getGroups(user); for (int i = 1; i < groupNames.size(); i++) { - if (configuredQueues.contains("root." + groupNames.get(i))) { - return "root." + groupNames.get(i); + if (configuredQueues.contains(prefix + groupNames.get(i))) { + return prefix + groupNames.get(i); } } @@ -176,8 +187,8 @@ protected String getQueueForApp(String requestedQueue, if (requestedQueue.equals(YarnConfiguration.DEFAULT_QUEUE_NAME)) { return ""; } else { - if (!requestedQueue.startsWith("root.")) { - requestedQueue = "root." + requestedQueue; + if (!requestedQueue.startsWith(prefix)) { + requestedQueue = prefix + requestedQueue; } return requestedQueue; } 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 fd807c9..d91fd30 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 @@ -57,7 +57,20 @@ public void testSpecifiedUserPolicy() throws Exception { assertEquals("root.someuser", policy.assignAppToQueue("default", "someuser")); assertEquals("root.otheruser", policy.assignAppToQueue("default", "otheruser")); } - + + @Test + public void testSpecifiedUserPolicyWithPrefix() throws Exception { + StringBuffer sb = new StringBuffer(); + sb.append(""); + sb.append(" "); + sb.append(" "); + sb.append(""); + QueuePlacementPolicy policy = parse(sb.toString()); + assertEquals("root.granted.specifiedq",policy.assignAppToQueue("specifiedq", "someuser")); + assertEquals("root.guests.someuser", policy.assignAppToQueue("default", "someuser")); + assertEquals("root.guests.otheruser", policy.assignAppToQueue("default", "otheruser")); + } + @Test public void testNoCreate() throws Exception { StringBuffer sb = new StringBuffer();