Merge 1601762 from trunk to branch-2 for YARN-2091. Add more values to ContainerExitStatus and pass it from NM to RM and then to app masters (Tsuyoshi OZAWA via bikas)

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1601763 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Bikas Saha 2014-06-10 20:13:23 +00:00
parent d4d1ccc992
commit dc5ee5ff7c
11 changed files with 76 additions and 20 deletions

View File

@ -140,6 +140,9 @@ Release 2.5.0 - UNRELEASED
DummyApplicationResourceUsageReport for all invalid accesses. DummyApplicationResourceUsageReport for all invalid accesses.
(Ray Chiang via kasha) (Ray Chiang via kasha)
YARN-2091. Add more values to ContainerExitStatus and pass it from NM to
RM and then to app masters (Tsuyoshi OZAWA via bikas)
OPTIMIZATIONS OPTIMIZATIONS
BUG FIXES BUG FIXES

View File

@ -46,4 +46,30 @@ public class ContainerExitStatus {
* Containers preempted by the framework. * Containers preempted by the framework.
*/ */
public static final int PREEMPTED = -102; public static final int PREEMPTED = -102;
/**
* Container terminated because of exceeding allocated virtual memory.
*/
public static final int KILLED_EXCEEDED_VMEM = -103;
/**
* Container terminated because of exceeding allocated physical memory.
*/
public static final int KILLED_EXCEEDED_PMEM = -104;
/**
* Container was terminated by stop request by the app master.
*/
public static final int KILLED_BY_APPMASTER = -105;
/**
* Container was terminated by the resource manager.
*/
public static final int KILLED_BY_RESOURCEMANAGER = -106;
/**
* Container was terminated after the application finished.
*/
public static final int KILLED_AFTER_APP_COMPLETION = -107;
} }

View File

