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:
parent
b87a727ff4
commit
4d9c5300e2
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue