YARN-3145. Fixed ConcurrentModificationException on CapacityScheduler ParentQueue#getQueueUserAclInfo. Contributed by Tsuyoshi OZAWA

(cherry picked from commit 4641196fe0)
This commit is contained in:
Jian He 2015-02-05 16:12:53 -08:00
parent 096ba583fa
commit b109051145
2 changed files with 22 additions and 19 deletions

View File

@ -457,6 +457,9 @@ Release 2.7.0 - UNRELEASED
YARN-3149. Fix typo in message for invalid application id. YARN-3149. Fix typo in message for invalid application id.
(Bibin A Chundatt via xgong) (Bibin A Chundatt via xgong)
YARN-3145. Fixed ConcurrentModificationException on CapacityScheduler
ParentQueue#getQueueUserAclInfo. (Tsuyoshi OZAWA via jianhe)
Release 2.6.0 - 2014-11-18 Release 2.6.0 - 2014-11-18
INCOMPATIBLE CHANGES INCOMPATIBLE CHANGES

View File

@ -158,7 +158,7 @@ public class ParentQueue extends AbstractCSQueue {
} }
private static float PRECISION = 0.0005f; // 0.05% precision private static float PRECISION = 0.0005f; // 0.05% precision
void setChildQueues(Collection<CSQueue> childQueues) { synchronized void setChildQueues(Collection<CSQueue> childQueues) {
// Validate // Validate
float childCapacities = 0; float childCapacities = 0;
for (CSQueue queue : childQueues) { for (CSQueue queue : childQueues) {
@ -574,7 +574,7 @@ public class ParentQueue extends AbstractCSQueue {
printChildQueues(); printChildQueues();
// Try to assign to most 'under-served' sub-queue // Try to assign to most 'under-served' sub-queue
for (Iterator<CSQueue> iter=childQueues.iterator(); iter.hasNext();) { for (Iterator<CSQueue> iter = childQueues.iterator(); iter.hasNext();) {
CSQueue childQueue = iter.next(); CSQueue childQueue = iter.next();
if(LOG.isDebugEnabled()) { if(LOG.isDebugEnabled()) {
LOG.debug("Trying to assign to queue: " + childQueue.getQueuePath() LOG.debug("Trying to assign to queue: " + childQueue.getQueuePath()
@ -644,26 +644,26 @@ public class ParentQueue extends AbstractCSQueue {
" absoluteUsedCapacity=" + getAbsoluteUsedCapacity() + " absoluteUsedCapacity=" + getAbsoluteUsedCapacity() +
" used=" + queueUsage.getUsed() + " used=" + queueUsage.getUsed() +
" cluster=" + clusterResource); " cluster=" + clusterResource);
}
// Note that this is using an iterator on the childQueues so this can't be // Note that this is using an iterator on the childQueues so this can't
// called if already within an iterator for the childQueues. Like // be called if already within an iterator for the childQueues. Like
// from assignContainersToChildQueues. // from assignContainersToChildQueues.
if (sortQueues) { if (sortQueues) {
// reinsert the updated queue // reinsert the updated queue
for (Iterator<CSQueue> iter=childQueues.iterator(); iter.hasNext();) { for (Iterator<CSQueue> iter = childQueues.iterator();
CSQueue csqueue = iter.next(); iter.hasNext();) {
if(csqueue.equals(completedChildQueue)) CSQueue csqueue = iter.next();
{ if(csqueue.equals(completedChildQueue)) {
iter.remove(); iter.remove();
LOG.info("Re-sorting completed queue: " + csqueue.getQueuePath() + LOG.info("Re-sorting completed queue: " + csqueue.getQueuePath() +
" stats: " + csqueue); " stats: " + csqueue);
childQueues.add(csqueue); childQueues.add(csqueue);
break; break;
}
} }
} }
} }
// Inform the parent // Inform the parent
if (parent != null) { if (parent != null) {
// complete my parent // complete my parent
@ -715,7 +715,7 @@ public class ParentQueue extends AbstractCSQueue {
} }
@Override @Override
public void collectSchedulerApplications( public synchronized void collectSchedulerApplications(
Collection<ApplicationAttemptId> apps) { Collection<ApplicationAttemptId> apps) {
for (CSQueue queue : childQueues) { for (CSQueue queue : childQueues) {
queue.collectSchedulerApplications(apps); queue.collectSchedulerApplications(apps);