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/CapacityScheduler.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/CapacityScheduler.java index 618ee20..b4d7870 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/CapacityScheduler.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/CapacityScheduler.java @@ -767,21 +767,54 @@ private void initializeQueues(CapacitySchedulerConfiguration conf) this.queueManager.initializeQueues(conf); updatePlacementRules(); - + ClonedQueue rootClonedQueue = new ClonedQueue(this.getRootQueue().getQueueName()); + genClonedQueue(this.getRootQueue(), rootClonedQueue); // Notify Preemption Manager - preemptionManager.refreshQueues(null, this.getRootQueue()); + preemptionManager.refreshQueues(null, rootClonedQueue); } @Lock(CapacityScheduler.class) private void reinitializeQueues(CapacitySchedulerConfiguration newConf) - throws IOException { + throws IOException { this.queueManager.reinitializeQueues(newConf); updatePlacementRules(); - + ClonedQueue rootClonedQueue = new ClonedQueue(this.getRootQueue().getQueueName()); + genClonedQueue(this.getRootQueue(), rootClonedQueue); // Notify Preemption Manager - preemptionManager.refreshQueues(null, this.getRootQueue()); + preemptionManager.refreshQueues(null, rootClonedQueue); + } + + public class ClonedQueue { + String queueName; + List children; + + public String getQueueName() { + return queueName; + } + + public void setQueueName(String name) { + this.queueName = name; + } + + public List getChildren() { + return children; + } + + ClonedQueue(String _name) { + queueName = _name; + children = new ArrayList<>(); + } } + void genClonedQueue(CSQueue parent, ClonedQueue parentMapping) { + if (parent != null && parentMapping != null && parent.getChildQueues() != null) { + for (CSQueue child : parent.getChildQueues()) { + ClonedQueue childClonedQueue = new ClonedQueue(child.getQueueName()); + parentMapping.getChildren().add(childClonedQueue); + genClonedQueue(child, childClonedQueue); + } + } + } @Override public CSQueue getQueue(String queueName) { if (queueName == null) { 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/preemption/PreemptionManager.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/preemption/PreemptionManager.java index 76fcd4a..07f87ca 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/preemption/PreemptionManager.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/preemption/PreemptionManager.java @@ -23,6 +23,7 @@ import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainer; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CSQueue; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler; import org.apache.hadoop.yarn.util.resource.Resources; import java.util.Collections; @@ -42,7 +43,7 @@ public PreemptionManager() { writeLock = lock.writeLock(); } - public void refreshQueues(CSQueue parent, CSQueue current) { + public void refreshQueues(CapacityScheduler.ClonedQueue parent, CapacityScheduler.ClonedQueue current) { try { writeLock.lock(); PreemptableQueue parentEntity = null; @@ -55,8 +56,8 @@ public void refreshQueues(CSQueue parent, CSQueue current) { new PreemptableQueue(parentEntity)); } - if (current.getChildQueues() != null) { - for (CSQueue child : current.getChildQueues()) { + if (current.getChildren() != null) { + for (CapacityScheduler.ClonedQueue child : current.getChildren()) { refreshQueues(current, child); } }