diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/amlauncher/AMLauncher.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/amlauncher/AMLauncher.java index 5896808..0bedb52 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/amlauncher/AMLauncher.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/amlauncher/AMLauncher.java @@ -105,7 +105,7 @@ private void launch() throws IOException, YarnException { connect(); ContainerId masterContainerID = masterContainer.getId(); ApplicationSubmissionContext applicationContext = - application.getSubmissionContext(); + application.getSubmissionContext(); LOG.info("Setting up container " + masterContainer + " for AM " + application.getAppAttemptId()); ContainerLaunchContext launchContext = @@ -189,6 +189,10 @@ private ContainerLaunchContext createAMContainerLaunchContext( ContainerLaunchContext container = applicationMasterContext.getAMContainerSpec(); + if (container == null){ + throw new IOException(containerID + + " has been cleaned before launched"); + } // Finalize the container setupTokens(container, containerID); // set the flow context optionally for timeline service v.2 @@ -305,11 +309,7 @@ public void run() { handler.handle(new RMAppAttemptEvent(application.getAppAttemptId(), RMAppAttemptEventType.LAUNCHED, System.currentTimeMillis())); } catch(Exception ie) { - String message = "Error launching " + application.getAppAttemptId() - + ". Got exception: " + StringUtils.stringifyException(ie); - LOG.info(message); - handler.handle(new RMAppAttemptEvent(application - .getAppAttemptId(), RMAppAttemptEventType.LAUNCH_FAILED, message)); + onAMLaunchFailed(masterContainer.getId(), ie); } break; case CLEANUP: @@ -344,4 +344,13 @@ private void parseAndThrowException(Throwable t) throws YarnException, throw (IOException) t; } } + + @SuppressWarnings("unchecked") + protected void onAMLaunchFailed(ContainerId containerId, Exception ie) { + String message = "Error launching " + application.getAppAttemptId() + + ". Got exception: " + StringUtils.stringifyException(ie); + LOG.info(message); + handler.handle(new RMAppAttemptEvent(application + .getAppAttemptId(), RMAppAttemptEventType.LAUNCH_FAILED, message)); + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationMasterLauncher.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationMasterLauncher.java index 172993b..24eb813 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationMasterLauncher.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationMasterLauncher.java @@ -73,6 +73,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.amlauncher.AMLauncherEventType; import org.apache.hadoop.yarn.server.resourcemanager.amlauncher.ApplicationMasterLauncher; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp; +import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppState; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptState; import org.apache.hadoop.yarn.server.utils.AMRMClientUtils; @@ -233,7 +234,7 @@ public void testAMLaunchAndCleanup() throws Exception { .getMasterContainer().getId() .toString(), containerManager.containerIdAtContainerManager); Assert.assertEquals(nm1.getNodeId().toString(), - containerManager.nmHostAtContainerManager); + containerManager.nmHostAtContainerManager); Assert.assertEquals(YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS, containerManager.maxAppAttempts); @@ -258,6 +259,43 @@ public void testAMLaunchAndCleanup() throws Exception { } @Test + public void testAMCleanupBeforeLaunch() throws Exception { + MockRM rm = new MockRM(); + rm.start(); + MockNM nm1 = rm.registerNode("127.0.0.1:1234", 5120); + RMApp app = rm.submitApp(2000); + // kick the scheduling + nm1.nodeHeartbeat(true); + RMAppAttempt attempt = app.getCurrentAppAttempt(); + int waitCount = 0; + //wait allocate container for attempt + while (attempt.getMasterContainer() == null && waitCount++ < 20) { + LOG.info("Waiting for AM Launch to happen.."); + Thread.sleep(1000); + } + //send kill before launch + rm.killApp(app.getApplicationId()); + rm.waitForState(app.getApplicationId(), RMAppState.KILLED); + //Launch after kill + AMLauncher launcher = new AMLauncher(rm.getRMContext(), + attempt, AMLauncherEventType.LAUNCH, rm.getConfig()) { + @Override + public void onAMLaunchFailed(ContainerId containerId, Exception e) { + Assert.assertFalse("NullPointerException happens " + + " while launching " + containerId, + e instanceof NullPointerException); + } + @Override + protected ContainerManagementProtocol getContainerMgrProxy( + ContainerId containerId) { + return new MyContainerManagerImpl(); + } + }; + launcher.run(); + rm.stop(); + } + + @Test public void testRetriesOnFailures() throws Exception { final ContainerManagementProtocol mockProxy = mock(ContainerManagementProtocol.class); @@ -303,7 +341,7 @@ protected YarnRPC getYarnRPC() { rm.drainEvents(); MockRM.waitForState(app.getCurrentAppAttempt(), - RMAppAttemptState.LAUNCHED, 500); + RMAppAttemptState.LAUNCHED, 500); } @@ -337,9 +375,9 @@ public void testallocateBeforeAMRegistration() throws Exception { AllocateResponse amrs = null; try { - amrs = am.allocate(new ArrayList(), + amrs = am.allocate(new ArrayList(), new ArrayList()); - Assert.fail(); + Assert.fail(); } catch (ApplicationMasterNotRegisteredException e) { }