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/FSParentQueue.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSParentQueue.java index 16570aa..f2e5086 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSParentQueue.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSParentQueue.java @@ -109,21 +109,6 @@ void recomputeSteadyShares() { } @Override - public void updatePreemptionVariables() { - super.updatePreemptionVariables(); - // For child queues - - readLock.lock(); - try { - for (FSQueue childQueue : childQueues) { - childQueue.updatePreemptionVariables(); - } - } finally { - readLock.unlock(); - } - } - - @Override public Resource getDemand() { readLock.lock(); try { 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..a4eeedc 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 @@ -102,6 +102,7 @@ public FSQueue(String name, FairScheduler scheduler, FSParentQueue parent) { public void init() { AllocationConfiguration allocConf = scheduler.getAllocationConfiguration(); allocConf.initFSQueue(this, scheduler); + updatePreemptionVariables(); } public String getName() { @@ -329,7 +330,7 @@ public void update(Resource fairShare, boolean checkStarvation) { * Update the min/fair share preemption timeouts, threshold and preemption * disabled flag for this queue. */ - public void updatePreemptionVariables() { + private void updatePreemptionVariables() { // For min share timeout minSharePreemptionTimeout = scheduler.getAllocationConfiguration() .getMinSharePreemptionTimeout(getName()); @@ -348,9 +349,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()); + } } /** 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/QueueManager.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/QueueManager.java index bca0ea4..8884731 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/QueueManager.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/QueueManager.java @@ -285,7 +285,6 @@ private FSQueue createNewQueues(FSQueueType queueType, parent.addChildQueue(queue); setChildResourceLimits(parent, queue, queueConf); queues.put(queue.getName(), queue); - queue.updatePreemptionVariables(); // If we just created a leaf node, the newParent is null, but that's OK // because we only create a leaf node in the very last iteration. @@ -504,9 +503,6 @@ public void updateAllocationConfiguration(AllocationConfiguration queueConf) { // Update steady fair shares for all queues rootQueue.recomputeSteadyShares(); - // Update the fair share preemption timeouts and preemption for all queues - // recursively - rootQueue.updatePreemptionVariables(); } /**