|
@@ -87,18 +87,6 @@ public class TestContainerResizing {
|
|
super();
|
|
super();
|
|
}
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
|
- protected void decreaseContainers(
|
|
|
|
- List<UpdateContainerRequest> decreaseRequests,
|
|
|
|
- SchedulerApplicationAttempt attempt) {
|
|
|
|
- try {
|
|
|
|
- Thread.sleep(1000);
|
|
|
|
- } catch(InterruptedException e) {
|
|
|
|
- LOG.debug("Thread interrupted.");
|
|
|
|
- }
|
|
|
|
- super.decreaseContainers(decreaseRequests, attempt);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
@Override
|
|
@Override
|
|
public CSAssignment allocateContainersToNode(
|
|
public CSAssignment allocateContainersToNode(
|
|
PlacementSet<FiCaSchedulerNode> ps, boolean withNodeHeartbeat) {
|
|
PlacementSet<FiCaSchedulerNode> ps, boolean withNodeHeartbeat) {
|
|
@@ -288,13 +276,9 @@ public class TestContainerResizing {
|
|
CapacityScheduler cs = (CapacityScheduler) rm1.getResourceScheduler();
|
|
CapacityScheduler cs = (CapacityScheduler) rm1.getResourceScheduler();
|
|
RMNode rmNode1 = rm1.getRMContext().getRMNodes().get(nm1.getNodeId());
|
|
RMNode rmNode1 = rm1.getRMContext().getRMNodes().get(nm1.getNodeId());
|
|
cs.handle(new NodeUpdateSchedulerEvent(rmNode1));
|
|
cs.handle(new NodeUpdateSchedulerEvent(rmNode1));
|
|
-
|
|
|
|
- RMContainer rmContainer1 = app.getLiveContainersMap().get(containerId1);
|
|
|
|
|
|
|
|
/* Check reservation statuses */
|
|
/* Check reservation statuses */
|
|
// Increase request should be reserved
|
|
// Increase request should be reserved
|
|
- Assert.assertTrue(rmContainer1.hasIncreaseReservation());
|
|
|
|
- Assert.assertEquals(6 * GB, rmContainer1.getReservedResource().getMemorySize());
|
|
|
|
Assert.assertFalse(app.getReservedContainers().isEmpty());
|
|
Assert.assertFalse(app.getReservedContainers().isEmpty());
|
|
Assert.assertNotNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
Assert.assertNotNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
// Pending resource will not be changed since it's not satisfied
|
|
// Pending resource will not be changed since it's not satisfied
|
|
@@ -319,7 +303,6 @@ public class TestContainerResizing {
|
|
|
|
|
|
/* Check statuses after reservation satisfied */
|
|
/* Check statuses after reservation satisfied */
|
|
// Increase request should be unreserved
|
|
// Increase request should be unreserved
|
|
- Assert.assertFalse(rmContainer1.hasIncreaseReservation());
|
|
|
|
Assert.assertTrue(app.getReservedContainers().isEmpty());
|
|
Assert.assertTrue(app.getReservedContainers().isEmpty());
|
|
Assert.assertNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
Assert.assertNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
// Pending resource will be changed since it's satisfied
|
|
// Pending resource will be changed since it's satisfied
|
|
@@ -391,11 +374,8 @@ public class TestContainerResizing {
|
|
RMNode rmNode1 = rm1.getRMContext().getRMNodes().get(nm1.getNodeId());
|
|
RMNode rmNode1 = rm1.getRMContext().getRMNodes().get(nm1.getNodeId());
|
|
cs.handle(new NodeUpdateSchedulerEvent(rmNode1));
|
|
cs.handle(new NodeUpdateSchedulerEvent(rmNode1));
|
|
|
|
|
|
- RMContainer rmContainer1 = app.getLiveContainersMap().get(containerId2);
|
|
|
|
-
|
|
|
|
/* Check reservation statuses */
|
|
/* Check reservation statuses */
|
|
// Increase request should *NOT* be reserved as it exceeds user limit
|
|
// Increase request should *NOT* be reserved as it exceeds user limit
|
|
- Assert.assertFalse(rmContainer1.hasIncreaseReservation());
|
|
|
|
Assert.assertTrue(app.getReservedContainers().isEmpty());
|
|
Assert.assertTrue(app.getReservedContainers().isEmpty());
|
|
Assert.assertNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
Assert.assertNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
// Pending resource will not be changed since it's not satisfied
|
|
// Pending resource will not be changed since it's not satisfied
|
|
@@ -471,13 +451,9 @@ public class TestContainerResizing {
|
|
CapacityScheduler cs = (CapacityScheduler) rm1.getResourceScheduler();
|
|
CapacityScheduler cs = (CapacityScheduler) rm1.getResourceScheduler();
|
|
RMNode rmNode1 = rm1.getRMContext().getRMNodes().get(nm1.getNodeId());
|
|
RMNode rmNode1 = rm1.getRMContext().getRMNodes().get(nm1.getNodeId());
|
|
cs.handle(new NodeUpdateSchedulerEvent(rmNode1));
|
|
cs.handle(new NodeUpdateSchedulerEvent(rmNode1));
|
|
-
|
|
|
|
- RMContainer rmContainer1 = app.getLiveContainersMap().get(containerId1);
|
|
|
|
|
|
|
|
/* Check reservation statuses */
|
|
/* Check reservation statuses */
|
|
// Increase request should be reserved
|
|
// Increase request should be reserved
|
|
- Assert.assertTrue(rmContainer1.hasIncreaseReservation());
|
|
|
|
- Assert.assertEquals(6 * GB, rmContainer1.getReservedResource().getMemorySize());
|
|
|
|
Assert.assertFalse(app.getReservedContainers().isEmpty());
|
|
Assert.assertFalse(app.getReservedContainers().isEmpty());
|
|
Assert.assertNotNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
Assert.assertNotNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
// Pending resource will not be changed since it's not satisfied
|
|
// Pending resource will not be changed since it's not satisfied
|
|
@@ -510,7 +486,6 @@ public class TestContainerResizing {
|
|
// Increase request should be unreserved
|
|
// Increase request should be unreserved
|
|
Assert.assertTrue(app.getReservedContainers().isEmpty());
|
|
Assert.assertTrue(app.getReservedContainers().isEmpty());
|
|
Assert.assertNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
Assert.assertNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
- Assert.assertFalse(rmContainer1.hasIncreaseReservation());
|
|
|
|
// Pending resource will be changed since it's satisfied
|
|
// Pending resource will be changed since it's satisfied
|
|
checkPendingResource(rm1, "default", 0 * GB, null);
|
|
checkPendingResource(rm1, "default", 0 * GB, null);
|
|
Assert.assertEquals(0 * GB,
|
|
Assert.assertEquals(0 * GB,
|
|
@@ -585,13 +560,9 @@ public class TestContainerResizing {
|
|
CapacityScheduler cs = (CapacityScheduler) rm1.getResourceScheduler();
|
|
CapacityScheduler cs = (CapacityScheduler) rm1.getResourceScheduler();
|
|
RMNode rmNode1 = rm1.getRMContext().getRMNodes().get(nm1.getNodeId());
|
|
RMNode rmNode1 = rm1.getRMContext().getRMNodes().get(nm1.getNodeId());
|
|
cs.handle(new NodeUpdateSchedulerEvent(rmNode1));
|
|
cs.handle(new NodeUpdateSchedulerEvent(rmNode1));
|
|
-
|
|
|
|
- RMContainer rmContainer1 = app.getLiveContainersMap().get(containerId1);
|
|
|
|
|
|
|
|
/* Check reservation statuses */
|
|
/* Check reservation statuses */
|
|
// Increase request should be reserved
|
|
// Increase request should be reserved
|
|
- Assert.assertTrue(rmContainer1.hasIncreaseReservation());
|
|
|
|
- Assert.assertEquals(6 * GB, rmContainer1.getReservedResource().getMemorySize());
|
|
|
|
Assert.assertFalse(app.getReservedContainers().isEmpty());
|
|
Assert.assertFalse(app.getReservedContainers().isEmpty());
|
|
Assert.assertNotNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
Assert.assertNotNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
// Pending resource will not be changed since it's not satisfied
|
|
// Pending resource will not be changed since it's not satisfied
|
|
@@ -614,7 +585,7 @@ public class TestContainerResizing {
|
|
am1.sendContainerResizingRequest(Arrays.asList(
|
|
am1.sendContainerResizingRequest(Arrays.asList(
|
|
UpdateContainerRequest
|
|
UpdateContainerRequest
|
|
.newInstance(0, containerId1,
|
|
.newInstance(0, containerId1,
|
|
- ContainerUpdateType.INCREASE_RESOURCE,
|
|
|
|
|
|
+ ContainerUpdateType.DECREASE_RESOURCE,
|
|
Resources.createResource(1 * GB), null)));
|
|
Resources.createResource(1 * GB), null)));
|
|
// Trigger a node heartbeat..
|
|
// Trigger a node heartbeat..
|
|
cs.handle(new NodeUpdateSchedulerEvent(rmNode1));
|
|
cs.handle(new NodeUpdateSchedulerEvent(rmNode1));
|
|
@@ -623,7 +594,6 @@ public class TestContainerResizing {
|
|
// Increase request should be unreserved
|
|
// Increase request should be unreserved
|
|
Assert.assertTrue(app.getReservedContainers().isEmpty());
|
|
Assert.assertTrue(app.getReservedContainers().isEmpty());
|
|
Assert.assertNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
Assert.assertNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
- Assert.assertFalse(rmContainer1.hasIncreaseReservation());
|
|
|
|
// Pending resource will be changed since it's satisfied
|
|
// Pending resource will be changed since it's satisfied
|
|
checkPendingResource(rm1, "default", 0 * GB, null);
|
|
checkPendingResource(rm1, "default", 0 * GB, null);
|
|
Assert.assertEquals(0 * GB,
|
|
Assert.assertEquals(0 * GB,
|
|
@@ -698,12 +668,8 @@ public class TestContainerResizing {
|
|
RMNode rmNode1 = rm1.getRMContext().getRMNodes().get(nm1.getNodeId());
|
|
RMNode rmNode1 = rm1.getRMContext().getRMNodes().get(nm1.getNodeId());
|
|
cs.handle(new NodeUpdateSchedulerEvent(rmNode1));
|
|
cs.handle(new NodeUpdateSchedulerEvent(rmNode1));
|
|
|
|
|
|
- RMContainer rmContainer2 = app.getLiveContainersMap().get(containerId2);
|
|
|
|
-
|
|
|
|
/* Check reservation statuses */
|
|
/* Check reservation statuses */
|
|
// Increase request should be reserved
|
|
// Increase request should be reserved
|
|
- Assert.assertTrue(rmContainer2.hasIncreaseReservation());
|
|
|
|
- Assert.assertEquals(6 * GB, rmContainer2.getReservedResource().getMemorySize());
|
|
|
|
Assert.assertFalse(app.getReservedContainers().isEmpty());
|
|
Assert.assertFalse(app.getReservedContainers().isEmpty());
|
|
Assert.assertNotNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
Assert.assertNotNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
// Pending resource will not be changed since it's not satisfied
|
|
// Pending resource will not be changed since it's not satisfied
|
|
@@ -721,12 +687,13 @@ public class TestContainerResizing {
|
|
|
|
|
|
// Complete container2, container will be unreserved and completed
|
|
// Complete container2, container will be unreserved and completed
|
|
am1.allocate(null, Arrays.asList(containerId2));
|
|
am1.allocate(null, Arrays.asList(containerId2));
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ cs.handle(new NodeUpdateSchedulerEvent(rmNode1));
|
|
|
|
+ am1.allocate(null, null);
|
|
/* Check statuses after reservation satisfied */
|
|
/* Check statuses after reservation satisfied */
|
|
// Increase request should be unreserved
|
|
// Increase request should be unreserved
|
|
Assert.assertTrue(app.getReservedContainers().isEmpty());
|
|
Assert.assertTrue(app.getReservedContainers().isEmpty());
|
|
Assert.assertNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
Assert.assertNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
- Assert.assertFalse(rmContainer2.hasIncreaseReservation());
|
|
|
|
// Pending resource will be changed since it's satisfied
|
|
// Pending resource will be changed since it's satisfied
|
|
checkPendingResource(rm1, "default", 0 * GB, null);
|
|
checkPendingResource(rm1, "default", 0 * GB, null);
|
|
Assert.assertEquals(0 * GB,
|
|
Assert.assertEquals(0 * GB,
|
|
@@ -796,12 +763,8 @@ public class TestContainerResizing {
|
|
RMNode rmNode1 = rm1.getRMContext().getRMNodes().get(nm1.getNodeId());
|
|
RMNode rmNode1 = rm1.getRMContext().getRMNodes().get(nm1.getNodeId());
|
|
cs.handle(new NodeUpdateSchedulerEvent(rmNode1));
|
|
cs.handle(new NodeUpdateSchedulerEvent(rmNode1));
|
|
|
|
|
|
- RMContainer rmContainer2 = app.getLiveContainersMap().get(containerId2);
|
|
|
|
-
|
|
|
|
/* Check reservation statuses */
|
|
/* Check reservation statuses */
|
|
// Increase request should be reserved
|
|
// Increase request should be reserved
|
|
- Assert.assertTrue(rmContainer2.hasIncreaseReservation());
|
|
|
|
- Assert.assertEquals(6 * GB, rmContainer2.getReservedResource().getMemorySize());
|
|
|
|
Assert.assertFalse(app.getReservedContainers().isEmpty());
|
|
Assert.assertFalse(app.getReservedContainers().isEmpty());
|
|
Assert.assertNotNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
Assert.assertNotNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
// Pending resource will not be changed since it's not satisfied
|
|
// Pending resource will not be changed since it's not satisfied
|
|
@@ -825,11 +788,11 @@ public class TestContainerResizing {
|
|
// Increase request should be unreserved
|
|
// Increase request should be unreserved
|
|
Assert.assertTrue(app.getReservedContainers().isEmpty());
|
|
Assert.assertTrue(app.getReservedContainers().isEmpty());
|
|
Assert.assertNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
Assert.assertNull(cs.getNode(nm1.getNodeId()).getReservedContainer());
|
|
- Assert.assertFalse(rmContainer2.hasIncreaseReservation());
|
|
|
|
// Pending resource will be changed since it's satisfied
|
|
// Pending resource will be changed since it's satisfied
|
|
|
|
+ cs.handle(new NodeUpdateSchedulerEvent(rmNode1));
|
|
|
|
+
|
|
checkPendingResource(rm1, "default", 0 * GB, null);
|
|
checkPendingResource(rm1, "default", 0 * GB, null);
|
|
- Assert.assertEquals(0 * GB,
|
|
|
|
- app.getAppAttemptResourceUsage().getPending().getMemorySize());
|
|
|
|
|
|
+
|
|
// Queue/user/application's usage will be updated
|
|
// Queue/user/application's usage will be updated
|
|
checkUsedResource(rm1, "default", 0 * GB, null);
|
|
checkUsedResource(rm1, "default", 0 * GB, null);
|
|
// User will be removed
|
|
// User will be removed
|
|
@@ -949,89 +912,6 @@ public class TestContainerResizing {
|
|
rm1.close();
|
|
rm1.close();
|
|
}
|
|
}
|
|
|
|
|
|
- @Test
|
|
|
|
- public void testIncreaseContainerRequestGetPreferrence()
|
|
|
|
- throws Exception {
|
|
|
|
- /**
|
|
|
|
- * There're multiple containers need to be increased, and there're several
|
|
|
|
- * container allocation request, scheduler will try to increase container
|
|
|
|
- * before allocate new containers
|
|
|
|
- */
|
|
|
|
- MockRM rm1 = new MockRM() {
|
|
|
|
- @Override
|
|
|
|
- public RMNodeLabelsManager createNodeLabelManager() {
|
|
|
|
- return mgr;
|
|
|
|
- }
|
|
|
|
- };
|
|
|
|
- rm1.start();
|
|
|
|
- MockNM nm1 = rm1.registerNode("h1:1234", 10 * GB);
|
|
|
|
-
|
|
|
|
- // app1 -> a1
|
|
|
|
- RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "default");
|
|
|
|
- MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
|
|
|
|
-
|
|
|
|
- FiCaSchedulerApp app = TestUtils.getFiCaSchedulerApp(
|
|
|
|
- rm1, app1.getApplicationId());
|
|
|
|
- ApplicationAttemptId attemptId = am1.getApplicationAttemptId();
|
|
|
|
-
|
|
|
|
- // Container 2, 3 (priority=3)
|
|
|
|
- allocateAndLaunchContainers(am1, nm1, rm1, 2, 1 * GB, 3, 2);
|
|
|
|
-
|
|
|
|
- // Container 4, 5 (priority=2)
|
|
|
|
- allocateAndLaunchContainers(am1, nm1, rm1, 2, 1 * GB, 2, 4);
|
|
|
|
-
|
|
|
|
- // Container 6, 7 (priority=4)
|
|
|
|
- allocateAndLaunchContainers(am1, nm1, rm1, 2, 1 * GB, 4, 6);
|
|
|
|
-
|
|
|
|
- // am1 asks to change its container[2-7] from 1G to 2G
|
|
|
|
- List<UpdateContainerRequest> increaseRequests = new ArrayList<>();
|
|
|
|
- for (int cId = 2; cId <= 7; cId++) {
|
|
|
|
- ContainerId containerId =
|
|
|
|
- ContainerId.newContainerId(am1.getApplicationAttemptId(), cId);
|
|
|
|
- increaseRequests.add(UpdateContainerRequest
|
|
|
|
- .newInstance(0, containerId,
|
|
|
|
- ContainerUpdateType.INCREASE_RESOURCE,
|
|
|
|
- Resources.createResource(2 * GB), null));
|
|
|
|
- }
|
|
|
|
- am1.sendContainerResizingRequest(increaseRequests);
|
|
|
|
-
|
|
|
|
- checkPendingResource(rm1, "default", 6 * GB, null);
|
|
|
|
- Assert.assertEquals(6 * GB,
|
|
|
|
- app.getAppAttemptResourceUsage().getPending().getMemorySize());
|
|
|
|
-
|
|
|
|
- // Get rmNode1
|
|
|
|
- CapacityScheduler cs = (CapacityScheduler) rm1.getResourceScheduler();
|
|
|
|
- RMNode rmNode1 = rm1.getRMContext().getRMNodes().get(nm1.getNodeId());
|
|
|
|
-
|
|
|
|
- // assignContainer, container-4/5/2 increased (which has highest priority OR
|
|
|
|
- // earlier allocated)
|
|
|
|
- cs.handle(new NodeUpdateSchedulerEvent(rmNode1));
|
|
|
|
- AllocateResponse allocateResponse = am1.allocate(null, null);
|
|
|
|
- Assert.assertEquals(3, allocateResponse.getUpdatedContainers().size());
|
|
|
|
- verifyContainerIncreased(allocateResponse,
|
|
|
|
- ContainerId.newContainerId(attemptId, 4), 2 * GB);
|
|
|
|
- verifyContainerIncreased(allocateResponse,
|
|
|
|
- ContainerId.newContainerId(attemptId, 5), 2 * GB);
|
|
|
|
- verifyContainerIncreased(allocateResponse,
|
|
|
|
- ContainerId.newContainerId(attemptId, 2), 2 * GB);
|
|
|
|
-
|
|
|
|
- /* Check statuses after allocation */
|
|
|
|
- // There're still 3 pending increase requests
|
|
|
|
- checkPendingResource(rm1, "default", 3 * GB, null);
|
|
|
|
- Assert.assertEquals(3 * GB,
|
|
|
|
- app.getAppAttemptResourceUsage().getPending().getMemorySize());
|
|
|
|
- // Queue/user/application's usage will be updated
|
|
|
|
- checkUsedResource(rm1, "default", 10 * GB, null);
|
|
|
|
- Assert.assertEquals(10 * GB, ((LeafQueue) cs.getQueue("default"))
|
|
|
|
- .getUser("user").getUsed().getMemorySize());
|
|
|
|
- Assert.assertEquals(0 * GB,
|
|
|
|
- app.getAppAttemptResourceUsage().getReserved().getMemorySize());
|
|
|
|
- Assert.assertEquals(10 * GB,
|
|
|
|
- app.getAppAttemptResourceUsage().getUsed().getMemorySize());
|
|
|
|
-
|
|
|
|
- rm1.close();
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
@Test (timeout = 60000)
|
|
@Test (timeout = 60000)
|
|
public void testDecreaseContainerWillNotDeadlockContainerAllocation()
|
|
public void testDecreaseContainerWillNotDeadlockContainerAllocation()
|
|
throws Exception {
|
|
throws Exception {
|