From 4641196fe02af5cab3d56a9f3c78875c495dbe03 Mon Sep 17 00:00:00 2001 From: Jian He Date: Thu, 5 Feb 2015 16:12:53 -0800 Subject: [PATCH] YARN-3145. Fixed ConcurrentModificationException on CapacityScheduler ParentQueue#getQueueUserAclInfo. Contributed by Tsuyoshi OZAWA --- hadoop-yarn-project/CHANGES.txt | 3 ++ .../scheduler/capacity/ParentQueue.java | 38 +++++++++---------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index 6ecaff32aa72b..805ec660ad138 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -491,6 +491,9 @@ Release 2.7.0 - UNRELEASED YARN-3149. Fix typo in message for invalid application id. (Bibin A Chundatt via xgong) + YARN-3145. Fixed ConcurrentModificationException on CapacityScheduler + ParentQueue#getQueueUserAclInfo. (Tsuyoshi OZAWA via jianhe) + Release 2.6.0 - 2014-11-18 INCOMPATIBLE CHANGES 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 d66c06aa2a173..5a2e234436382 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 @@ -158,7 +158,7 @@ synchronized void setupQueueConfigs(Resource clusterResource, float capacity, } private static float PRECISION = 0.0005f; // 0.05% precision - void setChildQueues(Collection childQueues) { + synchronized void setChildQueues(Collection childQueues) { // Validate float childCapacities = 0; for (CSQueue queue : childQueues) { @@ -574,7 +574,7 @@ private synchronized CSAssignment assignContainersToChildQueues(Resource cluster printChildQueues(); // Try to assign to most 'under-served' sub-queue - for (Iterator iter=childQueues.iterator(); iter.hasNext();) { + for (Iterator iter = childQueues.iterator(); iter.hasNext();) { CSQueue childQueue = iter.next(); if(LOG.isDebugEnabled()) { LOG.debug("Trying to assign to queue: " + childQueue.getQueuePath() @@ -644,26 +644,26 @@ public void completedContainer(Resource clusterResource, " absoluteUsedCapacity=" + getAbsoluteUsedCapacity() + " used=" + queueUsage.getUsed() + " cluster=" + clusterResource); - } - // Note that this is using an iterator on the childQueues so this can't be - // called if already within an iterator for the childQueues. Like - // from assignContainersToChildQueues. - if (sortQueues) { - // reinsert the updated queue - for (Iterator iter=childQueues.iterator(); iter.hasNext();) { - CSQueue csqueue = iter.next(); - if(csqueue.equals(completedChildQueue)) - { - iter.remove(); - LOG.info("Re-sorting completed queue: " + csqueue.getQueuePath() + - " stats: " + csqueue); - childQueues.add(csqueue); - break; + // Note that this is using an iterator on the childQueues so this can't + // be called if already within an iterator for the childQueues. Like + // from assignContainersToChildQueues. + if (sortQueues) { + // reinsert the updated queue + for (Iterator iter = childQueues.iterator(); + iter.hasNext();) { + CSQueue csqueue = iter.next(); + if(csqueue.equals(completedChildQueue)) { + iter.remove(); + LOG.info("Re-sorting completed queue: " + csqueue.getQueuePath() + + " stats: " + csqueue); + childQueues.add(csqueue); + break; + } } } } - + // Inform the parent if (parent != null) { // complete my parent @@ -715,7 +715,7 @@ public ActiveUsersManager getActiveUsersManager() { } @Override - public void collectSchedulerApplications( + public synchronized void collectSchedulerApplications( Collection apps) { for (CSQueue queue : childQueues) { queue.collectSchedulerApplications(apps);