diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerQueue.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerQueue.java index 9a67e01..3e9b839 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerQueue.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerQueue.java @@ -66,4 +66,9 @@ * @throws YarnException if the queue can not be activated. */ void activeQueue() throws YarnException; + + /** + * Receive the STOP state from its child. + */ + void recStopState(); } diff --git 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 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 e9ef319..fe785c4 100644 --- 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 +++ 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 @@ -927,16 +927,23 @@ public void activeQueue() throws YarnException { } } - protected void appFinished() { - try { - this.writeLock.lock(); - if (getState() == QueueState.DRAINING) { - if (getNumApplications() == 0) { - updateQueueState(QueueState.STOPPED); + @Override + public void recStopState() { + // we only handle the update when the current state is DRAINING + if (getState() == QueueState.DRAINING) { + boolean updateState = true; + for (CSQueue child : this.getChildQueues()) { + if (child.getState() != QueueState.STOPPED) { + updateState = false; + break; + } + } + if (updateState) { + updateQueueState(QueueState.STOPPED); + if (parent != null) { + parent.recStopState(); } } - } finally { - this.writeLock.unlock(); } } diff --git 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 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 6b0a9066..e6b5f92 100644 --- 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 +++ 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 @@ -912,6 +912,22 @@ public void finishApplication(ApplicationId application, String user) { getParent().finishApplication(application, user); } + protected void appFinished() { + try { + this.writeLock.lock(); + if (getState() == QueueState.DRAINING) { + if (getNumApplications() == 0) { + updateQueueState(QueueState.STOPPED); + if (parent != null) { + parent.recStopState(); + } + } + } + } finally { + this.writeLock.unlock(); + } + } + @Override public void finishApplicationAttempt(FiCaSchedulerApp application, String queue) { // Careful! Locking order is important! @@ -2491,6 +2507,7 @@ public void stopQueue() { updateQueueState(QueueState.DRAINING); } else { updateQueueState(QueueState.STOPPED); + parent.recStopState(); } } finally { writeLock.unlock(); diff --git 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 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 0e5b884..07af4d7 100644 --- 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 +++ 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 @@ -438,8 +438,6 @@ public void finishApplication(ApplicationId application, String user) { removeApplication(application, user); - appFinished(); - // Inform the parent queue if (parent != null) { parent.finishApplication(application, user); @@ -1076,11 +1074,7 @@ public void apply(Resource cluster, public void stopQueue() { try { this.writeLock.lock(); - if (getNumApplications() > 0) { - updateQueueState(QueueState.DRAINING); - } else { - updateQueueState(QueueState.STOPPED); - } + updateQueueState(QueueState.DRAINING); if (getChildQueues() != null) { for(CSQueue child : getChildQueues()) { child.stopQueue();