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