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/LocalResourcesTrackerImpl.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/LocalResourcesTrackerImpl.java index dd31543..a5f2307 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/LocalResourcesTrackerImpl.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/LocalResourcesTrackerImpl.java @@ -500,6 +500,11 @@ public Path getPathForLocalization(LocalResourceRequest req, Path localPath = new Path(rPath, req.getPath().getName()); LocalizedResource rsrc = localrsrc.get(req); + if (rsrc == null) { + LOG.warn("NodeManager is shutting down and has cleaned" + + " the " + localPath); + return null; + } rsrc.setLocalPath(localPath); LocalResource lr = LocalResource.newInstance(req.getResource(), req.getType(), req.getVisibility(), req.getSize(), 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 3834ece..e57ca60 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 @@ -879,6 +879,11 @@ public void addResource(LocalizerResourceRequestEvent request) { Path publicDirDestPath = publicRsrc.getPathForLocalization(key, publicRootPath, delService); + if (publicDirDestPath == null) { + LOG.debug("Skip downloading resource: " + key + " since " + + "NM is shutting down"); + return; + } if (!publicDirDestPath.getParent().equals(publicRootPath)) { createParentDirs(publicDirDestPath, publicRootPath); if (diskValidator != null) { @@ -1169,10 +1174,11 @@ LocalizerHeartbeatResponse processHeartbeat( LocalResourcesTracker tracker = getLocalResourcesTracker( next.getVisibility(), user, applicationId); if (tracker != null) { - ResourceLocalizationSpec resource = - NodeManagerBuilderUtils.newResourceLocalizationSpec(next, - getPathForLocalization(next, tracker)); - rsrcs.add(resource); + Path localPath = getPathForLocalization(next, tracker); + if (localPath != null) { + rsrcs.add(NodeManagerBuilderUtils.newResourceLocalizationSpec( + next, localPath)); + } } } catch (IOException e) { LOG.error("local path for PRIVATE localization could not be " + 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 2b9148e..21896ca 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 @@ -1717,8 +1717,18 @@ public void testLocalizerHeartbeatWhenAppCleaningUp() throws Exception { assertEquals("NM should tell localizer to be LIVE in Heartbeat.", LocalizerAction.LIVE, response.getLocalizerAction()); - // Cleanup application. + // Cleanup container. spyService.handle(new ContainerLocalizationCleanupEvent(c, rsrcs)); + dispatcher.await(); + try { + /*Directly send heartbeat to introduce race as container + is being cleaned up.*/ + locRunnerForContainer.processHeartbeat( + Collections.singletonList(rsrcSuccess)); + } catch (Exception e) { + fail("Exception should not have been thrown on processing heartbeat"); + } + // Cleanup application. spyService.handle(new ApplicationLocalizationEvent( LocalizationEventType.DESTROY_APPLICATION_RESOURCES, app)); dispatcher.await();