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/FSLeafQueue.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSLeafQueue.java index f90a198..ca5a146 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSLeafQueue.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSLeafQueue.java @@ -70,7 +70,8 @@ private Resource amResourceUsage; private final ActiveUsersManager activeUsersManager; - + public static final List EMPTY_LIST = Collections.emptyList(); + public FSLeafQueue(String name, FairScheduler scheduler, FSParentQueue parent) { super(name, scheduler, parent); @@ -383,7 +384,7 @@ public RMContainer preemptContainer() { @Override public List getChildQueues() { - return new ArrayList(1); + return EMPTY_LIST; } @Override 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 7d2e5b8..febe050 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 @@ -27,6 +27,7 @@ import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import com.google.common.collect.ImmutableList; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.classification.InterfaceAudience.Private; @@ -279,7 +280,7 @@ public RMContainer preemptContainer() { public List getChildQueues() { readLock.lock(); try { - return Collections.unmodifiableList(childQueues); + return ImmutableList.copyOf(childQueues); } finally { readLock.unlock(); } 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 6556717..0092845 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 @@ -28,6 +28,7 @@ import javax.xml.parsers.ParserConfigurationException; +import com.google.common.collect.ImmutableList; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.classification.InterfaceAudience.Private; @@ -295,17 +296,18 @@ private boolean removeQueueIfEmpty(FSQueue queue) { * Remove a queue and all its descendents. */ private void removeQueue(FSQueue queue) { - if (queue instanceof FSLeafQueue) { - leafQueues.remove(queue); - } else { - List childQueues = queue.getChildQueues(); - while (!childQueues.isEmpty()) { - removeQueue(childQueues.get(0)); + synchronized (queues) { + if (queue instanceof FSLeafQueue) { + leafQueues.remove(queue); + } else { + for (FSQueue childQueue:queue.getChildQueues()) { + removeQueue(childQueue); + } } + queues.remove(queue.getName()); + FSParentQueue parent = queue.getParent(); + parent.removeChildQueue(queue); } - queues.remove(queue.getName()); - FSParentQueue parent = queue.getParent(); - parent.removeChildQueue(queue); } /** @@ -360,7 +362,9 @@ public boolean exists(String name) { * Get a collection of all queues */ public Collection getQueues() { - return queues.values(); + synchronized (queues) { + return ImmutableList.copyOf(queues.values()); + } } private String ensureRootPrefix(String name) {