Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 1300C200C09 for ; Wed, 11 Jan 2017 03:06:44 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id 11E27160B4B; Wed, 11 Jan 2017 02:06:44 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id B8F38160B3D for ; Wed, 11 Jan 2017 03:06:42 +0100 (CET) Received: (qmail 5119 invoked by uid 500); 11 Jan 2017 02:06:41 -0000 Mailing-List: contact common-commits-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Delivered-To: mailing list common-commits@hadoop.apache.org Received: (qmail 5110 invoked by uid 99); 11 Jan 2017 02:06:41 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 11 Jan 2017 02:06:41 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id AFA1ADFAF2; Wed, 11 Jan 2017 02:06:41 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: junping_du@apache.org To: common-commits@hadoop.apache.org Message-Id: <6c34caee687e4b1e84f216e04530474a@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: hadoop git commit: YARN-4148. When killing app, RM releases app's resource before they are released by NM. Contributed by Jason Lowe. Date: Wed, 11 Jan 2017 02:06:41 +0000 (UTC) archived-at: Wed, 11 Jan 2017 02:06:44 -0000 Repository: hadoop Updated Branches: refs/heads/branch-2.8 7706a63fb -> dbac88baa YARN-4148. When killing app, RM releases app's resource before they are released by NM. Contributed by Jason Lowe. Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/dbac88ba Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/dbac88ba Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/dbac88ba Branch: refs/heads/branch-2.8 Commit: dbac88baa9a15eaa8fcd0b464172d5cd9006199c Parents: 7706a63 Author: Junping Du Authored: Tue Jan 10 18:06:18 2017 -0800 Committer: Junping Du Committed: Tue Jan 10 18:06:18 2017 -0800 ---------------------------------------------------------------------- .../scheduler/AbstractYarnScheduler.java | 1 + .../scheduler/SchedulerNode.java | 85 +++++++++++--- .../scheduler/capacity/CapacityScheduler.java | 1 + .../scheduler/capacity/LeafQueue.java | 2 +- .../common/fica/FiCaSchedulerNode.java | 4 +- .../scheduler/fair/FairScheduler.java | 3 +- .../scheduler/fifo/FifoScheduler.java | 3 +- .../scheduler/TestAbstractYarnScheduler.java | 114 +++++++++++++++++++ .../scheduler/capacity/TestChildQueueOrder.java | 7 +- 9 files changed, 199 insertions(+), 21 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/dbac88ba/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AbstractYarnScheduler.java ---------------------------------------------------------------------- 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 47c83bc..f0a4eb1 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 @@ -257,6 +257,7 @@ public abstract class AbstractYarnScheduler } application.containerLaunchedOnNode(containerId, node.getNodeID()); + node.containerStarted(containerId); } protected void containerIncreasedOnNode(ContainerId containerId, http://git-wip-us.apache.org/repos/asf/hadoop/blob/dbac88ba/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerNode.java ---------------------------------------------------------------------- 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/SchedulerNode.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerNode.java index 8a3fd8b..a494b7c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerNode.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerNode.java @@ -65,8 +65,8 @@ public abstract class SchedulerNode { ResourceUtilization.newInstance(0, 0, 0f); /* set of containers that are allocated containers */ - protected final Map launchedContainers = - new HashMap(); + private final Map launchedContainers = + new HashMap<>(); private final RMNode rmNode; private final String nodeName; @@ -148,12 +148,24 @@ public abstract class SchedulerNode { * @param rmContainer * allocated container */ - public synchronized void allocateContainer(RMContainer rmContainer) { + public void allocateContainer(RMContainer rmContainer) { + allocateContainer(rmContainer, false); + } + + /** + * The Scheduler has allocated containers on this node to the given + * application. + * @param rmContainer Allocated container + * @param launchedOnNode True if the container has been launched + */ + private synchronized void allocateContainer(RMContainer rmContainer, + boolean launchedOnNode) { Container container = rmContainer.getContainer(); deductAvailableResource(container.getResource()); ++numContainers; - launchedContainers.put(container.getId(), rmContainer); + launchedContainers.put(container.getId(), + new ContainerInfo(rmContainer, launchedOnNode)); LOG.info("Assigned container " + container.getId() + " of capacity " + container.getResource() + " on host " + rmNode.getNodeAddress() @@ -236,20 +248,25 @@ public abstract class SchedulerNode { /** * Release an allocated container on this node. * - * @param container - * container to be released + * @param containerId ID of container to be released. + * @param releasedByNode whether the release originates from a node update. */ - public synchronized void releaseContainer(Container container) { - if (!isValidContainer(container.getId())) { - LOG.error("Invalid container released " + container); + public synchronized void releaseContainer(ContainerId containerId, + boolean releasedByNode) { + ContainerInfo info = launchedContainers.get(containerId); + if (info == null) { return; } - /* remove the containers from the nodemanger */ - if (null != launchedContainers.remove(container.getId())) { - updateResourceForReleasedContainer(container); + if (!releasedByNode && info.launchedOnNode) { + // wait until node reports container has completed + return; } + launchedContainers.remove(containerId); + Container container = info.container.getContainer(); + updateResourceForReleasedContainer(container); + LOG.info("Released container " + container.getId() + " of capacity " + container.getResource() + " on host " + rmNode.getNodeAddress() + ", which currently has " + numContainers + " containers, " @@ -257,6 +274,17 @@ public abstract class SchedulerNode { + " available" + ", release resources=" + true); } + /** + * Inform the node that a container has launched. + * @param containerId ID of the launched container + */ + public synchronized void containerStarted(ContainerId containerId) { + ContainerInfo info = launchedContainers.get(containerId); + if (info != null) { + info.launchedOnNode = true; + } + } + private synchronized void addAvailableResource(Resource resource) { if (resource == null) { LOG.error("Invalid resource addition of null resource for " @@ -305,7 +333,25 @@ public abstract class SchedulerNode { } public synchronized List getCopiedListOfRunningContainers() { - return new ArrayList(launchedContainers.values()); + List result = new ArrayList<>(launchedContainers.size()); + for (ContainerInfo info : launchedContainers.values()) { + result.add(info.container); + } + return result; + } + + /** + * Get the container for the specified container ID. + * @param containerId The container ID + * @return The container for the specified container ID + */ + protected synchronized RMContainer getContainer(ContainerId containerId) { + RMContainer container = null; + ContainerInfo info = launchedContainers.get(containerId); + if (info != null) { + container = info.container; + } + return container; } public synchronized RMContainer getReservedContainer() { @@ -321,7 +367,7 @@ public abstract class SchedulerNode { if (rmContainer.getState().equals(RMContainerState.COMPLETED)) { return; } - allocateContainer(rmContainer); + allocateContainer(rmContainer, true); } public Set getLabels() { @@ -377,4 +423,15 @@ public abstract class SchedulerNode { public ResourceUtilization getNodeUtilization() { return this.nodeUtilization; } + + + private static class ContainerInfo { + private final RMContainer container; + private boolean launchedOnNode; + + public ContainerInfo(RMContainer container, boolean launchedOnNode) { + this.container = container; + this.launchedOnNode = launchedOnNode; + } + } } http://git-wip-us.apache.org/repos/asf/hadoop/blob/dbac88ba/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java ---------------------------------------------------------------------- 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/CapacityScheduler.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/CapacityScheduler.java index ca4a2fd..94dfebd 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/CapacityScheduler.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/CapacityScheduler.java @@ -1074,6 +1074,7 @@ public class CapacityScheduler extends RMContainer container = getRMContainer(containerId); super.completedContainer(container, completedContainer, RMContainerEventType.FINISHED); + node.releaseContainer(containerId, true); if (container != null) { releasedContainers++; Resource rs = container.getAllocatedResource(); http://git-wip-us.apache.org/repos/asf/hadoop/blob/dbac88ba/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 ---------------------------------------------------------------------- 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 86e8c09..77f10b9 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 @@ -1451,7 +1451,7 @@ public class LeafQueue extends AbstractCSQueue { application.containerCompleted(rmContainer, containerStatus, event, node.getPartition()); - node.releaseContainer(container); + node.releaseContainer(rmContainer.getContainerId(), false); } // Book-keeping http://git-wip-us.apache.org/repos/asf/hadoop/blob/dbac88ba/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/common/fica/FiCaSchedulerNode.java ---------------------------------------------------------------------- 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/common/fica/FiCaSchedulerNode.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/common/fica/FiCaSchedulerNode.java index f90a53c..078328c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/common/fica/FiCaSchedulerNode.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/common/fica/FiCaSchedulerNode.java @@ -125,7 +125,7 @@ public class FiCaSchedulerNode extends SchedulerNode { // According to decisions from preemption policy, mark the container to killable public synchronized void markContainerToKillable(ContainerId containerId) { - RMContainer c = launchedContainers.get(containerId); + RMContainer c = getContainer(containerId); if (c != null && !killableContainers.containsKey(containerId)) { killableContainers.put(containerId, c); Resources.addTo(totalKillableResources, c.getAllocatedResource()); @@ -135,7 +135,7 @@ public class FiCaSchedulerNode extends SchedulerNode { // According to decisions from preemption policy, mark the container to // non-killable public synchronized void markContainerToNonKillable(ContainerId containerId) { - RMContainer c = launchedContainers.get(containerId); + RMContainer c = getContainer(containerId); if (c != null && killableContainers.containsKey(containerId)) { killableContainers.remove(containerId); Resources.subtractFrom(totalKillableResources, c.getAllocatedResource()); http://git-wip-us.apache.org/repos/asf/hadoop/blob/dbac88ba/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 ---------------------------------------------------------------------- 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/fair/FairScheduler.java b/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 index 960339e..1586a49 100644 --- a/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 +++ b/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 @@ -871,7 +871,7 @@ public class FairScheduler extends application.unreserve(rmContainer.getReservedPriority(), node); } else { application.containerCompleted(rmContainer, containerStatus, event); - node.releaseContainer(container); + node.releaseContainer(rmContainer.getContainerId(), false); updateRootQueueMetrics(); } @@ -1053,6 +1053,7 @@ public class FairScheduler extends LOG.debug("Container FINISHED: " + containerId); super.completedContainer(getRMContainer(containerId), completedContainer, RMContainerEventType.FINISHED); + node.releaseContainer(containerId, true); } // If the node is decommissioning, send an update to have the total http://git-wip-us.apache.org/repos/asf/hadoop/blob/dbac88ba/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java ---------------------------------------------------------------------- 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/fifo/FifoScheduler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java index 664bd4e..290271d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java @@ -746,6 +746,7 @@ public class FifoScheduler extends LOG.debug("Container FINISHED: " + containerId); super.completedContainer(getRMContainer(containerId), completedContainer, RMContainerEventType.FINISHED); + node.releaseContainer(containerId, true); } // Updating node resource utilization @@ -917,7 +918,7 @@ public class FifoScheduler extends RMNodeLabelsManager.NO_LABEL); // Inform the node - node.releaseContainer(container); + node.releaseContainer(rmContainer.getContainerId(), false); // Update total usage Resources.subtractFrom(usedResource, container.getResource()); http://git-wip-us.apache.org/repos/asf/hadoop/blob/dbac88ba/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestAbstractYarnScheduler.java ---------------------------------------------------------------------- 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/TestAbstractYarnScheduler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestAbstractYarnScheduler.java index 8fa26dc..6a118ac 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestAbstractYarnScheduler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestAbstractYarnScheduler.java @@ -35,6 +35,7 @@ import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.api.records.Container; import org.apache.hadoop.yarn.api.records.ContainerId; import org.apache.hadoop.yarn.api.records.ContainerState; +import org.apache.hadoop.yarn.api.records.ContainerStatus; import org.apache.hadoop.yarn.api.records.NodeId; import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.api.records.ResourceOption; @@ -436,6 +437,119 @@ public class TestAbstractYarnScheduler extends ParameterizedSchedulerTestBase { } } + @Test(timeout=60000) + public void testContainerReleasedByNode() throws Exception { + System.out.println("Starting testContainerReleasedByNode"); + configureScheduler(); + YarnConfiguration conf = getConf(); + MockRM rm1 = new MockRM(conf); + try { + rm1.start(); + RMApp app1 = + rm1.submitApp(200, "name", "user", + new HashMap(), false, "default", + -1, null, "Test", false, true); + MockNM nm1 = + new MockNM("127.0.0.1:1234", 10240, rm1.getResourceTrackerService()); + nm1.registerNode(); + + MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1); + + // allocate a container that fills more than half the node + am1.allocate("127.0.0.1", 8192, 1, new ArrayList()); + nm1.nodeHeartbeat(true); + + // wait for containers to be allocated. + List containers = + am1.allocate(new ArrayList(), + new ArrayList()).getAllocatedContainers(); + while (containers.isEmpty()) { + Thread.sleep(10); + nm1.nodeHeartbeat(true); + containers = am1.allocate(new ArrayList(), + new ArrayList()).getAllocatedContainers(); + } + + // release the container from the AM + ContainerId cid = containers.get(0).getId(); + List releasedContainers = new ArrayList<>(1); + releasedContainers.add(cid); + List completedContainers = am1.allocate( + new ArrayList(), releasedContainers) + .getCompletedContainersStatuses(); + while (completedContainers.isEmpty()) { + Thread.sleep(10); + completedContainers = am1.allocate( + new ArrayList(), releasedContainers) + .getCompletedContainersStatuses(); + } + + // verify new container can be allocated immediately because container + // never launched on the node + containers = am1.allocate("127.0.0.1", 8192, 1, + new ArrayList()).getAllocatedContainers(); + nm1.nodeHeartbeat(true); + while (containers.isEmpty()) { + Thread.sleep(10); + nm1.nodeHeartbeat(true); + containers = am1.allocate(new ArrayList(), + new ArrayList()).getAllocatedContainers(); + } + + // launch the container on the node + cid = containers.get(0).getId(); + nm1.nodeHeartbeat(cid.getApplicationAttemptId(), cid.getContainerId(), + ContainerState.RUNNING); + rm1.waitForState(nm1, cid, RMContainerState.RUNNING); + + // release the container from the AM + releasedContainers.clear(); + releasedContainers.add(cid); + completedContainers = am1.allocate( + new ArrayList(), releasedContainers) + .getCompletedContainersStatuses(); + while (completedContainers.isEmpty()) { + Thread.sleep(10); + completedContainers = am1.allocate( + new ArrayList(), releasedContainers) + .getCompletedContainersStatuses(); + } + + // verify new container cannot be allocated immediately because container + // has not been released by the node + containers = am1.allocate("127.0.0.1", 8192, 1, + new ArrayList()).getAllocatedContainers(); + nm1.nodeHeartbeat(true); + Assert.assertTrue("new container allocated before node freed old", + containers.isEmpty()); + for (int i = 0; i < 10; ++i) { + Thread.sleep(10); + containers = am1.allocate(new ArrayList(), + new ArrayList()).getAllocatedContainers(); + nm1.nodeHeartbeat(true); + Assert.assertTrue("new container allocated before node freed old", + containers.isEmpty()); + } + + // free the old container from the node + nm1.nodeHeartbeat(cid.getApplicationAttemptId(), cid.getContainerId(), + ContainerState.COMPLETE); + + // verify new container is now allocated + containers = am1.allocate(new ArrayList(), + new ArrayList()).getAllocatedContainers(); + while (containers.isEmpty()) { + Thread.sleep(10); + nm1.nodeHeartbeat(true); + containers = am1.allocate(new ArrayList(), + new ArrayList()).getAllocatedContainers(); + } + } finally { + rm1.stop(); + System.out.println("Stopping testContainerReleasedByNode"); + } + } + @Test(timeout = 60000) public void testResourceRequestRestoreWhenRMContainerIsAtAllocated() throws Exception { http://git-wip-us.apache.org/repos/asf/hadoop/blob/dbac88ba/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestChildQueueOrder.java ---------------------------------------------------------------------- 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/TestChildQueueOrder.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/TestChildQueueOrder.java index 98d3dfb..db8ec886 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/TestChildQueueOrder.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/TestChildQueueOrder.java @@ -20,6 +20,7 @@ package org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; @@ -159,7 +160,8 @@ public class TestChildQueueOrder { }). when(queue).assignContainers(eq(clusterResource), eq(node), any(ResourceLimits.class), any(SchedulingMode.class)); - doNothing().when(node).releaseContainer(any(Container.class)); + doNothing().when(node).releaseContainer(any(ContainerId.class), + anyBoolean()); } @@ -230,7 +232,8 @@ public class TestChildQueueOrder { FiCaSchedulerNode node_0 = TestUtils.getMockNode("host_0", DEFAULT_RACK, 0, memoryPerNode*GB); - doNothing().when(node_0).releaseContainer(any(Container.class)); + doNothing().when(node_0).releaseContainer(any(ContainerId.class), + anyBoolean()); final Resource clusterResource = Resources.createResource(numNodes * (memoryPerNode*GB), --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org For additional commands, e-mail: common-commits-help@hadoop.apache.org