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/AbstractYarnScheduler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AbstractYarnScheduler.java index fe7379a5abe..2b5147f1e58 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AbstractYarnScheduler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AbstractYarnScheduler.java @@ -1095,10 +1095,8 @@ private int updateCompletedContainers(List completedContainers, if (ars != null) { Resources.addTo(releasedResources, ars); } - Resource rrs = container.getReservedResource(); - if (rrs != null) { - Resources.addTo(releasedResources, rrs); - } + // The RMContainer in the RESERVED state does not accept the FINISHED + // event type, so there is no need to process the ReservedResource here. } else { // Add containers which are untracked by RM. untrackedContainerIdList.add(containerId); 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/allocator/RegularContainerAllocator.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/allocator/RegularContainerAllocator.java index 1dacc962424..63a7d79894c 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/allocator/RegularContainerAllocator.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/allocator/RegularContainerAllocator.java @@ -766,9 +766,13 @@ ContainerAllocation doAllocation(ContainerAllocation allocationResult, } if (allocationResult.getAllocationState() == AllocationState.ALLOCATED) { - // When allocating container - allocationResult = handleNewContainerAllocation(allocationResult, node, - schedulerKey, container); + if (reservedContainer == null) { + // When allocating container + allocationResult = handleNewContainerAllocation(allocationResult, node, + schedulerKey, container); + } else { + allocationResult.updatedContainer = reservedContainer; + } } else { // When reserving container RMContainer updatedContainer = reservedContainer; diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestContainerAllocation.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestContainerAllocation.java index 22b311db4dd..a6fa830955c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestContainerAllocation.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestContainerAllocation.java @@ -485,6 +485,9 @@ public void testAllocationForReservedContainer() throws Exception { Assert.assertEquals(1, schedulerApp2.getLiveContainers().size()); Assert.assertTrue(schedulerApp2.getReservedContainers().size() > 0); + RMContainer rmContainer2 = schedulerApp2.getReservedContainers().get(0); + ContainerId reservedContainerId = rmContainer2.getContainerId(); + // NM1 has available resource = 2G (8G - 2 * 1G - 4G) Assert.assertEquals(2 * GB, cs.getNode(nm1.getNodeId()) .getUnallocatedResource().getMemorySize()); @@ -513,6 +516,8 @@ public void testAllocationForReservedContainer() throws Exception { Assert.assertEquals(1, schedulerApp1.getLiveContainers().size()); Assert.assertEquals(2, schedulerApp2.getLiveContainers().size()); Assert.assertFalse(schedulerApp2.getReservedContainers().size() > 0); + Assert.assertSame(schedulerApp2.getRMContainer(reservedContainerId), + rmContainer2); // NM1 has available resource = 2G (8G - 2 * 1G - 4G) Assert.assertEquals(2 * GB, cs.getNode(nm1.getNodeId())