diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index 1d6f2b4487..592ea548c0 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -242,6 +242,9 @@ Release 2.7.0 - UNRELEASED YARN-1723. AMRMClientAsync missing blacklist addition and removal functionality. (Bartosz Ɓugowski via sseth) + YARN-3123. Made YARN CLI show a single completed container even if the app + is running. (Naganarasimha G R via zjshen) + OPTIMIZATIONS BUG FIXES diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/YarnClientImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/YarnClientImpl.java index 99c0f0290d..975c26796e 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/YarnClientImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/YarnClientImpl.java @@ -100,6 +100,7 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.exceptions.ApplicationIdNotProvidedException; import org.apache.hadoop.yarn.exceptions.ApplicationNotFoundException; +import org.apache.hadoop.yarn.exceptions.ContainerNotFoundException; import org.apache.hadoop.yarn.exceptions.YarnException; import org.apache.hadoop.yarn.exceptions.YarnRuntimeException; import org.apache.hadoop.yarn.security.AMRMTokenIdentifier; @@ -638,7 +639,8 @@ public ContainerReport getContainerReport(ContainerId containerId) } // Even if history-service is enabled, treat all exceptions still the same // except the following - if (e.getClass() != ApplicationNotFoundException.class) { + if (e.getClass() != ApplicationNotFoundException.class + && e.getClass() != ContainerNotFoundException.class) { throw e; } return historyClient.getContainerReport(containerId); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java index 785968871f..eb8ca48483 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java @@ -35,6 +35,7 @@ import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Set; @@ -97,6 +98,8 @@ import org.apache.hadoop.yarn.client.api.YarnClientApplication; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.exceptions.ApplicationIdNotProvidedException; +import org.apache.hadoop.yarn.exceptions.ApplicationNotFoundException; +import org.apache.hadoop.yarn.exceptions.ContainerNotFoundException; import org.apache.hadoop.yarn.exceptions.YarnException; import org.apache.hadoop.yarn.security.client.TimelineDelegationTokenIdentifier; import org.apache.hadoop.yarn.server.MiniYARNCluster; @@ -372,6 +375,8 @@ public void testGetContainers() throws YarnException, IOException { @Test(timeout = 10000) public void testGetContainerReport() throws YarnException, IOException { Configuration conf = new Configuration(); + conf.setBoolean(YarnConfiguration.APPLICATION_HISTORY_ENABLED, + true); final YarnClient client = new MockYarnClient(); client.init(conf); client.start(); @@ -388,6 +393,12 @@ public void testGetContainerReport() throws YarnException, IOException { Assert.assertEquals(report.getContainerId().toString(), (ContainerId.newContainerId(expectedReports.get(0) .getCurrentApplicationAttemptId(), 1)).toString()); + containerId = ContainerId.newContainerId(appAttemptId, 3); + report = client.getContainerReport(containerId); + Assert.assertNotNull(report); + Assert.assertEquals(report.getContainerId().toString(), + (ContainerId.newContainerId(expectedReports.get(0) + .getCurrentApplicationAttemptId(), 3)).toString()); client.stop(); } @@ -642,8 +653,23 @@ private List getContainersFromAHS( @Override public ContainerReport getContainerReport(ContainerId containerId) throws YarnException, IOException { - when(mockContainerResponse.getContainerReport()).thenReturn( - getContainer(containerId)); + try { + ContainerReport container = getContainer(containerId, containers); + when(mockContainerResponse.getContainerReport()).thenReturn(container); + } catch (YarnException e) { + when(rmClient.getContainerReport(any(GetContainerReportRequest.class))) + .thenThrow(e).thenReturn(mockContainerResponse); + } + try { + ContainerReport container = + getContainer(containerId, containersFromAHS); + when(historyClient.getContainerReport(any(ContainerId.class))) + .thenReturn(container); + } catch (YarnException e) { + when(historyClient.getContainerReport(any(ContainerId.class))) + .thenThrow(e); + } + return super.getContainerReport(containerId); } @@ -661,8 +687,25 @@ public List getContainersReport( return containers.get(appAttemptId); } - public ContainerReport getContainer(ContainerId containerId) { - return containers.get(containerId.getApplicationAttemptId()).get(0); + private ContainerReport getContainer( + ContainerId containerId, + HashMap> containersToAppAttemptMapping) + throws YarnException, IOException { + List containersForAppAttempt = + containersToAppAttemptMapping.get(containerId + .getApplicationAttemptId()); + if (containersForAppAttempt == null) { + throw new ApplicationNotFoundException(containerId + .getApplicationAttemptId().getApplicationId() + " is not found "); + } + Iterator iterator = containersForAppAttempt.iterator(); + while (iterator.hasNext()) { + ContainerReport next = iterator.next(); + if (next.getContainerId().equals(containerId)) { + return next; + } + } + throw new ContainerNotFoundException(containerId + " is not found "); } }