YARN-1774. FS: Submitting to non-leaf queue throws NPE. (Anubhav Dhoot and Karthik Kambatla via kasha)

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1575415 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Karthik Kambatla 2014-03-07 21:34:19 +00:00
parent b1f87bbabd
commit b06cc16f7d
3 changed files with 42 additions and 11 deletions

View File

@ -413,6 +413,8 @@ Release 2.4.0 - UNRELEASED
YARN-1768. Fixed error message being too verbose when killing a non-existent YARN-1768. Fixed error message being too verbose when killing a non-existent
application application
YARN-1774. FS: Submitting to non-leaf queue throws NPE. (Anubhav Dhoot and
Karthik Kambatla via kasha)
Release 2.3.1 - UNRELEASED Release 2.3.1 - UNRELEASED

View File

@ -611,9 +611,6 @@ public class FairScheduler extends AbstractYarnScheduler {
RMApp rmApp = rmContext.getRMApps().get(applicationId); RMApp rmApp = rmContext.getRMApps().get(applicationId);
FSLeafQueue queue = assignToQueue(rmApp, queueName, user); FSLeafQueue queue = assignToQueue(rmApp, queueName, user);
if (queue == null) { if (queue == null) {
rmContext.getDispatcher().getEventHandler().handle(
new RMAppRejectedEvent(applicationId,
"Application rejected by queue placement policy"));
return; return;
} }
@ -680,26 +677,42 @@ public class FairScheduler extends AbstractYarnScheduler {
RMAppAttemptEventType.ATTEMPT_ADDED)); RMAppAttemptEventType.ATTEMPT_ADDED));
} }
/**
* Helper method that attempts to assign the app to a queue. The method is
* responsible to call the appropriate event-handler if the app is rejected.
*/
@VisibleForTesting @VisibleForTesting
FSLeafQueue assignToQueue(RMApp rmApp, String queueName, String user) { FSLeafQueue assignToQueue(RMApp rmApp, String queueName, String user) {
FSLeafQueue queue = null; FSLeafQueue queue = null;
String appRejectMsg = null;
try { try {
QueuePlacementPolicy placementPolicy = allocConf.getPlacementPolicy(); QueuePlacementPolicy placementPolicy = allocConf.getPlacementPolicy();
queueName = placementPolicy.assignAppToQueue(queueName, user); queueName = placementPolicy.assignAppToQueue(queueName, user);
if (queueName == null) { if (queueName == null) {
return null; appRejectMsg = "Application rejected by queue placement policy";
} } else {
queue = queueMgr.getLeafQueue(queueName, true); queue = queueMgr.getLeafQueue(queueName, true);
} catch (IOException ex) { if (queue == null) {
LOG.error("Error assigning app to queue, rejecting", ex); appRejectMsg = queueName + " is not a leaf queue";
}
}
} catch (IOException ioe) {
appRejectMsg = "Error assigning app to queue " + queueName;
}
if (appRejectMsg != null && rmApp != null) {
LOG.error(appRejectMsg);
rmContext.getDispatcher().getEventHandler().handle(
new RMAppRejectedEvent(rmApp.getApplicationId(), appRejectMsg));
return null;
} }
if (rmApp != null) { if (rmApp != null) {
rmApp.setQueue(queue.getName()); rmApp.setQueue(queue.getName());
} else { } else {
LOG.warn("Couldn't find RM app to set queue name on"); LOG.error("Couldn't find RM app to set queue name on");
} }
return queue; return queue;
} }

View File

@ -705,6 +705,22 @@ public class TestFairScheduler {
assertEquals("root.notdefault", rmApp2.getQueue()); assertEquals("root.notdefault", rmApp2.getQueue());
} }
@Test
public void testAssignToNonLeafQueueReturnsNull() throws Exception {
conf.set(FairSchedulerConfiguration.USER_AS_DEFAULT_QUEUE, "true");
scheduler.reinitialize(conf, resourceManager.getRMContext());
scheduler.getQueueManager().getLeafQueue("root.child1.granchild", true);
scheduler.getQueueManager().getLeafQueue("root.child2", 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"));
}
@Test @Test
public void testQueuePlacementWithPolicy() throws Exception { public void testQueuePlacementWithPolicy() throws Exception {
conf.setClass(CommonConfigurationKeys.HADOOP_SECURITY_GROUP_MAPPING, conf.setClass(CommonConfigurationKeys.HADOOP_SECURITY_GROUP_MAPPING,