diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSPreemptionThread.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSPreemptionThread.java index 6ed90f816a5..3b5ffe5d609 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSPreemptionThread.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSPreemptionThread.java @@ -102,7 +102,8 @@ public void run() { * optimizing for least number of AM container preemptions. Only nodes * that match the locality level specified in the {@link ResourceRequest} * are considered. However, if this would lead to AM preemption, and locality - * relaxation is allowed, then the search space is expanded to all nodes. + * relaxation is allowed, then the search space is expanded to the remaining + * nodes. * * @param starvedApp starved application for which we are identifying * preemption targets @@ -122,12 +123,15 @@ public void run() { // Don't preempt AM containers just to satisfy local requests if relax // locality is enabled. - if (bestContainers != null - && bestContainers.numAMContainers > 0 - && !ResourceRequest.isAnyLocation(rr.getResourceName()) - && rr.getRelaxLocality()) { + if (rr.getRelaxLocality() + && !ResourceRequest.isAnyLocation(rr.getResourceName()) + && bestContainers != null + && bestContainers.numAMContainers > 0) { + List remainingNodes = + scheduler.getNodeTracker().getAllNodes(); + remainingNodes.removeAll(potentialNodes); bestContainers = identifyContainersToPreemptForOneContainer( - scheduler.getNodeTracker().getAllNodes(), rr); + remainingNodes, rr); } if (bestContainers != null) {