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 AbstractCSQueue(CapacitySchedulerContext cs, 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 AbstractCSQueue(CapacitySchedulerContext cs, 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 @@ synchronized void setupQueueConfigs(Resource clusterResource, float capacity, 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 @@ synchronized void setupQueueConfigs(Resource clusterResource, float capacity, 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 LeafQueue(CapacitySchedulerContext cs, CSQueueUtils.computeMaxActiveApplicationsPerUser( maxActiveAppsUsingAbsCap, userLimit, userLimitFactor); - this.queueInfo.setChildQueues(new ArrayList()); - QueueState state = cs.getConfiguration().getState(getQueuePath()); Map acls = @@ -235,14 +233,14 @@ protected synchronized void setupQueueConfigs( 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 synchronized float getUserLimitFactor() { @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 ParentQueue(CapacitySchedulerContext cs, 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 String getQueuePath() { @Override public synchronized QueueInfo getQueueInfo( boolean includeChildQueues, boolean recursive) { - queueInfo.setCurrentCapacity(usedCapacity); + QueueInfo queueInfo = getQueueInfo(); List childQueuesInfo = new ArrayList(); if (includeChildQueues) {