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:
parent
b1f87bbabd
commit
b06cc16f7d
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue