Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ApplicationMasterService.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ApplicationMasterService.java (revision 1454596) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ApplicationMasterService.java (working copy) @@ -284,6 +284,11 @@ Allocation allocation = this.rScheduler.allocate(appAttemptId, ask, release); + if (allocation.getError()) { + allocateResponse.setAMResponse(reboot); + return allocateResponse; + } + RMApp app = this.rmContext.getRMApps().get( appAttemptId.getApplicationId()); RMAppAttempt appAttempt = app.getRMAppAttempt(appAttemptId); Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java (revision 1454596) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java (working copy) @@ -217,8 +217,8 @@ } } - private static final Allocation EMPTY_ALLOCATION = - new Allocation(EMPTY_CONTAINER_LIST, Resources.createResource(0)); + private static final Allocation EMPTY_ALLOCATION_WITH_ERROR = + new Allocation(EMPTY_CONTAINER_LIST, Resources.createResource(0), true); @Override public Allocation allocate( ApplicationAttemptId applicationAttemptId, List ask, @@ -227,7 +227,7 @@ if (application == null) { LOG.error("Calling allocate on removed " + "or non existant application " + applicationAttemptId); - return EMPTY_ALLOCATION; + return EMPTY_ALLOCATION_WITH_ERROR; } // Sanity check @@ -252,6 +252,15 @@ } synchronized (application) { + + // make sure we aren't stopping/removing the application + // when the allocate comes in + if (application.isStopped()) { + LOG.info("Calling allocate on a stopped " + + "application " + applicationAttemptId); + return EMPTY_ALLOCATION_WITH_ERROR; + } + if (!ask.isEmpty()) { LOG.debug("allocate: pre-update" + " applicationId=" + applicationAttemptId + Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/common/fica/FiCaSchedulerApp.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/common/fica/FiCaSchedulerApp.java (revision 1454596) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/common/fica/FiCaSchedulerApp.java (working copy) @@ -92,6 +92,9 @@ final Map> reservedContainers = new HashMap>(); + + private boolean isStopped = false; + /** * Count how many times the application has been given an opportunity @@ -133,7 +136,9 @@ public synchronized void updateResourceRequests( List requests) { - this.appSchedulingInfo.updateResourceRequests(requests); + if (!isStopped) { + this.appSchedulingInfo.updateResourceRequests(requests); + } } public Map getResourceRequests(Priority priority) { @@ -169,6 +174,10 @@ return this.appSchedulingInfo.isPending(); } + public synchronized boolean isStopped() { + return this.isStopped; + } + public String getQueueName() { return this.appSchedulingInfo.getQueueName(); } @@ -184,6 +193,7 @@ public synchronized void stop(RMAppAttemptState rmAppAttemptFinalState) { // Cleanup all scheduling information + this.isStopped = true; this.appSchedulingInfo.stop(rmAppAttemptFinalState); } @@ -235,6 +245,10 @@ synchronized public RMContainer allocate(NodeType type, FiCaSchedulerNode node, Priority priority, ResourceRequest request, Container container) { + + if (isStopped) { + return null; + } // Required sanity check - AM can call 'allocate' to update resource // request without locking the scheduler, hence we need to check Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java (revision 1454596) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java (working copy) @@ -466,8 +466,8 @@ applications.remove(applicationAttemptId); } - private static final Allocation EMPTY_ALLOCATION = - new Allocation(EMPTY_CONTAINER_LIST, Resources.createResource(0, 0)); + private static final Allocation EMPTY_ALLOCATION_WITH_ERROR = + new Allocation(EMPTY_CONTAINER_LIST, Resources.createResource(0, 0), true); @Override @Lock(Lock.NoLock.class) @@ -478,7 +478,7 @@ if (application == null) { LOG.info("Calling allocate on removed " + "or non existant application " + applicationAttemptId); - return EMPTY_ALLOCATION; + return EMPTY_ALLOCATION_WITH_ERROR; } // Sanity check @@ -504,6 +504,14 @@ synchronized (application) { + // make sure we aren't stopping/removing the application + // when the allocate comes in + if (application.isStopped()) { + LOG.info("Calling allocate on a stopped " + + "application " + applicationAttemptId); + return EMPTY_ALLOCATION_WITH_ERROR; + } + if (!ask.isEmpty()) { if(LOG.isDebugEnabled()) { Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/Allocation.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/Allocation.java (revision 1454596) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/Allocation.java (working copy) @@ -26,12 +26,21 @@ public class Allocation { final List containers; final Resource resourceLimit; + final Boolean error; public Allocation(List containers, Resource resourceLimit) { this.containers = containers; this.resourceLimit = resourceLimit; + this.error = false; } + public Allocation(List containers, Resource resourceLimit, + Boolean error) { + this.containers = containers; + this.resourceLimit = resourceLimit; + this.error = error; + } + public List getContainers() { return containers; } @@ -39,5 +48,12 @@ public Resource getResourceLimit() { return resourceLimit; } + + /** + * Check if an error occurred during Allocation + */ + public Boolean getError() { + return error; + } }