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 boolean isContainerProcessAlive(String user, String pid)
|
||||
* @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,13 +176,8 @@ public int reacquireContainer(String user, ContainerId containerId)
|
||||
}
|
||||
|
||||
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);
|
||||
while(isContainerProcessAlive(user, pid)) {
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
|
||||
// wait for exit code file to appear
|
||||
@ -194,12 +190,9 @@ public int reacquireContainer(String user, ContainerId containerId)
|
||||
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);
|
||||
}
|
||||
|
||||
Thread.sleep(sleepMsec);
|
||||
|
||||
msecLeft -= sleepMsec;
|
||||
}
|
||||
if (msecLeft < 0) {
|
||||
|
@ -347,7 +347,7 @@ public int launchContainer(Container container,
|
||||
|
||||
@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 Integer call() {
|
||||
dispatcher.getEventHandler().handle(new ContainerEvent(containerId,
|
||||
ContainerEventType.CONTAINER_LAUNCHED));
|
||||
|
||||
boolean notInterrupted = true;
|
||||
try {
|
||||
File pidFile = locatePidFile(appIdStr, containerIdStr);
|
||||
if (pidFile != null) {
|
||||
@ -85,14 +86,19 @@ public Integer call() {
|
||||
}
|
||||
} 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 {
|
||||
this.completed.set(true);
|
||||
exec.deactivateContainer(containerId);
|
||||
try {
|
||||
getContext().getNMStateStore().storeContainerCompleted(containerId,
|
||||
retCode);
|
||||
} catch (IOException e) {
|
||||
LOG.error("Unable to set exit code for container " + containerId);
|
||||
if (notInterrupted) {
|
||||
this.completed.set(true);
|
||||
exec.deactivateContainer(containerId);
|
||||
try {
|
||||
getContext().getNMStateStore().storeContainerCompleted(containerId,
|
||||
retCode);
|
||||
} catch (IOException e) {
|
||||
LOG.error("Unable to set exit code for container " + containerId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user