From fa1aaee87b0141a0255b5f8e5fd8e8f49d7efe86 Mon Sep 17 00:00:00 2001 From: Naganarasimha Date: Sat, 1 Jul 2017 12:29:39 +0530 Subject: [PATCH] YARN-6681. Eliminate double-copy of child queues in canAssignToThisQueue. Contributed by Daryn Sharp. --- .../scheduler/capacity/AbstractCSQueue.java | 8 +++++++- .../resourcemanager/scheduler/capacity/ParentQueue.java | 7 ++++++- 2 files changed, 13 insertions(+), 2 deletions(-) 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/capacity/AbstractCSQueue.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java index b69ec961fb1..5fbdead6346 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -615,6 +616,11 @@ public abstract class AbstractCSQueue implements CSQueue { minimumAllocation); } + public boolean hasChildQueues() { + List childQueues = getChildQueues(); + return childQueues != null && !childQueues.isEmpty(); + } + boolean canAssignToThisQueue(Resource clusterResource, String nodePartition, ResourceLimits currentResourceLimits, Resource resourceCouldBeUnreserved, SchedulingMode schedulingMode) { @@ -640,7 +646,7 @@ public abstract class AbstractCSQueue implements CSQueue { // When queue is a parent queue: Headroom = limit - used + killable // When queue is a leaf queue: Headroom = limit - used (leaf queue cannot preempt itself) Resource usedExceptKillable = nowTotalUsed; - if (null != getChildQueues() && !getChildQueues().isEmpty()) { + if (hasChildQueues()) { usedExceptKillable = Resources.subtract(nowTotalUsed, getTotalKillableResource(nodePartition)); } 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/capacity/ParentQueue.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ParentQueue.java index 91fedbc14ff..f6ada4fcbe7 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ParentQueue.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ParentQueue.java @@ -845,7 +845,12 @@ public class ParentQueue extends AbstractCSQueue { writeLock.unlock(); } } - + + @Override + public boolean hasChildQueues() { + return true; + } + @Override public List getChildQueues() { try {