Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java (revision 1574176) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java (working copy) @@ -515,6 +515,44 @@ } @Test (timeout = 5000) + public void testSchedulerRootQueueMetricsWhenKillWaitingJobs() throws InterruptedException { + + // Add a node + RMNode node1 = MockNodes.newNodeInfo(1, Resources.createResource(1024)); + NodeAddedSchedulerEvent nodeEvent1 = new NodeAddedSchedulerEvent(node1); + scheduler.handle(nodeEvent1); + + // Queue 1 requests full capacity of node + createSchedulingRequest(1024, "queue1", "user1", 1); + scheduler.update(); + NodeUpdateSchedulerEvent updateEvent = new NodeUpdateSchedulerEvent(node1); + scheduler.handle(updateEvent); + + // Now adding another job, which have to wait since there is no spare capacity + ApplicationAttemptId attId = createSchedulingRequest(1024, "queue2", "user1", 1); + scheduler.update(); + scheduler.handle(updateEvent); + + assertEquals(1024, scheduler.applications.get(attId).getCurrentReservation().getMemory()); + // Make sure reserved memory gets updated correctly + assertEquals(1024, scheduler.rootMetrics.getReservedMB()); + + // Now remove this waiting app, and the reserved memory should be released. + AppRemovedSchedulerEvent appRemovedEvent = new AppRemovedSchedulerEvent( + attId, RMAppAttemptState.KILLED); + scheduler.handle(appRemovedEvent); + + assertEquals(0, scheduler.rootMetrics.getReservedMB()); + + QueueManager queueManager = scheduler.getQueueManager(); + Collection queues = queueManager.getLeafQueues(); + assertEquals(3, queues.size()); + for(FSLeafQueue q : queues){ + assertEquals(0, q.getMetrics().getReservedMB()); + } + } + + @Test (timeout = 5000) public void testSimpleContainerAllocation() throws IOException { scheduler.reinitialize(conf, resourceManager.getRMContext()); Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java (revision 1574176) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java (working copy) @@ -799,6 +799,10 @@ if (rmContainer.getState() == RMContainerState.RESERVED) { application.unreserve(node, rmContainer.getReservedPriority()); node.unreserveResource(application); + QueueMetrics leafQueueMetrics = queueMgr.getLeafQueue(application.getQueue() + .getQueueName()).getMetrics(); + leafQueueMetrics.unreserveResource( + application.getUser(), rmContainer.getContainer().getResource()); } else { application.containerCompleted(rmContainer, containerStatus, event); node.releaseContainer(container);