|
@@ -159,9 +159,6 @@ public class ContainerImpl implements Container {
|
|
|
this.diagnostics.append(diagnostics);
|
|
|
}
|
|
|
|
|
|
- private static final ContainerDoneTransition CONTAINER_DONE_TRANSITION =
|
|
|
- new ContainerDoneTransition();
|
|
|
-
|
|
|
private static final ContainerDiagnosticsUpdateTransition UPDATE_DIAGNOSTICS_TRANSITION =
|
|
|
new ContainerDiagnosticsUpdateTransition();
|
|
|
|
|
@@ -202,7 +199,7 @@ public class ContainerImpl implements Container {
|
|
|
.addTransition(ContainerState.LOCALIZATION_FAILED,
|
|
|
ContainerState.DONE,
|
|
|
ContainerEventType.CONTAINER_RESOURCES_CLEANEDUP,
|
|
|
- CONTAINER_DONE_TRANSITION)
|
|
|
+ new LocalizationFailedToDoneTransition())
|
|
|
.addTransition(ContainerState.LOCALIZATION_FAILED,
|
|
|
ContainerState.LOCALIZATION_FAILED,
|
|
|
ContainerEventType.UPDATE_DIAGNOSTICS_MSG,
|
|
@@ -254,7 +251,7 @@ public class ContainerImpl implements Container {
|
|
|
// From CONTAINER_EXITED_WITH_SUCCESS State
|
|
|
.addTransition(ContainerState.EXITED_WITH_SUCCESS, ContainerState.DONE,
|
|
|
ContainerEventType.CONTAINER_RESOURCES_CLEANEDUP,
|
|
|
- CONTAINER_DONE_TRANSITION)
|
|
|
+ new ExitedWithSuccessToDoneTransition())
|
|
|
.addTransition(ContainerState.EXITED_WITH_SUCCESS,
|
|
|
ContainerState.EXITED_WITH_SUCCESS,
|
|
|
ContainerEventType.UPDATE_DIAGNOSTICS_MSG,
|
|
@@ -266,7 +263,7 @@ public class ContainerImpl implements Container {
|
|
|
// From EXITED_WITH_FAILURE State
|
|
|
.addTransition(ContainerState.EXITED_WITH_FAILURE, ContainerState.DONE,
|
|
|
ContainerEventType.CONTAINER_RESOURCES_CLEANEDUP,
|
|
|
- CONTAINER_DONE_TRANSITION)
|
|
|
+ new ExitedWithFailureToDoneTransition())
|
|
|
.addTransition(ContainerState.EXITED_WITH_FAILURE,
|
|
|
ContainerState.EXITED_WITH_FAILURE,
|
|
|
ContainerEventType.UPDATE_DIAGNOSTICS_MSG,
|
|
@@ -301,7 +298,7 @@ public class ContainerImpl implements Container {
|
|
|
.addTransition(ContainerState.KILLING,
|
|
|
ContainerState.DONE,
|
|
|
ContainerEventType.CONTAINER_RESOURCES_CLEANEDUP,
|
|
|
- CONTAINER_DONE_TRANSITION)
|
|
|
+ new KillingToDoneTransition())
|
|
|
// Handle a launched container during killing stage is a no-op
|
|
|
// as cleanup container is always handled after launch container event
|
|
|
// in the container launcher
|
|
@@ -313,7 +310,7 @@ public class ContainerImpl implements Container {
|
|
|
.addTransition(ContainerState.CONTAINER_CLEANEDUP_AFTER_KILL,
|
|
|
ContainerState.DONE,
|
|
|
ContainerEventType.CONTAINER_RESOURCES_CLEANEDUP,
|
|
|
- CONTAINER_DONE_TRANSITION)
|
|
|
+ new ContainerCleanedupAfterKillToDoneTransition())
|
|
|
.addTransition(ContainerState.CONTAINER_CLEANEDUP_AFTER_KILL,
|
|
|
ContainerState.CONTAINER_CLEANEDUP_AFTER_KILL,
|
|
|
ContainerEventType.UPDATE_DIAGNOSTICS_MSG,
|
|
@@ -463,47 +460,6 @@ public class ContainerImpl implements Container {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- @SuppressWarnings("fallthrough")
|
|
|
- private void finished() {
|
|
|
- ApplicationId applicationId =
|
|
|
- containerId.getApplicationAttemptId().getApplicationId();
|
|
|
- switch (getContainerState()) {
|
|
|
- case EXITED_WITH_SUCCESS:
|
|
|
- metrics.endRunningContainer();
|
|
|
- metrics.completedContainer();
|
|
|
- NMAuditLogger.logSuccess(user,
|
|
|
- AuditConstants.FINISH_SUCCESS_CONTAINER, "ContainerImpl",
|
|
|
- applicationId, containerId);
|
|
|
- break;
|
|
|
- case EXITED_WITH_FAILURE:
|
|
|
- if (wasLaunched) {
|
|
|
- metrics.endRunningContainer();
|
|
|
- }
|
|
|
- // fall through
|
|
|
- case LOCALIZATION_FAILED:
|
|
|
- metrics.failedContainer();
|
|
|
- NMAuditLogger.logFailure(user,
|
|
|
- AuditConstants.FINISH_FAILED_CONTAINER, "ContainerImpl",
|
|
|
- "Container failed with state: " + getContainerState(),
|
|
|
- applicationId, containerId);
|
|
|
- break;
|
|
|
- case CONTAINER_CLEANEDUP_AFTER_KILL:
|
|
|
- if (wasLaunched) {
|
|
|
- metrics.endRunningContainer();
|
|
|
- }
|
|
|
- // fall through
|
|
|
- case NEW:
|
|
|
- metrics.killedContainer();
|
|
|
- NMAuditLogger.logSuccess(user,
|
|
|
- AuditConstants.FINISH_KILLED_CONTAINER, "ContainerImpl",
|
|
|
- applicationId,
|
|
|
- containerId);
|
|
|
- }
|
|
|
-
|
|
|
- metrics.releaseContainer(this.resource);
|
|
|
- sendFinishedEvents();
|
|
|
- }
|
|
|
-
|
|
|
@SuppressWarnings("unchecked")
|
|
|
private void sendFinishedEvents() {
|
|
|
// Inform the application
|
|
@@ -611,7 +567,13 @@ public class ContainerImpl implements Container {
|
|
|
} else if (container.recoveredAsKilled &&
|
|
|
container.recoveredStatus == RecoveredContainerStatus.REQUESTED) {
|
|
|
// container was killed but never launched
|
|
|
- container.finished();
|
|
|
+ container.metrics.killedContainer();
|
|
|
+ NMAuditLogger.logSuccess(container.user,
|
|
|
+ AuditConstants.FINISH_KILLED_CONTAINER, "ContainerImpl",
|
|
|
+ container.containerId.getApplicationAttemptId().getApplicationId(),
|
|
|
+ container.containerId);
|
|
|
+ container.metrics.releaseContainer(container.resource);
|
|
|
+ container.sendFinishedEvents();
|
|
|
return ContainerState.DONE;
|
|
|
}
|
|
|
|
|
@@ -994,7 +956,8 @@ public class ContainerImpl implements Container {
|
|
|
@Override
|
|
|
@SuppressWarnings("unchecked")
|
|
|
public void transition(ContainerImpl container, ContainerEvent event) {
|
|
|
- container.finished();
|
|
|
+ container.metrics.releaseContainer(container.resource);
|
|
|
+ container.sendFinishedEvents();
|
|
|
//if the current state is NEW it means the CONTAINER_INIT was never
|
|
|
// sent for the event, thus no need to send the CONTAINER_STOP
|
|
|
if (container.getCurrentState()
|
|
@@ -1016,6 +979,105 @@ public class ContainerImpl implements Container {
|
|
|
container.exitCode = killEvent.getContainerExitStatus();
|
|
|
container.addDiagnostics(killEvent.getDiagnostic(), "\n");
|
|
|
container.addDiagnostics("Container is killed before being launched.\n");
|
|
|
+ container.metrics.killedContainer();
|
|
|
+ NMAuditLogger.logSuccess(container.user,
|
|
|
+ AuditConstants.FINISH_KILLED_CONTAINER, "ContainerImpl",
|
|
|
+ container.containerId.getApplicationAttemptId().getApplicationId(),
|
|
|
+ container.containerId);
|
|
|
+ super.transition(container, event);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Handle the following transition:
|
|
|
+ * - LOCALIZATION_FAILED -> DONE upon CONTAINER_RESOURCES_CLEANEDUP
|
|
|
+ */
|
|
|
+ static class LocalizationFailedToDoneTransition extends
|
|
|
+ ContainerDoneTransition {
|
|
|
+ @Override
|
|
|
+ public void transition(ContainerImpl container, ContainerEvent event) {
|
|
|
+ container.metrics.failedContainer();
|
|
|
+ NMAuditLogger.logFailure(container.user,
|
|
|
+ AuditConstants.FINISH_FAILED_CONTAINER, "ContainerImpl",
|
|
|
+ "Container failed with state: " + container.getContainerState(),
|
|
|
+ container.containerId.getApplicationAttemptId().getApplicationId(),
|
|
|
+ container.containerId);
|
|
|
+ super.transition(container, event);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Handle the following transition:
|
|
|
+ * - EXITED_WITH_SUCCESS -> DONE upon CONTAINER_RESOURCES_CLEANEDUP
|
|
|
+ */
|
|
|
+ static class ExitedWithSuccessToDoneTransition extends
|
|
|
+ ContainerDoneTransition {
|
|
|
+ @Override
|
|
|
+ public void transition(ContainerImpl container, ContainerEvent event) {
|
|
|
+ container.metrics.endRunningContainer();
|
|
|
+ container.metrics.completedContainer();
|
|
|
+ NMAuditLogger.logSuccess(container.user,
|
|
|
+ AuditConstants.FINISH_SUCCESS_CONTAINER, "ContainerImpl",
|
|
|
+ container.containerId.getApplicationAttemptId().getApplicationId(),
|
|
|
+ container.containerId);
|
|
|
+ super.transition(container, event);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Handle the following transition:
|
|
|
+ * - EXITED_WITH_FAILURE -> DONE upon CONTAINER_RESOURCES_CLEANEDUP
|
|
|
+ */
|
|
|
+ static class ExitedWithFailureToDoneTransition extends
|
|
|
+ ContainerDoneTransition {
|
|
|
+ @Override
|
|
|
+ public void transition(ContainerImpl container, ContainerEvent event) {
|
|
|
+ if (container.wasLaunched) {
|
|
|
+ container.metrics.endRunningContainer();
|
|
|
+ }
|
|
|
+ container.metrics.failedContainer();
|
|
|
+ NMAuditLogger.logFailure(container.user,
|
|
|
+ AuditConstants.FINISH_FAILED_CONTAINER, "ContainerImpl",
|
|
|
+ "Container failed with state: " + container.getContainerState(),
|
|
|
+ container.containerId.getApplicationAttemptId().getApplicationId(),
|
|
|
+ container.containerId);
|
|
|
+ super.transition(container, event);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Handle the following transition:
|
|
|
+ * - KILLING -> DONE upon CONTAINER_RESOURCES_CLEANEDUP
|
|
|
+ */
|
|
|
+ static class KillingToDoneTransition extends
|
|
|
+ ContainerDoneTransition {
|
|
|
+ @Override
|
|
|
+ public void transition(ContainerImpl container, ContainerEvent event) {
|
|
|
+ container.metrics.killedContainer();
|
|
|
+ NMAuditLogger.logSuccess(container.user,
|
|
|
+ AuditConstants.FINISH_KILLED_CONTAINER, "ContainerImpl",
|
|
|
+ container.containerId.getApplicationAttemptId().getApplicationId(),
|
|
|
+ container.containerId);
|
|
|
+ super.transition(container, event);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Handle the following transition:
|
|
|
+ * CONTAINER_CLEANEDUP_AFTER_KILL -> DONE upon CONTAINER_RESOURCES_CLEANEDUP
|
|
|
+ */
|
|
|
+ static class ContainerCleanedupAfterKillToDoneTransition extends
|
|
|
+ ContainerDoneTransition {
|
|
|
+ @Override
|
|
|
+ public void transition(ContainerImpl container, ContainerEvent event) {
|
|
|
+ if (container.wasLaunched) {
|
|
|
+ container.metrics.endRunningContainer();
|
|
|
+ }
|
|
|
+ container.metrics.killedContainer();
|
|
|
+ NMAuditLogger.logSuccess(container.user,
|
|
|
+ AuditConstants.FINISH_KILLED_CONTAINER, "ContainerImpl",
|
|
|
+ container.containerId.getApplicationAttemptId().getApplicationId(),
|
|
|
+ container.containerId);
|
|
|
super.transition(container, event);
|
|
|
}
|
|
|
}
|