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 71f48acb371..de8f56ff760 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 @@ -574,7 +574,7 @@ private void handleCleanupContainerResources( } } String locId = c.getContainerId().toString(); - localizerTracker.cleanupPrivLocalizers(locId); + localizerTracker.cleanupPrivLocalizers(locId, false); // Delete the container directories String userName = c.getUser(); @@ -791,7 +791,7 @@ public void handle(LocalizerEvent event) { // a new localizer thread. LOG.info("New " + event.getType() + " localize request for " + locId + ", remove old private localizer."); - cleanupPrivLocalizers(locId); + cleanupPrivLocalizers(locId, true); localizer = null; } if (null == localizer) { @@ -809,13 +809,14 @@ public void handle(LocalizerEvent event) { } } - public void cleanupPrivLocalizers(String locId) { + public void cleanupPrivLocalizers(String locId, boolean cancelPrev) { synchronized (privLocalizers) { LocalizerRunner localizer = privLocalizers.get(locId); if (null == localizer) { return; // ignore; already gone } privLocalizers.remove(locId); + localizer.cancelled = cancelPrev; localizer.interrupt(); } } @@ -1024,6 +1025,8 @@ public void run() { final List pending; private AtomicBoolean killContainerLocalizer = new AtomicBoolean(false); + private volatile boolean cancelled = false; + // TODO: threadsafe, use outer? private final RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory(getConfig()); @@ -1286,9 +1289,11 @@ public void run() { context.getUser(), null, paths); delService.delete(deletionTask); } - FileDeletionTask deletionTask = new FileDeletionTask(delService, null, - nmPrivateCTokensPath, null); - delService.delete(deletionTask); + if (!cancelled) { + FileDeletionTask deletionTask = new FileDeletionTask(delService, null, + nmPrivateCTokensPath, null); + delService.delete(deletionTask); + } } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/TestContainerManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/TestContainerManager.java index d179459b28d..f78bb6ec8cf 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/TestContainerManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/TestContainerManager.java @@ -1200,7 +1200,7 @@ public void testContainerLaunchAndExitFailure() throws IOException, // While the container is running, localize new resources. // Verify the symlink is created properly @Test - public void testLocalingResourceWhileContainerRunning() throws Exception { + public void testLocalizingResourceWhileContainerRunning() throws Exception { // Real del service delSrvc = new DeletionService(exec); delSrvc.init(conf); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/TestResourceLocalizationService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/TestResourceLocalizationService.java index 21896ca4c01..0aac0428aa1 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/TestResourceLocalizationService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/TestResourceLocalizationService.java @@ -470,7 +470,8 @@ public void testResourceRelease() throws Exception { //Send Cleanup Event spyService.handle(new ContainerLocalizationCleanupEvent(c, req)); verify(mockLocallilzerTracker) - .cleanupPrivLocalizers("container_314159265358979_0003_01_000042"); + .cleanupPrivLocalizers("container_314159265358979_0003_01_000042", + false); req2.remove(LocalResourceVisibility.PRIVATE); spyService.handle(new ContainerLocalizationCleanupEvent(c, req2)); dispatcher.await(); @@ -2886,7 +2887,7 @@ public void testFailedDirsResourceRelease() throws Exception { // Send Cleanup Event spyService.handle(new ContainerLocalizationCleanupEvent(c, req)); verify(mockLocallilzerTracker).cleanupPrivLocalizers( - "container_314159265358979_0003_01_000042"); + "container_314159265358979_0003_01_000042", false); // match cleanup events with the mocks we setup earlier for (int i = 0; i < containerLocalDirs.size(); ++i) {