YARN-2978. Fixed potential NPE while getting queue info. Contributed by Varun Saxena (cherry picked from commit dd57c2047bfd21910acc38c98153eedf1db75169)
(cherry picked from commit c61e8a7bfa7236e354f859a889083fab3d7ca9eb) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/419e18cb Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/419e18cb Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/419e18cb Branch: refs/heads/branch-2.6 Commit: 419e18cb3743f9a146abb0c335883c2ac96583e6 Parents: 88f022d Author: Jian He <jia...@apache.org> Authored: Tue Jan 6 14:15:57 2015 -0800 Committer: Vinod Kumar Vavilapalli <vino...@apache.org> Committed: Sat Sep 5 20:54:19 2015 -0700 ---------------------------------------------------------------------- hadoop-yarn-project/CHANGES.txt | 3 +++ .../scheduler/capacity/AbstractCSQueue.java | 24 +++++++++++--------- .../scheduler/capacity/LeafQueue.java | 10 ++++---- .../scheduler/capacity/ParentQueue.java | 4 +--- 4 files changed, 21 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/419e18cb/hadoop-yarn-project/CHANGES.txt ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index fa1e120..be9e2d5 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 http://git-wip-us.apache.org/repos/asf/hadoop/blob/419e18cb/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 ---------------------------------------------------------------------- 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 1f6696d..fec3a56 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<String, Float> absoluteCapacityByNodeLabels; Map<String, Float> capacitiyByNodeLabels; Map<String, Resource> usedResourcesByNodeLabels = new HashMap<String, Resource>(); @@ -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<String, Float>(nodeLabelCapacities); this.maxCapacityByNodeLabels = new HashMap<String, Float>(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; http://git-wip-us.apache.org/repos/asf/hadoop/blob/419e18cb/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 ---------------------------------------------------------------------- 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 509b0f2..78b5fb6 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<QueueInfo>()); - QueueState state = cs.getConfiguration().getState(getQueuePath()); Map<QueueACL, AccessControlList> 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; } http://git-wip-us.apache.org/repos/asf/hadoop/blob/419e18cb/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 ---------------------------------------------------------------------- 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 fd598f2..f820cca 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<QueueACL, AccessControlList> acls = cs.getConfiguration().getAcls(getQueuePath()); - this.queueInfo.setChildQueues(new ArrayList<QueueInfo>()); - 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<QueueInfo> childQueuesInfo = new ArrayList<QueueInfo>(); if (includeChildQueues) {