diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceTrackerService.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceTrackerService.java index 8a2c539..3d9c615 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceTrackerService.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceTrackerService.java @@ -206,26 +206,24 @@ public RegisterNodeManagerResponse registerNodeManager( for (ContainerStatus containerStatus : request.getContainerStatuses()) { ApplicationAttemptId appAttemptId = containerStatus.getContainerId().getApplicationAttemptId(); - RMApp rmApp = - rmContext.getRMApps().get(appAttemptId.getApplicationId()); - if (rmApp != null) { + try { + RMApp rmApp = + rmContext.getRMApps().get(appAttemptId.getApplicationId()); RMAppAttempt rmAppAttempt = rmApp.getRMAppAttempt(appAttemptId); - if (rmAppAttempt != null) { - if (rmAppAttempt.getMasterContainer().getId() - .equals(containerStatus.getContainerId()) - && containerStatus.getState() == ContainerState.COMPLETE) { - // sending master container finished event. - RMAppAttemptContainerFinishedEvent evt = - new RMAppAttemptContainerFinishedEvent(appAttemptId, - containerStatus); - rmContext.getDispatcher().getEventHandler().handle(evt); - } + if (rmAppAttempt.getMasterContainer().getId() + .equals(containerStatus.getContainerId()) + && containerStatus.getState() == ContainerState.COMPLETE) { + // sending master container finished event. + RMAppAttemptContainerFinishedEvent evt = + new RMAppAttemptContainerFinishedEvent(appAttemptId, + containerStatus); + rmContext.getDispatcher().getEventHandler().handle(evt); } - } else { - LOG.error("Received finished container :" - + containerStatus.getContainerId() - + " for non existing application :" - + appAttemptId.getApplicationId()); + } catch (NullPointerException npe) { + LOG.warn("Received finished container : " + + containerStatus.getContainerId() + " for application " + + appAttemptId.getApplicationId() + + " without a master container.", npe); } } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptImpl.java index 697a180..3e90ec8 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptImpl.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptImpl.java @@ -35,9 +35,11 @@ import javax.crypto.SecretKey; +import com.google.common.annotations.VisibleForTesting; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.security.Credentials; import org.apache.hadoop.security.UserGroupInformation; @@ -629,7 +631,9 @@ public Container getMasterContainer() { } } - private void setMasterContainer(Container container) { + @InterfaceAudience.Private + @VisibleForTesting + public void setMasterContainer(Container container) { masterContainer = container; } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceTrackerService.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceTrackerService.java index 303e0fb..e4f648b 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceTrackerService.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceTrackerService.java @@ -26,6 +26,9 @@ import java.util.HashMap; import java.util.List; +import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt; +import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt + .RMAppAttemptImpl; import org.junit.Assert; import org.apache.hadoop.conf.Configuration; @@ -468,6 +471,9 @@ private void checkUnealthyNMCount(MockRM rm, MockNM nm1, boolean health, ClusterMetrics.getMetrics().getUnhealthyNMs()); } + /** + * Test verifies node registration with completed containers + */ @Test public void testNodeRegistrationWithContainers() throws Exception { rm = new MockRM(); @@ -478,13 +484,22 @@ public void testNodeRegistrationWithContainers() throws Exception { MockNM nm = rm.registerNode("host1:1234", 8192); nm.nodeHeartbeat(true); - // Register node with some container statuses + // Case 1: AppAttemptId is null ContainerStatus status = ContainerStatus.newInstance( ContainerId.newInstance(ApplicationAttemptId.newInstance( app.getApplicationId(), 2), 1), ContainerState.COMPLETE, "Dummy Completed", 0); + nm.registerNode(Collections.singletonList(status)); + assertEquals("Incorrect number of nodes", 1, + rm.getRMContext().getRMNodes().size()); - // The following shouldn't throw NPE + // Case 2: Master container is null + RMAppAttemptImpl currentAttempt = + (RMAppAttemptImpl) app.getCurrentAppAttempt(); + currentAttempt.setMasterContainer(null); + status = ContainerStatus.newInstance( + ContainerId.newInstance(currentAttempt.getAppAttemptId(), 0), + ContainerState.COMPLETE, "Dummy Completed", 0); nm.registerNode(Collections.singletonList(status)); assertEquals("Incorrect number of nodes", 1, rm.getRMContext().getRMNodes().size());