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/TestCapacitySchedulerPerf.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/TestCapacitySchedulerPerf.java index a2ccf6e30e6..51ee5b15eee 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/TestCapacitySchedulerPerf.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/TestCapacitySchedulerPerf.java @@ -20,10 +20,14 @@ import org.apache.hadoop.util.Time; import org.apache.hadoop.yarn.api.protocolrecords.ResourceTypes; +import org.apache.hadoop.yarn.api.records.ApplicationAccessType; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext; 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.Priority; import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.api.records.ResourceInformation; @@ -31,11 +35,15 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.factories.RecordFactory; import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider; +import org.apache.hadoop.yarn.server.resourcemanager.MockAM; +import org.apache.hadoop.yarn.server.resourcemanager.MockNM; import org.apache.hadoop.yarn.server.resourcemanager.MockNodes; import org.apache.hadoop.yarn.server.resourcemanager.MockRM; +import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppImpl; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptImpl; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptMetrics; +import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainerState; import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerApp; @@ -50,16 +58,20 @@ import org.apache.log4j.Level; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; +import org.junit.Assert; import org.junit.Assume; import org.junit.Test; +import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.PriorityQueue; import static org.apache.hadoop.yarn.server.resourcemanager.resource.TestResourceProfiles.TEST_CONF_RESET_RESOURCE_TYPES; +import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -93,8 +105,8 @@ private void testUserLimitThroughputWithNumberOfResourceTypes( // Since this is more of a performance unit test, only run if // RunUserLimitThroughput is set (-DRunUserLimitThroughput=true) - Assume.assumeTrue(Boolean.valueOf( - System.getProperty("RunCapacitySchedulerPerfTests"))); + Assume.assumeTrue( + Boolean.valueOf(System.getProperty("RunCapacitySchedulerPerfTests"))); CapacitySchedulerConfiguration csconf = new CapacitySchedulerConfiguration(); @@ -262,4 +274,79 @@ public void testUserLimitThroughputForFourResources() throws Exception { public void testUserLimitThroughputForFiveResources() throws Exception { testUserLimitThroughputWithNumberOfResourceTypes(5); } + + @Test(timeout = 360000) + public void testReleaseContainersInBatch() throws Exception { + YarnConfiguration conf = new YarnConfiguration(); + conf.set(YarnConfiguration.RM_SCHEDULER, CapacityScheduler.class.getName()); + MockRM rm1 = new MockRM(conf); + try { + rm1.start(); + RMApp app1 = + rm1.submitApp(200, "name", "user", + new HashMap(), false, "default", + -1, null, "Test", false, true); + int containersCount = 10000; + MockNM nm1 = + new MockNM("127.0.0.1:1234", 1024 * containersCount, + rm1.getResourceTrackerService()); + nm1.registerNode(); + + MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1); + + am1.allocate("127.0.0.1", 1024, containersCount, + new ArrayList()); + nm1.nodeHeartbeat(true); + + CapacityScheduler cs = (CapacityScheduler) rm1.getResourceScheduler(); + RMNode rmNode1 = rm1.getRMContext().getRMNodes().get(nm1.getNodeId()); + + FiCaSchedulerApp schedulerApp1 = + cs.getApplicationAttempt(am1.getApplicationAttemptId()); + + cs.handle(new NodeUpdateSchedulerEvent(rmNode1)); + + // wait for containers to be allocated. + List containers = + am1.allocate(new ArrayList(), + new ArrayList()).getAllocatedContainers(); + while (containers.isEmpty()) { + Thread.sleep(10000); + nm1.nodeHeartbeat(true); + containers = am1.allocate(new ArrayList(), + new ArrayList()).getAllocatedContainers(); + } + // assertEquals(containersCount, containers.size()); + + // release the container from the AM + // ContainerId cid = containers.get(0).getId(); + List releasedContainers = new ArrayList<>(containersCount); + for (Container c : containers) { + releasedContainers.add(c.getId()); + } + + System.out.println("before live container is " + + schedulerApp1.getLiveContainers().size()); + + long old = System.currentTimeMillis(); + List completedContainers = am1.allocate( + new ArrayList(), releasedContainers) + .getCompletedContainersStatuses(); + + + long i = 1; + System.out.println( + "live container is " + schedulerApp1.getLiveContainers().size()); + while (schedulerApp1.getLiveContainers().size() > 1) { + i++; + System.out.println( + "live container1 is " + schedulerApp1.getLiveContainers().size()); + } + long timeTaken = System.currentTimeMillis() - old; + System.out.println("time taken" + timeTaken + " loop count is " + i); + + } finally { + rm1.stop(); + } + } }