Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/ContainerLogsUtils.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/ContainerLogsUtils.java (revision 1573847) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/ContainerLogsUtils.java (working copy) @@ -56,13 +56,12 @@ public static List getContainerLogDirs(ContainerId containerId, String remoteUser, Context context) throws YarnException { Container container = context.getContainers().get(containerId); - if (container == null) { - throw new YarnException("Container does not exist."); - } Application application = getApplicationForContainer(containerId, context); checkAccess(remoteUser, application, context); - checkState(container.getContainerState()); + if (container != null) { + checkState(container.getContainerState()); + } return getContainerLogDirs(containerId, context.getLocalDirsHandler()); } @@ -91,14 +90,12 @@ public static File getContainerLogFile(ContainerId containerId, String fileName, String remoteUser, Context context) throws YarnException { Container container = context.getContainers().get(containerId); - if (container == null) { - throw new NotFoundException("Container with id " + containerId - + " not found."); - } Application application = getApplicationForContainer(containerId, context); checkAccess(remoteUser, application, context); - checkState(container.getContainerState()); + if (container != null) { + checkState(container.getContainerState()); + } try { LocalDirsHandlerService dirsHandler = context.getLocalDirsHandler(); Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/webapp/TestContainerLogsPage.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/webapp/TestContainerLogsPage.java (revision 1573847) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/webapp/TestContainerLogsPage.java (working copy) @@ -49,10 +49,13 @@ import org.apache.hadoop.yarn.server.nodemanager.Context; import org.apache.hadoop.yarn.server.nodemanager.LocalDirsHandlerService; import org.apache.hadoop.yarn.server.nodemanager.NodeHealthCheckerService; +import org.apache.hadoop.yarn.server.nodemanager.NodeManager; +import org.apache.hadoop.yarn.server.nodemanager.NodeManager.NMContext; import org.apache.hadoop.yarn.server.nodemanager.containermanager.application.Application; import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.Container; import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerState; import org.apache.hadoop.yarn.server.nodemanager.webapp.ContainerLogsPage.ContainersLogsBlock; +import org.apache.hadoop.yarn.server.security.ApplicationACLsManager; import org.apache.hadoop.yarn.server.utils.BuilderUtils; import org.apache.hadoop.yarn.webapp.YarnWebParams; import org.apache.hadoop.yarn.webapp.test.WebAppTests; @@ -74,6 +77,7 @@ NodeHealthCheckerService healthChecker = new NodeHealthCheckerService(); healthChecker.init(conf); LocalDirsHandlerService dirsHandler = healthChecker.getDiskHandler(); + NMContext nmContext = new NodeManager.NMContext(null, null, dirsHandler, new ApplicationACLsManager(conf)); // Add an application and the corresponding containers RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory(conf); String user = "nobody"; @@ -87,10 +91,24 @@ appId, 1); ContainerId container1 = BuilderUtils.newContainerId(recordFactory, appId, appAttemptId, 0); + + nmContext.getApplications().put(appId, app); + + MockContainer container = + new MockContainer(appAttemptId, new AsyncDispatcher(), conf, user, + appId, 1); + container.setState(ContainerState.RUNNING); + nmContext.getContainers().put(container1, container); + List files = null; - files = ContainerLogsUtils.getContainerLogDirs( - container1, dirsHandler); + files = ContainerLogsUtils.getContainerLogDirs(container1, user, nmContext); Assert.assertTrue(!(files.get(0).toString().contains("file:"))); + + // After container is completed, it is removed from nmContext + nmContext.getContainers().remove(container1); + Assert.assertNull(nmContext.getContainers().get(container1)); + files = ContainerLogsUtils.getContainerLogDirs(container1, user, nmContext); + Assert.assertTrue(!(files.get(0).toString().contains("file:"))); } @Test(timeout = 10000) Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/webapp/TestNMWebServices.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/webapp/TestNMWebServices.java (revision 1573847) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/webapp/TestNMWebServices.java (working copy) @@ -352,6 +352,16 @@ Assert.assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus()); responseText = response.getEntity(String.class); assertTrue(responseText.contains("Cannot find this log on the local disk.")); + + // After container is completed, it is removed from nmContext + nmContext.getContainers().remove(containerId); + Assert.assertNull(nmContext.getContainers().get(containerId)); + response = + r.path("ws").path("v1").path("node").path("containerlogs") + .path(containerIdStr).path(filename).accept(MediaType.TEXT_PLAIN) + .get(ClientResponse.class); + responseText = response.getEntity(String.class); + assertEquals(logMessage, responseText); } public void verifyNodesXML(NodeList nodes) throws JSONException, Exception {