YARN-8567. Fetching yarn logs fails for long running application if it is not present in timeline store. Contributed by Tarun Parimi.

This commit is contained in:
Rohith Sharma K S 2019-01-04 14:01:24 +05:30 committed by Rohith Sharma K S
parent b87a727ff4
commit 4d9c5300e2
2 changed files with 51 additions and 1 deletions

View File

@ -870,7 +870,7 @@ public class YarnClientImpl extends YarnClient {
try { try {
containersListFromAHS = containersListFromAHS =
getContainerReportFromHistory(applicationAttemptId); getContainerReportFromHistory(applicationAttemptId);
} catch (IOException e) { } catch (IOException | YarnException e) {
if (appNotFoundInRM) { if (appNotFoundInRM) {
throw e; throw e;
} }

View File

@ -530,6 +530,44 @@ public class TestYarnClient extends ParameterizedSchedulerTestBase {
client.stop(); 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<ContainerReport> 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<ContainerReport> 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) @Test(timeout = 10000)
public void testGetContainerReport() throws YarnException, IOException { public void testGetContainerReport() throws YarnException, IOException {
Configuration conf = getConf(); Configuration conf = getConf();
@ -914,6 +952,18 @@ public class TestYarnClient extends ParameterizedSchedulerTestBase {
return super.getContainers(appAttemptId); return super.getContainers(appAttemptId);
} }
protected List<ContainerReport>
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<ContainerReport> getContainersFromAHS( private List<ContainerReport> getContainersFromAHS(
ApplicationAttemptId appAttemptId) { ApplicationAttemptId appAttemptId) {
return containersFromAHS.get(appAttemptId); return containersFromAHS.get(appAttemptId);