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 28a7f855d22..86bda986780 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 @@ -879,7 +879,7 @@ public class YarnClientImpl extends YarnClient { try { containersListFromAHS = getContainerReportFromHistory(applicationAttemptId); - } catch (IOException e) { + } catch (IOException | YarnException e) { if (appNotFoundInRM) { throw e; } 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 17e43cacda7..7ad7e3a8a4f 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 @@ -530,6 +530,44 @@ public class TestYarnClient extends ParameterizedSchedulerTestBase { client.stop(); } + @Test(timeout = 10000) + public void testGetContainersOnAHSFail() throws YarnException, IOException { + Configuration conf = getConf(); + conf.setBoolean(YarnConfiguration.APPLICATION_HISTORY_ENABLED, + true); + + final YarnClient client = new MockYarnClient() { + @Override + public List getContainers( + ApplicationAttemptId appAttemptId) throws YarnException, + IOException { + return getContainersOnAHSFail(appAttemptId); + } + }; + + client.init(conf); + client.start(); + + ApplicationId applicationId = ApplicationId.newInstance(1234, 5); + ApplicationAttemptId appAttemptId = ApplicationAttemptId.newInstance( + applicationId, 1); + List reports = client.getContainers(appAttemptId); + Assert.assertNotNull(reports); + Assert.assertTrue(reports.size() == 2); + Assert.assertEquals(reports.get(0).getContainerId(), + (ContainerId.newContainerId(appAttemptId, 1))); + Assert.assertEquals(reports.get(1).getContainerId(), + (ContainerId.newContainerId(appAttemptId, 2))); + + //Only 2 running containers from RM are present when AHS throws exception + Assert.assertEquals(ContainerState.RUNNING, + (reports.get(0).getContainerState())); + Assert.assertEquals(ContainerState.RUNNING, + (reports.get(1).getContainerState())); + client.stop(); + } + + @Test(timeout = 10000) public void testGetContainerReport() throws YarnException, IOException { Configuration conf = getConf(); @@ -914,6 +952,18 @@ public class TestYarnClient extends ParameterizedSchedulerTestBase { return super.getContainers(appAttemptId); } + protected List + getContainersOnAHSFail(ApplicationAttemptId appAttemptId) + throws YarnException, IOException { + when(mockContainersResponse.getContainerList()).thenReturn( + getContainersReport(appAttemptId)); + when(historyClient.getContainers(any(ApplicationAttemptId.class))) + .thenThrow(new ApplicationNotFoundException( + appAttemptId.getApplicationId() + + " does not exist in the timeline store")); + return super.getContainers(appAttemptId); + } + private List getContainersFromAHS( ApplicationAttemptId appAttemptId) { return containersFromAHS.get(appAttemptId);