From c61e8a7bfa7236e354f859a889083fab3d7ca9eb Mon Sep 17 00:00:00 2001 From: Jian He Date: Tue, 6 Jan 2015 14:15:57 -0800 Subject: [PATCH] YARN-2978. Fixed potential NPE while getting queue info. Contributed by Varun Saxena (cherry picked from commit dd57c2047bfd21910acc38c98153eedf1db75169) --- 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(-) diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index 8139c729286..1a4ea084d1b 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -287,6 +287,9 @@ Release 2.7.0 - UNRELEASED YARN-2958. Made RMStateStore not update the last sequence number when updating the delegation token. (Varun Saxena via zjshen) + 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 47679a69a37..dd710695f18 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 @@ -163,8 +163,6 @@ public class LeafQueue extends AbstractCSQueue { CSQueueUtils.computeMaxActiveApplicationsPerUser( maxActiveAppsUsingAbsCap, userLimit, userLimitFactor); - this.queueInfo.setChildQueues(new ArrayList()); - QueueState state = cs.getConfiguration().getState(getQueuePath()); Map acls = @@ -235,14 +233,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; @@ -433,7 +431,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) {