diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index fa1e1209f6f..be9e2d5532c 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -174,6 +174,9 @@ Release 2.6.1 - UNRELEASED YARN-2920. Changed CapacityScheduler to kill containers on nodes where node labels are changed. (Wangda Tan via jianhe) + YARN-2978. Fixed potential NPE while getting queue info. (Varun Saxena 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/AbstractCSQueue.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/AbstractCSQueue.java index 1f6696ddd10..fec3a567744 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/AbstractCSQueue.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/AbstractCSQueue.java @@ -65,7 +65,6 @@ public abstract class AbstractCSQueue implements CSQueue { RMNodeLabelsManager labelManager; String defaultLabelExpression; Resource usedResources = Resources.createResource(0, 0); - QueueInfo queueInfo; Map absoluteCapacityByNodeLabels; Map capacitiyByNodeLabels; Map usedResourcesByNodeLabels = new HashMap(); @@ -87,7 +86,6 @@ public abstract class AbstractCSQueue implements CSQueue { this.parent = parent; this.queueName = queueName; this.resourceCalculator = cs.getResourceCalculator(); - this.queueInfo = recordFactory.newRecordInstance(QueueInfo.class); // must be called after parent and queueName is set this.metrics = old != null ? old.getMetrics() : @@ -99,9 +97,7 @@ public abstract class AbstractCSQueue implements CSQueue { this.accessibleLabels = cs.getConfiguration().getAccessibleNodeLabels(getQueuePath()); this.defaultLabelExpression = cs.getConfiguration() .getDefaultNodeLabelExpression(getQueuePath()); - - this.queueInfo.setQueueName(queueName); - + // inherit from parent if labels not set if (this.accessibleLabels == null && parent != null) { this.accessibleLabels = parent.getAccessibleNodeLabels(); @@ -280,12 +276,6 @@ public abstract class AbstractCSQueue implements CSQueue { this.capacitiyByNodeLabels = new HashMap(nodeLabelCapacities); this.maxCapacityByNodeLabels = new HashMap(maximumNodeLabelCapacities); - - this.queueInfo.setAccessibleNodeLabels(this.accessibleLabels); - this.queueInfo.setCapacity(this.capacity); - this.queueInfo.setMaximumCapacity(this.maximumCapacity); - this.queueInfo.setQueueState(this.state); - this.queueInfo.setDefaultNodeLabelExpression(this.defaultLabelExpression); // Update metrics CSQueueUtils.updateQueueStatistics( @@ -330,6 +320,18 @@ public abstract class AbstractCSQueue implements CSQueue { this.reservationsContinueLooking = reservationContinueLooking; } + protected QueueInfo getQueueInfo() { + QueueInfo queueInfo = recordFactory.newRecordInstance(QueueInfo.class); + queueInfo.setQueueName(queueName); + queueInfo.setAccessibleNodeLabels(accessibleLabels); + queueInfo.setCapacity(capacity); + queueInfo.setMaximumCapacity(maximumCapacity); + queueInfo.setQueueState(state); + queueInfo.setDefaultNodeLabelExpression(defaultLabelExpression); + queueInfo.setCurrentCapacity(getUsedCapacity()); + return queueInfo; + } + @Private public Resource getMaximumAllocation() { return maximumAllocation; 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/LeafQueue.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/LeafQueue.java index 509b0f26d53..78b5fb6d652 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/LeafQueue.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/LeafQueue.java @@ -160,8 +160,6 @@ public class LeafQueue extends AbstractCSQueue { float maxAMResourcePerQueuePercent = cs.getConfiguration() .getMaximumApplicationMasterResourcePerQueuePercent(getQueuePath()); - this.queueInfo.setChildQueues(new ArrayList()); - QueueState state = cs.getConfiguration().getState(getQueuePath()); Map acls = @@ -237,14 +235,14 @@ public class LeafQueue extends AbstractCSQueue { this.defaultLabelExpression)) { throw new IOException("Invalid default label expression of " + " queue=" - + queueInfo.getQueueName() + + getQueueName() + " doesn't have permission to access all labels " + "in default label expression. labelExpression of resource request=" + (this.defaultLabelExpression == null ? "" : this.defaultLabelExpression) + ". Queue labels=" - + (queueInfo.getAccessibleNodeLabels() == null ? "" : StringUtils.join(queueInfo - .getAccessibleNodeLabels().iterator(), ','))); + + (getAccessibleNodeLabels() == null ? "" : StringUtils.join( + getAccessibleNodeLabels().iterator(), ','))); } this.nodeLocalityDelay = nodeLocalityDelay; @@ -412,7 +410,7 @@ public class LeafQueue extends AbstractCSQueue { @Override public synchronized QueueInfo getQueueInfo( boolean includeChildQueues, boolean recursive) { - queueInfo.setCurrentCapacity(usedCapacity); + QueueInfo queueInfo = getQueueInfo(); return queueInfo; } 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 fd598f2e81c..f820ccab929 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 @@ -110,8 +110,6 @@ public class ParentQueue extends AbstractCSQueue { Map acls = cs.getConfiguration().getAcls(getQueuePath()); - this.queueInfo.setChildQueues(new ArrayList()); - setupQueueConfigs(cs.getClusterResource(), capacity, absoluteCapacity, maximumCapacity, absoluteMaxCapacity, state, acls, accessibleLabels, defaultLabelExpression, capacitiyByNodeLabels, maxCapacityByNodeLabels, @@ -206,7 +204,7 @@ public class ParentQueue extends AbstractCSQueue { @Override public synchronized QueueInfo getQueueInfo( boolean includeChildQueues, boolean recursive) { - queueInfo.setCurrentCapacity(usedCapacity); + QueueInfo queueInfo = getQueueInfo(); List childQueuesInfo = new ArrayList(); if (includeChildQueues) {