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 1ace604..2706317 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 @@ -1049,7 +1049,8 @@ private synchronized void attemptScheduling(FSSchedulerNode node) { FSQueue queue = reservedAppSchedulable.getQueue(); if (!reservedAppSchedulable.hasContainerForNode(reservedPriority, node) - || !fitInMaxShare(queue)) { + || !fitInMaxShare(queue, + reservedAppSchedulable.getResource(reservedPriority))) { // Don't hold the reservation if app can no longer use it LOG.info("Releasing reservation that cannot be satisfied for application " + reservedAppSchedulable.getApplicationAttemptId() @@ -1084,14 +1085,17 @@ private synchronized void attemptScheduling(FSSchedulerNode node) { updateRootQueueMetrics(); } - private boolean fitInMaxShare(FSQueue queue) { - if (Resources.fitsIn(queue.getResourceUsage(), queue.getMaxShare())) { + private boolean fitInMaxShare(FSQueue queue, Resource reservationResource) { + Resource reservationPlusUsage = + Resources.add(queue.getResourceUsage(), reservationResource); + + if (!Resources.fitsIn(reservationPlusUsage, queue.getMaxShare())) { return false; } FSQueue parentQueue = queue.getParent(); if (parentQueue != null) { - return fitInMaxShare(parentQueue); + return fitInMaxShare(parentQueue, reservationResource); } return true; }