diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java index 3d9ac4f..eb88251 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java @@ -1440,6 +1440,8 @@ public void completedContainer(Resource clusterResource, " absoluteUsedCapacity=" + getAbsoluteUsedCapacity() + " used=" + usedResources + " cluster=" + clusterResource); + // reinsert me in my parent's childQueues + ((ParentQueue)getParent()).reinsertQueue(this); // Inform the parent queue getParent().completedContainer(clusterResource, application, node, rmContainer, null, event); diff --git 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 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 1a87984..5144fcc 100644 --- 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 +++ 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 @@ -655,7 +655,7 @@ synchronized CSAssignment assignContainersToChildQueues(Resource cluster, assignment.getResource(), Resources.none())) { // Remove and re-insert to sort iter.remove(); - LOG.info("Re-sorting queues since queue: " + childQueue.getQueuePath() + + LOG.info("Re-sorting assigned queue: " + childQueue.getQueuePath() + " stats: " + childQueue); childQueues.add(childQueue); if (LOG.isDebugEnabled()) { @@ -703,11 +703,29 @@ public void completedContainer(Resource clusterResource, // Inform the parent if (parent != null) { + // reinsert me in my parent's childQueues + ((ParentQueue)parent).reinsertQueue(this); + // complete my parent parent.completedContainer(clusterResource, application, node, rmContainer, null, event); } } } + + public synchronized void reinsertQueue(CSQueue completedChildQueue) { + // Can't use childQueues.remove() since the TreeSet might be out of order. + for (Iterator iter=childQueues.iterator(); iter.hasNext();) { + CSQueue childQueue = iter.next(); + if(childQueue.equals(completedChildQueue)) + { + iter.remove(); + LOG.info("Re-sorting completed queue: " + childQueue.getQueuePath() + + " stats: " + childQueue); + childQueues.add(childQueue); + break; + } + } + } synchronized void allocateResource(Resource clusterResource, Resource resource) {