diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/ResourceLocalizationService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/ResourceLocalizationService.java index 0e7861f6051..398b244c08d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/ResourceLocalizationService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/ResourceLocalizationService.java @@ -74,6 +74,7 @@ import org.apache.hadoop.util.DiskChecker; import org.apache.hadoop.util.DiskValidator; import org.apache.hadoop.util.DiskValidatorFactory; +import org.apache.hadoop.util.Shell; import org.apache.hadoop.util.StringUtils; import org.apache.hadoop.util.concurrent.HadoopExecutors; import org.apache.hadoop.util.concurrent.HadoopScheduledThreadPoolExecutor; @@ -808,6 +809,7 @@ public void cleanupPrivLocalizers(String locId) { return; // ignore; already gone } privLocalizers.remove(locId); + LOG.info("Interrupting localizer for " + locId); localizer.interrupt(); } } @@ -1189,6 +1191,22 @@ private Path getPathForLocalization(LocalResource rsrc, } @Override + public void interrupt() { + try { + for (Shell shell : Shell.getAllShells()) { + if (shell.getProcess() != null && + shell.getWaitingThread() != null && + shell.getWaitingThread().equals(this)) { + LOG.info("Destroying shell process for " + localizerId); + shell.getProcess().destroy(); + } + } + } finally { + super.interrupt(); + } + } + + @Override @SuppressWarnings("unchecked") // dispatcher not typed public void run() { Path nmPrivateCTokensPath = null;