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/QueueManager.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/QueueManager.java
index 6556717..13aa3c0 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/QueueManager.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/QueueManager.java
@@ -88,7 +88,8 @@ public void initialize(Configuration conf) throws IOException,
public FSLeafQueue getLeafQueue(String name, boolean create) {
FSQueue queue = getQueue(name, create, FSQueueType.LEAF);
if (queue instanceof FSParentQueue) {
- return null;
+ return getLeafQueue(
+ queue.getName() + "." + YarnConfiguration.DEFAULT_QUEUE_NAME, create);
}
return (FSLeafQueue) 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/TestFairScheduler.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/TestFairScheduler.java
index c352cc9..1199786 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/TestFairScheduler.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/TestFairScheduler.java
@@ -72,6 +72,8 @@
import org.apache.hadoop.yarn.server.resourcemanager.ApplicationMasterService;
import org.apache.hadoop.yarn.server.resourcemanager.MockNodes;
import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
import org.apache.hadoop.yarn.server.resourcemanager.resource.ResourceType;
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.MockRMApp;
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
@@ -626,17 +628,17 @@ public void testHierarchicalQueuesSimilarParents() throws IOException {
Assert.assertEquals("root.parent.child", leafQueue.getName());
FSLeafQueue leafQueue2 = queueManager.getLeafQueue("parent", true);
- Assert.assertNull(leafQueue2);
- Assert.assertEquals(2, queueManager.getLeafQueues().size());
+ Assert.assertNotNull(leafQueue2);
+ Assert.assertEquals(3, queueManager.getLeafQueues().size());
FSLeafQueue leafQueue3 = queueManager.getLeafQueue("parent.child.grandchild", true);
Assert.assertNull(leafQueue3);
- Assert.assertEquals(2, queueManager.getLeafQueues().size());
+ Assert.assertEquals(3, queueManager.getLeafQueues().size());
FSLeafQueue leafQueue4 = queueManager.getLeafQueue("parent.sister", true);
Assert.assertNotNull(leafQueue4);
Assert.assertEquals("root.parent.sister", leafQueue4.getName());
- Assert.assertEquals(3, queueManager.getLeafQueues().size());
+ Assert.assertEquals(4, queueManager.getLeafQueues().size());
}
@Test
@@ -843,6 +845,63 @@ public void testContainerReservationAttemptExceedingQueueMax()
getCurrentReservation().getMemory());
}
+ @Test
+ public void testAssignLeafQueueAsDefault() throws Exception {
+
+ conf.set(FairSchedulerConfiguration.ALLOCATION_FILE, ALLOC_FILE);
+ conf.set(FairSchedulerConfiguration.USER_AS_DEFAULT_QUEUE, "true");
+
+ PrintWriter out = new PrintWriter(new FileWriter(ALLOC_FILE));
+ out.println("");
+ out.println("");
+ out.println("");
+ out.println("1024mb,0vcores");
+ out.println("4096mb,10vcores");
+ out.println("");
+ out.println("1024mb,0vcores");
+ out.println("");
+ out.println("");
+ out.println("1024mb,0vcores");
+ out.println("");
+ out.println("");
+ out.println("");
+ out.close();
+
+ scheduler.init(conf);
+ scheduler.start();
+ scheduler.reinitialize(conf, resourceManager.getRMContext());
+ QueueManager queueManager = scheduler.getQueueManager();
+ Collection leafQueues = queueManager.getLeafQueues();
+ Assert.assertEquals(3, leafQueues.size());
+ Assert.assertNotNull(queueManager.getLeafQueue("parentQueue.tier1", false));
+ Assert.assertNotNull(queueManager.getLeafQueue("parentQueue.tier2", false));
+ Assert.assertNotNull(queueManager.getLeafQueue(
+ YarnConfiguration.DEFAULT_QUEUE_NAME, false));
+ // Make sure querying for queues didn't create any new ones:
+ Assert.assertEquals(3, leafQueues.size());
+
+ RMContext rmContext = resourceManager.getRMContext();
+ Map appsMap = rmContext.getRMApps();
+ ApplicationAttemptId appAttemptId = createAppAttemptId(1, 1);
+ RMApp rmApp = new RMAppImpl(appAttemptId.getApplicationId(), rmContext,
+ conf, null, null, null, ApplicationSubmissionContext.newInstance(null,
+ null, null, null, null, false, false, 0, null, null), null, null, 0,
+ null, null, null);
+ appsMap.put(appAttemptId.getApplicationId(), rmApp);
+
+ AppAddedSchedulerEvent appAddedEvent =
+ new AppAddedSchedulerEvent(appAttemptId.getApplicationId(), "parentQueue",
+ "user1");
+ scheduler.handle(appAddedEvent);
+ AppAttemptAddedSchedulerEvent attempAddedEvent =
+ new AppAttemptAddedSchedulerEvent(appAttemptId, false);
+ scheduler.handle(attempAddedEvent);
+ assertEquals(1, scheduler.getQueueManager().getLeafQueue("parentQueue." +
+ YarnConfiguration.DEFAULT_QUEUE_NAME, true).getNumRunnableApps());
+ assertEquals("root.parentQueue." +
+ YarnConfiguration.DEFAULT_QUEUE_NAME, rmApp.getQueue());
+ }
+
@Test (timeout = 500000)
public void testContainerReservationNotExceedingQueueMax() throws Exception {
conf.set(FairSchedulerConfiguration.ALLOCATION_FILE, ALLOC_FILE);
@@ -1021,21 +1080,22 @@ public void testAssignToQueue() throws Exception {
}
@Test
- public void testAssignToNonLeafQueueReturnsNull() throws Exception {
+ public void testAssignToNonLeafQueue() throws Exception {
conf.set(FairSchedulerConfiguration.USER_AS_DEFAULT_QUEUE, "true");
scheduler.init(conf);
scheduler.start();
scheduler.reinitialize(conf, resourceManager.getRMContext());
- scheduler.getQueueManager().getLeafQueue("root.child1.granchild", true);
- scheduler.getQueueManager().getLeafQueue("root.child2", true);
+ scheduler.getQueueManager().getLeafQueue("root.parent.tier1", true);
+ scheduler.getQueueManager().getLeafQueue("root.parent.tier2", true);
RMApp rmApp1 = new MockRMApp(0, 0, RMAppState.NEW);
RMApp rmApp2 = new MockRMApp(1, 1, RMAppState.NEW);
- // Trying to assign to non leaf queue would return null
- assertNull(scheduler.assignToQueue(rmApp1, "root.child1", "tintin"));
- assertNotNull(scheduler.assignToQueue(rmApp2, "root.child2", "snowy"));
+ // Trying to assign to non leaf queue would default subqueue
+ FSQueue queue = scheduler.assignToQueue(rmApp1, "root.parent", "tintin");
+ assertEquals("Queue assignment is not correct", "root.parent." +
+ YarnConfiguration.DEFAULT_QUEUE_NAME, queue.getName());
}
@Test