|
@@ -562,4 +562,66 @@ public class TestRMContainerImpl {
|
|
|
AllocationTags.createSingleAppAllocationTags(appId, null),
|
|
|
Long::max));
|
|
|
}
|
|
|
+
|
|
|
+ @Test(timeout = 30000)
|
|
|
+ public void testContainerAcquiredAtKilled() {
|
|
|
+ DrainDispatcher drainDispatcher = new DrainDispatcher();
|
|
|
+ EventHandler<RMAppAttemptEvent> appAttemptEventHandler = mock(
|
|
|
+ EventHandler.class);
|
|
|
+ EventHandler generic = mock(EventHandler.class);
|
|
|
+ drainDispatcher.register(RMAppAttemptEventType.class,
|
|
|
+ appAttemptEventHandler);
|
|
|
+ drainDispatcher.register(RMNodeEventType.class, generic);
|
|
|
+ drainDispatcher.init(new YarnConfiguration());
|
|
|
+ drainDispatcher.start();
|
|
|
+ NodeId nodeId = BuilderUtils.newNodeId("host", 3425);
|
|
|
+ ApplicationId appId = BuilderUtils.newApplicationId(1, 1);
|
|
|
+ ApplicationAttemptId appAttemptId = BuilderUtils.newApplicationAttemptId(
|
|
|
+ appId, 1);
|
|
|
+ ContainerId containerId = BuilderUtils.newContainerId(appAttemptId, 1);
|
|
|
+ ContainerAllocationExpirer expirer = mock(ContainerAllocationExpirer.class);
|
|
|
+
|
|
|
+ Resource resource = BuilderUtils.newResource(512, 1);
|
|
|
+ Priority priority = BuilderUtils.newPriority(5);
|
|
|
+
|
|
|
+ Container container = BuilderUtils.newContainer(containerId, nodeId,
|
|
|
+ "host:3465", resource, priority, null);
|
|
|
+
|
|
|
+ ConcurrentMap<ApplicationId, RMApp> appMap = new ConcurrentHashMap<>();
|
|
|
+ RMApp rmApp = mock(RMApp.class);
|
|
|
+ appMap.putIfAbsent(appId, rmApp);
|
|
|
+
|
|
|
+ RMApplicationHistoryWriter writer = mock(RMApplicationHistoryWriter.class);
|
|
|
+ SystemMetricsPublisher publisher = mock(SystemMetricsPublisher.class);
|
|
|
+ RMContext rmContext = mock(RMContext.class);
|
|
|
+ when(rmContext.getDispatcher()).thenReturn(drainDispatcher);
|
|
|
+ when(rmContext.getContainerAllocationExpirer()).thenReturn(expirer);
|
|
|
+ when(rmContext.getRMApplicationHistoryWriter()).thenReturn(writer);
|
|
|
+ when(rmContext.getSystemMetricsPublisher()).thenReturn(publisher);
|
|
|
+ AllocationTagsManager ptm = mock(AllocationTagsManager.class);
|
|
|
+ when(rmContext.getAllocationTagsManager()).thenReturn(ptm);
|
|
|
+
|
|
|
+ YarnConfiguration conf = new YarnConfiguration();
|
|
|
+ conf.setBoolean(
|
|
|
+ YarnConfiguration.APPLICATION_HISTORY_SAVE_NON_AM_CONTAINER_META_INFO,
|
|
|
+ true);
|
|
|
+ when(rmContext.getYarnConfiguration()).thenReturn(conf);
|
|
|
+ when(rmContext.getRMApps()).thenReturn(appMap);
|
|
|
+
|
|
|
+ RMContainer rmContainer = new RMContainerImpl(container,
|
|
|
+ SchedulerRequestKey.extractFrom(container), appAttemptId,
|
|
|
+ nodeId, "user", rmContext) {
|
|
|
+ @Override
|
|
|
+ protected void onInvalidStateTransition(
|
|
|
+ RMContainerEventType rmContainerEventType, RMContainerState state) {
|
|
|
+ Assert.fail("RMContainerImpl: can't handle " + rmContainerEventType
|
|
|
+ + " at state " + state);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ rmContainer.handle(new RMContainerEvent(containerId,
|
|
|
+ RMContainerEventType.KILL));
|
|
|
+
|
|
|
+ rmContainer.handle(new RMContainerEvent(containerId,
|
|
|
+ RMContainerEventType.ACQUIRED));
|
|
|
+ }
|
|
|
}
|