@ -64,6 +64,7 @@ import org.apache.hadoop.yarn.api.protocolrecords.StartContainersResponse;
import org.apache.hadoop.yarn.api.protocolrecords.StopContainersRequest; import org.apache.hadoop.yarn.api.protocolrecords.StopContainersRequest;
import org.apache.hadoop.yarn.api.protocolrecords.StopContainersResponse; import org.apache.hadoop.yarn.api.protocolrecords.StopContainersResponse;
import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.ApplicationId;
import org.apache.hadoop.yarn.api.records.ContainerExitStatus;
import org.apache.hadoop.yarn.api.records.ContainerId; import org.apache.hadoop.yarn.api.records.ContainerId;
import org.apache.hadoop.yarn.api.records.ContainerLaunchContext; import org.apache.hadoop.yarn.api.records.ContainerLaunchContext;
import org.apache.hadoop.yarn.api.records.ContainerState; import org.apache.hadoop.yarn.api.records.ContainerState;
@ -738,6 +739,7 @@ public class ContainerManagerImpl extends CompositeService implements
} else { } else {
dispatcher.getEventHandler().handle( dispatcher.getEventHandler().handle(
new ContainerKillEvent(containerID, new ContainerKillEvent(containerID,
ContainerExitStatus.KILLED_BY_APPMASTER,
"Container killed by the ApplicationMaster.")); "Container killed by the ApplicationMaster."));
NMAuditLogger.logSuccess(container.getUser(), NMAuditLogger.logSuccess(container.getUser(),
@ -887,6 +889,7 @@ public class ContainerManagerImpl extends CompositeService implements
.getContainersToCleanup()) { .getContainersToCleanup()) {
this.dispatcher.getEventHandler().handle( this.dispatcher.getEventHandler().handle(
new ContainerKillEvent(container, new ContainerKillEvent(container,
ContainerExitStatus.KILLED_BY_RESOURCEMANAGER,
"Container Killed by ResourceManager")); "Container Killed by ResourceManager"));
} }
break; break;

View File

@ -30,6 +30,7 @@ import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.security.Credentials; import org.apache.hadoop.security.Credentials;
import org.apache.hadoop.yarn.api.records.ApplicationAccessType; import org.apache.hadoop.yarn.api.records.ApplicationAccessType;
import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.ApplicationId;
import org.apache.hadoop.yarn.api.records.ContainerExitStatus;
import org.apache.hadoop.yarn.api.records.ContainerId; import org.apache.hadoop.yarn.api.records.ContainerId;
import org.apache.hadoop.yarn.event.Dispatcher; import org.apache.hadoop.yarn.event.Dispatcher;
import org.apache.hadoop.yarn.logaggregation.ContainerLogsRetentionPolicy; import org.apache.hadoop.yarn.logaggregation.ContainerLogsRetentionPolicy;
@ -375,6 +376,7 @@ public class ApplicationImpl implements Application {
for (ContainerId containerID : app.containers.keySet()) { for (ContainerId containerID : app.containers.keySet()) {
app.dispatcher.getEventHandler().handle( app.dispatcher.getEventHandler().handle(
new ContainerKillEvent(containerID, new ContainerKillEvent(containerID,
ContainerExitStatus.KILLED_AFTER_APP_COMPLETION,
"Container killed on application-finish event: " + appEvent.getDiagnostic())); "Container killed on application-finish event: " + appEvent.getDiagnostic()));
} }
return ApplicationState.FINISHING_CONTAINERS_WAIT; return ApplicationState.FINISHING_CONTAINERS_WAIT;

View File

@ -48,7 +48,6 @@ import org.apache.hadoop.yarn.event.Dispatcher;
import org.apache.hadoop.yarn.event.EventHandler; import org.apache.hadoop.yarn.event.EventHandler;
import org.apache.hadoop.yarn.security.ContainerTokenIdentifier; import org.apache.hadoop.yarn.security.ContainerTokenIdentifier;
import org.apache.hadoop.yarn.server.api.protocolrecords.NMContainerStatus; import org.apache.hadoop.yarn.server.api.protocolrecords.NMContainerStatus;
import org.apache.hadoop.yarn.server.nodemanager.ContainerExecutor.ExitCode;
import org.apache.hadoop.yarn.server.nodemanager.NMAuditLogger; import org.apache.hadoop.yarn.server.nodemanager.NMAuditLogger;
import org.apache.hadoop.yarn.server.nodemanager.NMAuditLogger.AuditConstants; import org.apache.hadoop.yarn.server.nodemanager.NMAuditLogger.AuditConstants;
import org.apache.hadoop.yarn.server.nodemanager.containermanager.AuxServicesEvent; import org.apache.hadoop.yarn.server.nodemanager.containermanager.AuxServicesEvent;
@ -773,7 +772,7 @@ public class ContainerImpl implements Container {
container.cleanup(); container.cleanup();
container.metrics.endInitingContainer(); container.metrics.endInitingContainer();
ContainerKillEvent killEvent = (ContainerKillEvent) event; ContainerKillEvent killEvent = (ContainerKillEvent) event;
container.exitCode = ExitCode.TERMINATED.getExitCode(); container.exitCode = killEvent.getContainerExitStatus();
container.diagnostics.append(killEvent.getDiagnostic()).append("\n"); container.diagnostics.append(killEvent.getDiagnostic()).append("\n");
container.diagnostics.append("Container is killed before being launched.\n"); container.diagnostics.append("Container is killed before being launched.\n");
} }
@ -817,6 +816,7 @@ public class ContainerImpl implements Container {
ContainersLauncherEventType.CLEANUP_CONTAINER)); ContainersLauncherEventType.CLEANUP_CONTAINER));
ContainerKillEvent killEvent = (ContainerKillEvent) event; ContainerKillEvent killEvent = (ContainerKillEvent) event;
container.diagnostics.append(killEvent.getDiagnostic()).append("\n"); container.diagnostics.append(killEvent.getDiagnostic()).append("\n");
container.exitCode = killEvent.getContainerExitStatus();
} }
} }
@ -829,7 +829,10 @@ public class ContainerImpl implements Container {
@Override @Override
public void transition(ContainerImpl container, ContainerEvent event) { public void transition(ContainerImpl container, ContainerEvent event) {
ContainerExitEvent exitEvent = (ContainerExitEvent) event; ContainerExitEvent exitEvent = (ContainerExitEvent) event;
if (container.hasDefaultExitCode()) {
container.exitCode = exitEvent.getExitCode(); container.exitCode = exitEvent.getExitCode();
}
if (exitEvent.getDiagnosticInfo() != null) { if (exitEvent.getDiagnosticInfo() != null) {
container.diagnostics.append(exitEvent.getDiagnosticInfo()) container.diagnostics.append(exitEvent.getDiagnosticInfo())
.append('\n'); .append('\n');
@ -871,7 +874,7 @@ public class ContainerImpl implements Container {
@Override @Override
public void transition(ContainerImpl container, ContainerEvent event) { public void transition(ContainerImpl container, ContainerEvent event) {
ContainerKillEvent killEvent = (ContainerKillEvent) event; ContainerKillEvent killEvent = (ContainerKillEvent) event;
container.exitCode = ExitCode.TERMINATED.getExitCode(); container.exitCode = killEvent.getContainerExitStatus();
container.diagnostics.append(killEvent.getDiagnostic()).append("\n"); container.diagnostics.append(killEvent.getDiagnostic()).append("\n");
container.diagnostics.append("Container is killed before being launched.\n"); container.diagnostics.append("Container is killed before being launched.\n");
super.transition(container, event); super.transition(container, event);
@ -928,4 +931,9 @@ public class ContainerImpl implements Container {
this.readLock.unlock(); this.readLock.unlock();
} }
} }
private boolean hasDefaultExitCode() {
return (this.exitCode == ContainerExitStatus.INVALID);
}
} }

View File

@ -23,13 +23,21 @@ import org.apache.hadoop.yarn.api.records.ContainerId;
public class ContainerKillEvent extends ContainerEvent { public class ContainerKillEvent extends ContainerEvent {
private final String diagnostic; private final String diagnostic;
private final int exitStatus;
public ContainerKillEvent(ContainerId cID, String diagnostic) { public ContainerKillEvent(ContainerId cID,
int exitStatus, String diagnostic) {
super(cID, ContainerEventType.KILL_CONTAINER); super(cID, ContainerEventType.KILL_CONTAINER);
this.exitStatus = exitStatus;
this.diagnostic = diagnostic; this.diagnostic = diagnostic;
} }
public String getDiagnostic() { public String getDiagnostic() {
return this.diagnostic; return this.diagnostic;
} }
public int getContainerExitStatus() {
return this.exitStatus;
}
} }

View File

@ -30,6 +30,7 @@ import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.service.AbstractService; import org.apache.hadoop.service.AbstractService;
import org.apache.hadoop.util.StringUtils.TraditionalBinaryPrefix; import org.apache.hadoop.util.StringUtils.TraditionalBinaryPrefix;
import org.apache.hadoop.yarn.api.records.ContainerExitStatus;
import org.apache.hadoop.yarn.api.records.ContainerId; import org.apache.hadoop.yarn.api.records.ContainerId;
import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.apache.hadoop.yarn.event.AsyncDispatcher; import org.apache.hadoop.yarn.event.AsyncDispatcher;
@ -403,6 +404,7 @@ public class ContainersMonitorImpl extends AbstractService implements
boolean isMemoryOverLimit = false; boolean isMemoryOverLimit = false;
String msg = ""; String msg = "";
int containerExitStatus = ContainerExitStatus.INVALID;
if (isVmemCheckEnabled() if (isVmemCheckEnabled()
&& isProcessTreeOverLimit(containerId.toString(), && isProcessTreeOverLimit(containerId.toString(),
currentVmemUsage, curMemUsageOfAgedProcesses, vmemLimit)) { currentVmemUsage, curMemUsageOfAgedProcesses, vmemLimit)) {
@ -414,6 +416,7 @@ public class ContainersMonitorImpl extends AbstractService implements
currentPmemUsage, pmemLimit, currentPmemUsage, pmemLimit,
pId, containerId, pTree); pId, containerId, pTree);
isMemoryOverLimit = true; isMemoryOverLimit = true;
containerExitStatus = ContainerExitStatus.KILLED_EXCEEDED_VMEM;
} else if (isPmemCheckEnabled() } else if (isPmemCheckEnabled()
&& isProcessTreeOverLimit(containerId.toString(), && isProcessTreeOverLimit(containerId.toString(),
currentPmemUsage, curRssMemUsageOfAgedProcesses, currentPmemUsage, curRssMemUsageOfAgedProcesses,
@ -426,6 +429,7 @@ public class ContainersMonitorImpl extends AbstractService implements
currentPmemUsage, pmemLimit, currentPmemUsage, pmemLimit,
pId, containerId, pTree); pId, containerId, pTree);
isMemoryOverLimit = true; isMemoryOverLimit = true;
containerExitStatus = ContainerExitStatus.KILLED_EXCEEDED_PMEM;
} }
if (isMemoryOverLimit) { if (isMemoryOverLimit) {
@ -440,7 +444,8 @@ public class ContainersMonitorImpl extends AbstractService implements
} }
// kill the container // kill the container
eventDispatcher.getEventHandler().handle( eventDispatcher.getEventHandler().handle(
new ContainerKillEvent(containerId, msg)); new ContainerKillEvent(containerId,
containerExitStatus, msg));
it.remove(); it.remove();
LOG.info("Removed ProcessTree with root " + pId); LOG.info("Removed ProcessTree with root " + pId);
} else { } else {

View File

@ -31,6 +31,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.hadoop.yarn.api.records.ContainerExitStatus;
import org.junit.Assert; import org.junit.Assert;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
@ -68,7 +69,6 @@ import org.apache.hadoop.yarn.security.ContainerTokenIdentifier;
import org.apache.hadoop.yarn.security.NMTokenIdentifier; import org.apache.hadoop.yarn.security.NMTokenIdentifier;
import org.apache.hadoop.yarn.server.api.ResourceManagerConstants; import org.apache.hadoop.yarn.server.api.ResourceManagerConstants;
import org.apache.hadoop.yarn.server.nodemanager.CMgrCompletedAppsEvent; import org.apache.hadoop.yarn.server.nodemanager.CMgrCompletedAppsEvent;
import org.apache.hadoop.yarn.server.nodemanager.ContainerExecutor.ExitCode;
import org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor; import org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor;
import org.apache.hadoop.yarn.server.nodemanager.DeletionService; import org.apache.hadoop.yarn.server.nodemanager.DeletionService;
import org.apache.hadoop.yarn.server.nodemanager.containermanager.TestAuxServices.ServiceA; import org.apache.hadoop.yarn.server.nodemanager.containermanager.TestAuxServices.ServiceA;
@ -348,8 +348,7 @@ public class TestContainerManager extends BaseContainerManagerTest {
GetContainerStatusesRequest.newInstance(containerIds); GetContainerStatusesRequest.newInstance(containerIds);
ContainerStatus containerStatus = ContainerStatus containerStatus =
containerManager.getContainerStatuses(gcsRequest).getContainerStatuses().get(0); containerManager.getContainerStatuses(gcsRequest).getContainerStatuses().get(0);
int expectedExitCode = Shell.WINDOWS ? ExitCode.FORCE_KILLED.getExitCode() : int expectedExitCode = ContainerExitStatus.KILLED_BY_APPMASTER;
ExitCode.TERMINATED.getExitCode();
Assert.assertEquals(expectedExitCode, containerStatus.getExitStatus()); Assert.assertEquals(expectedExitCode, containerStatus.getExitStatus());
// Assert that the process is not alive anymore // Assert that the process is not alive anymore

View File

@ -17,6 +17,7 @@
*/ */
package org.apache.hadoop.yarn.server.nodemanager.containermanager.container; package org.apache.hadoop.yarn.server.nodemanager.containermanager.container;
import org.apache.hadoop.yarn.api.records.ContainerExitStatus;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
@ -319,7 +320,7 @@ public class TestContainer {
assertEquals(ContainerState.NEW, wc.c.getContainerState()); assertEquals(ContainerState.NEW, wc.c.getContainerState());
wc.killContainer(); wc.killContainer();
assertEquals(ContainerState.DONE, wc.c.getContainerState()); assertEquals(ContainerState.DONE, wc.c.getContainerState());
assertEquals(ExitCode.TERMINATED.getExitCode(), assertEquals(ContainerExitStatus.KILLED_BY_RESOURCEMANAGER,
wc.c.cloneAndGetContainerStatus().getExitStatus()); wc.c.cloneAndGetContainerStatus().getExitStatus());
assertTrue(wc.c.cloneAndGetContainerStatus().getDiagnostics() assertTrue(wc.c.cloneAndGetContainerStatus().getDiagnostics()
.contains("KillRequest")); .contains("KillRequest"));
@ -339,7 +340,7 @@ public class TestContainer {
assertEquals(ContainerState.LOCALIZING, wc.c.getContainerState()); assertEquals(ContainerState.LOCALIZING, wc.c.getContainerState());
wc.killContainer(); wc.killContainer();
assertEquals(ContainerState.KILLING, wc.c.getContainerState()); assertEquals(ContainerState.KILLING, wc.c.getContainerState());
assertEquals(ExitCode.TERMINATED.getExitCode(), assertEquals(ContainerExitStatus.KILLED_BY_RESOURCEMANAGER,
wc.c.cloneAndGetContainerStatus().getExitStatus()); wc.c.cloneAndGetContainerStatus().getExitStatus());
assertTrue(wc.c.cloneAndGetContainerStatus().getDiagnostics() assertTrue(wc.c.cloneAndGetContainerStatus().getDiagnostics()
.contains("KillRequest")); .contains("KillRequest"));
@ -898,12 +899,14 @@ public class TestContainer {
} }
public void killContainer() { public void killContainer() {
c.handle(new ContainerKillEvent(cId, "KillRequest")); c.handle(new ContainerKillEvent(cId,
ContainerExitStatus.KILLED_BY_RESOURCEMANAGER,
"KillRequest"));
drainDispatcherEvents(); drainDispatcherEvents();
} }
public void containerKilledOnRequest() { public void containerKilledOnRequest() {
int exitCode = ExitCode.FORCE_KILLED.getExitCode(); int exitCode = ContainerExitStatus.KILLED_BY_RESOURCEMANAGER;
String diagnosticMsg = "Container completed with exit code " + exitCode; String diagnosticMsg = "Container completed with exit code " + exitCode;
c.handle(new ContainerExitEvent(cId, c.handle(new ContainerExitEvent(cId,
ContainerEventType.CONTAINER_KILLED_ON_REQUEST, exitCode, ContainerEventType.CONTAINER_KILLED_ON_REQUEST, exitCode,

View File

@ -18,6 +18,7 @@
package org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher; package org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher;
import org.apache.hadoop.yarn.api.records.ContainerExitStatus;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
@ -73,7 +74,6 @@ import org.apache.hadoop.yarn.event.Dispatcher;
import org.apache.hadoop.yarn.event.Event; import org.apache.hadoop.yarn.event.Event;
import org.apache.hadoop.yarn.event.EventHandler; import org.apache.hadoop.yarn.event.EventHandler;
import org.apache.hadoop.yarn.security.ContainerTokenIdentifier; import org.apache.hadoop.yarn.security.ContainerTokenIdentifier;
import org.apache.hadoop.yarn.server.nodemanager.ContainerExecutor.ExitCode;
import org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor; import org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor;
import org.apache.hadoop.yarn.server.nodemanager.containermanager.BaseContainerManagerTest; import org.apache.hadoop.yarn.server.nodemanager.containermanager.BaseContainerManagerTest;
import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.Container; import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.Container;
@ -604,8 +604,7 @@ public class TestContainerLaunch extends BaseContainerManagerTest {
GetContainerStatusesRequest.newInstance(containerIds); GetContainerStatusesRequest.newInstance(containerIds);
ContainerStatus containerStatus = ContainerStatus containerStatus =
containerManager.getContainerStatuses(gcsRequest).getContainerStatuses().get(0); containerManager.getContainerStatuses(gcsRequest).getContainerStatuses().get(0);
int expectedExitCode = Shell.WINDOWS ? ExitCode.FORCE_KILLED.getExitCode() : int expectedExitCode = ContainerExitStatus.KILLED_BY_APPMASTER;
ExitCode.TERMINATED.getExitCode();
Assert.assertEquals(expectedExitCode, containerStatus.getExitStatus()); Assert.assertEquals(expectedExitCode, containerStatus.getExitStatus());
// Assert that the process is not alive anymore // Assert that the process is not alive anymore
@ -717,7 +716,7 @@ public class TestContainerLaunch extends BaseContainerManagerTest {
ContainerStatus containerStatus = ContainerStatus containerStatus =
containerManager.getContainerStatuses(gcsRequest) containerManager.getContainerStatuses(gcsRequest)
.getContainerStatuses().get(0); .getContainerStatuses().get(0);
Assert.assertEquals(ExitCode.FORCE_KILLED.getExitCode(), Assert.assertEquals(ContainerExitStatus.KILLED_BY_APPMASTER,
containerStatus.getExitStatus()); containerStatus.getExitStatus());
// Now verify the contents of the file. Script generates a message when it // Now verify the contents of the file. Script generates a message when it

View File

@ -18,6 +18,7 @@
package org.apache.hadoop.yarn.server.nodemanager.containermanager.monitor; package org.apache.hadoop.yarn.server.nodemanager.containermanager.monitor;
import org.apache.hadoop.yarn.api.records.ContainerExitStatus;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
@ -60,7 +61,6 @@ import org.apache.hadoop.yarn.event.AsyncDispatcher;
import org.apache.hadoop.yarn.exceptions.YarnException; import org.apache.hadoop.yarn.exceptions.YarnException;
import org.apache.hadoop.yarn.security.ContainerTokenIdentifier; import org.apache.hadoop.yarn.security.ContainerTokenIdentifier;
import org.apache.hadoop.yarn.server.nodemanager.ContainerExecutor; import org.apache.hadoop.yarn.server.nodemanager.ContainerExecutor;
import org.apache.hadoop.yarn.server.nodemanager.ContainerExecutor.ExitCode;
import org.apache.hadoop.yarn.server.nodemanager.ContainerExecutor.Signal; import org.apache.hadoop.yarn.server.nodemanager.ContainerExecutor.Signal;
import org.apache.hadoop.yarn.server.nodemanager.Context; import org.apache.hadoop.yarn.server.nodemanager.Context;
import org.apache.hadoop.yarn.server.nodemanager.containermanager.BaseContainerManagerTest; import org.apache.hadoop.yarn.server.nodemanager.containermanager.BaseContainerManagerTest;
@ -270,7 +270,7 @@ public class TestContainersMonitor extends BaseContainerManagerTest {
GetContainerStatusesRequest.newInstance(containerIds); GetContainerStatusesRequest.newInstance(containerIds);
ContainerStatus containerStatus = ContainerStatus containerStatus =
containerManager.getContainerStatuses(gcsRequest).getContainerStatuses().get(0); containerManager.getContainerStatuses(gcsRequest).getContainerStatuses().get(0);
Assert.assertEquals(ExitCode.TERMINATED.getExitCode(), Assert.assertEquals(ContainerExitStatus.KILLED_EXCEEDED_VMEM,
containerStatus.getExitStatus()); containerStatus.getExitStatus());
String expectedMsgPattern = String expectedMsgPattern =
"Container \\[pid=" + pid + ",containerID=" + cId "Container \\[pid=" + pid + ",containerID=" + cId