diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index 52b3cabc25..054b3947f1 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -418,6 +418,9 @@ Release 2.7.0 - UNRELEASED YARN-3088. LinuxContainerExecutor.deleteAsUser can throw NPE if native executor returns an error (Eric Payne via jlowe) + YARN-3011. Possible IllegalArgumentException in ResourceLocalizationService + might lead NM to crash. (Varun Saxena via jianhe) + Release 2.6.0 - 2014-11-18 INCOMPATIBLE CHANGES 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 2f4fa5e39a..8c84132ab0 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 @@ -794,6 +794,13 @@ public void addResource(LocalizerResourceRequestEvent request) { .getResource().getRequest(), e.getMessage())); LOG.error("Local path for public localization is not found. " + " May be disks failed.", e); + } catch (IllegalArgumentException ie) { + rsrc.unlock(); + publicRsrc.handle(new ResourceFailedLocalizationEvent(request + .getResource().getRequest(), ie.getMessage())); + LOG.error("Local path for public localization is not found. " + + " Incorrect path. " + request.getResource().getRequest() + .getPath(), ie); } catch (RejectedExecutionException re) { rsrc.unlock(); publicRsrc.handle(new ResourceFailedLocalizationEvent(request @@ -1015,6 +1022,9 @@ LocalizerHeartbeatResponse update( } catch (IOException e) { LOG.error("local path for PRIVATE localization could not be " + "found. Disks might have failed.", e); + } catch (IllegalArgumentException e) { + LOG.error("Inorrect path for PRIVATE localization." + + next.getResource().getFile(), e); } catch (URISyntaxException e) { //TODO fail? Already translated several times... } 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 9ed18dd49f..30af5a4359 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 @@ -1253,14 +1253,33 @@ public void testPublicResourceAddResourceExceptions() throws Exception { user, appId); Assert.assertNull(tracker.getLocalizedResource(pubReq)); - // test RejectedExecutionException + // test IllegalArgumentException + String name = Long.toHexString(r.nextLong()); + URL url = getPath("/local/PRIVATE/" + name + "/"); + final LocalResource rsrc = + BuilderUtils.newLocalResource(url, LocalResourceType.FILE, + LocalResourceVisibility.PUBLIC, r.nextInt(1024) + 1024L, + r.nextInt(1024) + 2048L, false); + final LocalResourceRequest pubReq1 = new LocalResourceRequest(rsrc); + Map> req1 = + new HashMap>(); + req1.put(LocalResourceVisibility.PUBLIC, + Collections.singletonList(pubReq1)); Mockito .doCallRealMethod() .when(dirsHandlerSpy) .getLocalPathForWrite(isA(String.class), Mockito.anyLong(), Mockito.anyBoolean()); + // send request + spyService.handle(new ContainerLocalizationRequestEvent(c, req1)); + dispatcher.await(); + tracker = + spyService.getLocalResourcesTracker(LocalResourceVisibility.PUBLIC, + user, appId); + Assert.assertNull(tracker.getLocalizedResource(pubReq)); - // shutdown the thread pool + // test RejectedExecutionException by shutting down the thread pool PublicLocalizer publicLocalizer = spyService.getPublicLocalizer(); publicLocalizer.threadPool.shutdown();