diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java index 81fbc16..16b543c 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java @@ -604,6 +604,15 @@ public FairSchedulerEventLog getEventLog() { */ protected synchronized void addApplication( ApplicationAttemptId applicationAttemptId, String queueName, String user) { + if (queueName == null || queueName.isEmpty()) { + String message = "Reject application " + applicationAttemptId + + " submitted by user " + user + " with an empty queue name."; + LOG.info(message); + rmContext.getDispatcher().getEventHandler().handle( + new RMAppAttemptRejectedEvent(applicationAttemptId, message)); + return; + } + RMApp rmApp = rmContext.getRMApps().get(applicationAttemptId); FSLeafQueue queue = assignToQueue(rmApp, queueName, user); diff --git 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 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 0560d17..8be344c 100644 --- 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 +++ 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 @@ -558,7 +558,26 @@ public void testUserAsDefaultQueue() throws Exception { assertEquals(0, scheduler.getQueueManager().getLeafQueue("user2") .getAppSchedulables().size()); } - + + @Test + public void testEmptyQueueName() throws Exception { + Configuration conf = createConfiguration(); + + // only default queue + assertEquals(1, scheduler.getQueueManager().getLeafQueues().size()); + + // submit app with empty queue + ApplicationAttemptId appAttemptId = createAppAttemptId(1, 1); + AppAddedSchedulerEvent appAddedEvent = new AppAddedSchedulerEvent( + appAttemptId, "", "user1"); + scheduler.handle(appAddedEvent); + + // submission rejected + assertEquals(1, scheduler.getQueueManager().getLeafQueues().size()); + assertNull(scheduler.getSchedulerApp(appAttemptId)); + assertEquals(0, resourceManager.getRMContext().getRMApps().size()); + } + @Test public void testAssignToQueue() throws Exception { Configuration conf = createConfiguration(); @@ -1929,7 +1948,7 @@ public void testCancelStrictLocality() { scheduler.handle(node2UpdateEvent); assertEquals(1, app.getLiveContainers().size()); } - + /** * If we update our ask to strictly request a node, it doesn't make sense to keep * a reservation on another.