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 a9591a5..3002e36 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 @@ -580,15 +580,8 @@ boolean canContainerBePreempted(RMContainer container) { return false; } - // Check if any of the parent queues are not preemptable - // TODO (YARN-5831): Propagate the "preemptable" flag all the way down to - // the app to avoid recursing up every time. - for (FSQueue q = getQueue(); - !q.getQueueName().equals("root"); - q = q.getParent()) { - if (!q.isPreemptable()) { - return false; - } + if (!getQueue().isPreemptable()) { + return false; } // Check if the app's allocation will be over its fairshare even 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/FSQueue.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSQueue.java index d87668d..ad0c4ee 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSQueue.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSQueue.java @@ -348,9 +348,15 @@ public void updatePreemptionVariables() { if (fairSharePreemptionThreshold < 0 && parent != null) { fairSharePreemptionThreshold = parent.getFairSharePreemptionThreshold(); } - // For option whether allow preemption from this queue - preemptable = scheduler.getAllocationConfiguration() - .isPreemptable(getName()); + // For option whether allow preemption from this queue. + // if parent is non-preemptable, this queue is non-preemptable as well, + // otherwise get the value from the allocation file. + if (parent != null && !parent.isPreemptable()) { + preemptable = false; + } else { + preemptable = scheduler.getAllocationConfiguration() + .isPreemptable(getName()); + } } /**