|
@@ -379,27 +379,38 @@ public class ContainerLauncherImpl extends AbstractService implements
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public void run() {
|
|
public void run() {
|
|
- LOG.info("Processing the event " + event.toString());
|
|
|
|
|
|
+ LOG.info("Processing the event {}", event);
|
|
|
|
|
|
// Load ContainerManager tokens before creating a connection.
|
|
// Load ContainerManager tokens before creating a connection.
|
|
// TODO: Do it only once per NodeManager.
|
|
// TODO: Do it only once per NodeManager.
|
|
ContainerId containerID = event.getContainerID();
|
|
ContainerId containerID = event.getContainerID();
|
|
|
|
|
|
- Container c = getContainer(event);
|
|
|
|
switch(event.getType()) {
|
|
switch(event.getType()) {
|
|
|
|
|
|
case CONTAINER_REMOTE_LAUNCH:
|
|
case CONTAINER_REMOTE_LAUNCH:
|
|
ContainerRemoteLaunchEvent launchEvent
|
|
ContainerRemoteLaunchEvent launchEvent
|
|
= (ContainerRemoteLaunchEvent) event;
|
|
= (ContainerRemoteLaunchEvent) event;
|
|
- c.launch(launchEvent);
|
|
|
|
|
|
+ getContainer(event).launch(launchEvent);
|
|
break;
|
|
break;
|
|
|
|
|
|
case CONTAINER_REMOTE_CLEANUP:
|
|
case CONTAINER_REMOTE_CLEANUP:
|
|
- c.kill(event.getDumpContainerThreads());
|
|
|
|
|
|
+ // If the container failed to launch earlier (due to dead node for example),
|
|
|
|
+ // it has been marked as FAILED and removed from containers during
|
|
|
|
+ // CONTAINER_REMOTE_LAUNCH event handling.
|
|
|
|
+ // Skip kill() such container during CONTAINER_REMOTE_CLEANUP as
|
|
|
|
+ // it is not necessary and could cost 15 minutes delay if the node is dead.
|
|
|
|
+ if (!containers.containsKey(containerID)) {
|
|
|
|
+ LOG.info("Skip cleanup of already-removed container {}", containerID);
|
|
|
|
+ // send killed event to task attempt regardless like in kill().
|
|
|
|
+ context.getEventHandler().handle(new TaskAttemptEvent(event.getTaskAttemptID(),
|
|
|
|
+ TaskAttemptEventType.TA_CONTAINER_CLEANED));
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ getContainer(event).kill(event.getDumpContainerThreads());
|
|
break;
|
|
break;
|
|
|
|
|
|
case CONTAINER_COMPLETED:
|
|
case CONTAINER_COMPLETED:
|
|
- c.done();
|
|
|
|
|
|
+ getContainer(event).done();
|
|
break;
|
|
break;
|
|
|
|
|
|
}
|
|
}
|