YARN-2846. Incorrect persist exit code for running containers in reacquireContainer() that interrupted by NodeManager restart. Contributed by Junping Du
This commit is contained in:
parent
177e8090f5
commit
33ea5ae92b
|
@ -955,6 +955,10 @@ Release 2.6.0 - 2014-11-15
|
|||
YARN-2794. Fixed log messages about distributing system-credentials. (Jian He via
|
||||
zjshen)
|
||||
|
||||
YARN-2846. Incorrect persist exit code for running containers in
|
||||
reacquireContainer() that interrupted by NodeManager restart. (Junping Du
|
||||
via jlowe)
|
||||
|
||||
Release 2.5.2 - 2014-11-10
|
||||
|
||||
INCOMPATIBLE CHANGES
|
||||
|
|
|
@ -159,9 +159,10 @@ public abstract class ContainerExecutor implements Configurable {
|
|||
* @param containerId The ID of the container to reacquire
|
||||
* @return The exit code of the pre-existing container
|
||||
* @throws IOException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public int reacquireContainer(String user, ContainerId containerId)
|
||||
throws IOException {
|
||||
throws IOException, InterruptedException {
|
||||
Path pidPath = getPidFilePath(containerId);
|
||||
if (pidPath == null) {
|
||||
LOG.warn(containerId + " is not active, returning terminated error");
|
||||
|
@ -175,14 +176,9 @@ public abstract class ContainerExecutor implements Configurable {
|
|||
}
|
||||
|
||||
LOG.info("Reacquiring " + containerId + " with pid " + pid);
|
||||
try {
|
||||
while(isContainerProcessAlive(user, pid)) {
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
throw new IOException("Interrupted while waiting for process " + pid
|
||||
+ " to exit", e);
|
||||
}
|
||||
|
||||
// wait for exit code file to appear
|
||||
String exitCodeFile = ContainerLaunch.getExitCodeFile(pidPath.toString());
|
||||
|
@ -194,12 +190,9 @@ public abstract class ContainerExecutor implements Configurable {
|
|||
LOG.info(containerId + " was deactivated");
|
||||
return ExitCode.TERMINATED.getExitCode();
|
||||
}
|
||||
try {
|
||||
|
||||
Thread.sleep(sleepMsec);
|
||||
} catch (InterruptedException e) {
|
||||
throw new IOException(
|
||||
"Interrupted while waiting for exit code from " + containerId, e);
|
||||
}
|
||||
|
||||
msecLeft -= sleepMsec;
|
||||
}
|
||||
if (msecLeft < 0) {
|
||||
|
|
|
@ -347,7 +347,7 @@ public class LinuxContainerExecutor extends ContainerExecutor {
|
|||
|
||||
@Override
|
||||
public int reacquireContainer(String user, ContainerId containerId)
|
||||
throws IOException {
|
||||
throws IOException, InterruptedException {
|
||||
try {
|
||||
return super.reacquireContainer(user, containerId);
|
||||
} finally {
|
||||
|
|
|
@ -73,6 +73,7 @@ public class RecoveredContainerLaunch extends ContainerLaunch {
|
|||
dispatcher.getEventHandler().handle(new ContainerEvent(containerId,
|
||||
ContainerEventType.CONTAINER_LAUNCHED));
|
||||
|
||||
boolean notInterrupted = true;
|
||||
try {
|
||||
File pidFile = locatePidFile(appIdStr, containerIdStr);
|
||||
if (pidFile != null) {
|
||||
|
@ -85,7 +86,11 @@ public class RecoveredContainerLaunch extends ContainerLaunch {
|
|||
}
|
||||
} catch (IOException e) {
|
||||
LOG.error("Unable to recover container " + containerIdStr, e);
|
||||
} catch (InterruptedException e) {
|
||||
LOG.warn("Interrupted while waiting for exit code from " + containerId);
|
||||
notInterrupted = false;
|
||||
} finally {
|
||||
if (notInterrupted) {
|
||||
this.completed.set(true);
|
||||
exec.deactivateContainer(containerId);
|
||||
try {
|
||||
|
@ -95,6 +100,7 @@ public class RecoveredContainerLaunch extends ContainerLaunch {
|
|||
LOG.error("Unable to set exit code for container " + containerId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (retCode != 0) {
|
||||
LOG.warn("Recovered container exited with a non-zero exit code "
|
||||
|
|
Loading…
Reference in New Issue