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/FSAppAttempt.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSAppAttempt.java index 5dfef731e20..ef77295d5be 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSAppAttempt.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSAppAttempt.java @@ -612,9 +612,16 @@ boolean canContainerBePreempted(RMContainer container) { // Check if the app's allocation will be over its fairshare even // after preempting this container - Resource usageAfterPreemption = Resources.subtract( - getResourceUsage(), container.getAllocatedResource()); + Resource usageAfterPreemption = Resources.clone(getResourceUsage()); + // Subtract resources of containers already queued for preemption + synchronized (preemptionVariablesLock) { + Resources.subtractFrom(usageAfterPreemption, preemptedResources); + } + + // Subtract this container's allocation to compute usage after preemption + Resources.subtractFrom( + usageAfterPreemption, container.getAllocatedResource()); return !isUsageBelowShare(usageAfterPreemption, getFairShare()); } @@ -1268,13 +1275,7 @@ public Resource getMaxShare() { @Override public Resource getResourceUsage() { - // Subtract copies the object, so that we have a snapshot, - // in case usage changes, while the caller is using the value - synchronized (preemptionVariablesLock) { - return containersToPreempt.isEmpty() - ? getCurrentConsumption() - : Resources.subtract(getCurrentConsumption(), preemptedResources); - } + return getCurrentConsumption(); } @Override