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 14133ba4ecd..808da31b081 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 @@ -208,7 +208,7 @@ protected void serviceInit(Configuration conf) throws Exception { // TimelineServer which means we are able to get history information // for applications/applicationAttempts/containers by using ahsClient // when the TimelineServer is running. - if (timelineV1ServiceEnabled || conf.getBoolean( + if (timelineV1ServiceEnabled && conf.getBoolean( YarnConfiguration.APPLICATION_HISTORY_ENABLED, YarnConfiguration.DEFAULT_APPLICATION_HISTORY_ENABLED)) { historyServiceEnabled = true; 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 4af97e4212a..b8aabbca02c 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 @@ -74,6 +74,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.QueueMetrics; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler; import org.apache.hadoop.yarn.util.Records; +import static org.assertj.core.api.Assertions.fail; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -503,6 +504,8 @@ public void testGetContainers() throws YarnException, IOException { Configuration conf = getConf(); conf.setBoolean(YarnConfiguration.APPLICATION_HISTORY_ENABLED, true); + conf.setBoolean(YarnConfiguration.TIMELINE_SERVICE_ENABLED, + true); final YarnClient client = new MockYarnClient(); client.init(conf); @@ -536,6 +539,8 @@ public void testGetContainersOnAHSFail() throws YarnException, IOException { Configuration conf = getConf(); conf.setBoolean(YarnConfiguration.APPLICATION_HISTORY_ENABLED, true); + conf.setBoolean(YarnConfiguration.TIMELINE_SERVICE_ENABLED, + true); final YarnClient client = new MockYarnClient() { @Override @@ -569,11 +574,50 @@ public void testGetContainersOnAHSFail() throws YarnException, IOException { } + @Test(timeout = 10000) + public void testGetContainerReportTMLDisabled() + throws YarnException, IOException { + Configuration conf = getConf(); + conf.setBoolean(YarnConfiguration.APPLICATION_HISTORY_ENABLED, + true); + conf.setBoolean(YarnConfiguration.TIMELINE_SERVICE_ENABLED, + false); + final YarnClient client = new MockYarnClient(); + client.init(conf); + client.start(); + + List expectedReports = ((MockYarnClient) client) + .getReports(); + + ApplicationId applicationId = ApplicationId.newInstance(1234, 5); + ApplicationAttemptId appAttemptId = ApplicationAttemptId.newInstance( + applicationId, 1); + ContainerId containerId = ContainerId.newContainerId(appAttemptId, 1); + ContainerReport report = client.getContainerReport(containerId); + Assert.assertNotNull(report); + assertThat(report.getContainerId().toString()).isEqualTo( + (ContainerId.newContainerId(expectedReports.get(0) + .getCurrentApplicationAttemptId(), 1)).toString()); + containerId = ContainerId.newContainerId(appAttemptId, 3); + try{ + report = client.getContainerReport(containerId); + fail("Expected a ContainerNotFoundException to be thrown"); + } catch (ContainerNotFoundException e) { + Assert.assertEquals("container_1234_0005_01_000003 is not found ", + e.getMessage()); + } + + Assert.assertNotNull(report.getExecutionType()); + client.stop(); + } + @Test(timeout = 10000) public void testGetContainerReport() throws YarnException, IOException { Configuration conf = getConf(); conf.setBoolean(YarnConfiguration.APPLICATION_HISTORY_ENABLED, true); + conf.setBoolean(YarnConfiguration.TIMELINE_SERVICE_ENABLED, + true); final YarnClient client = new MockYarnClient(); client.init(conf); client.start(); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptImpl.java index bcc52e2cd22..019b53838ed 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptImpl.java @@ -1360,7 +1360,8 @@ private void rememberTargetTransitionsAndStoreState(RMAppAttemptEvent event, // don't leave the tracking URL pointing to a non-existent AM if (conf.getBoolean(YarnConfiguration.APPLICATION_HISTORY_ENABLED, - YarnConfiguration.DEFAULT_APPLICATION_HISTORY_ENABLED)) { + YarnConfiguration.DEFAULT_APPLICATION_HISTORY_ENABLED) && + YarnConfiguration.timelineServiceEnabled(conf)) { setTrackingUrlToAHSPage(stateToBeStored); } else { setTrackingUrlToRMAppPage(stateToBeStored); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebAppFilter.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebAppFilter.java index 40b383478cc..700a8dd991f 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebAppFilter.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebAppFilter.java @@ -71,7 +71,7 @@ private static final Set NON_REDIRECTED_URIS = Sets.newHashSet( "/conf", "/stacks", "/logLevel", "/logs", IsActiveServlet.PATH_SPEC); private String path; - private boolean ahsEnabled; + private boolean isHSEnabled; private String ahsPageURLPrefix; private static final int BASIC_SLEEP_TIME = 5; private static final int MAX_SLEEP_TIME = 5 * 60; @@ -93,9 +93,10 @@ public RMWebAppFilter(Injector injector, Configuration conf) { path = YarnConfiguration.useHttps(conf) ? "https://" + path : "http://" + path; - ahsEnabled = conf.getBoolean( + isHSEnabled = conf.getBoolean( YarnConfiguration.APPLICATION_HISTORY_ENABLED, - YarnConfiguration.DEFAULT_APPLICATION_HISTORY_ENABLED); + YarnConfiguration.DEFAULT_APPLICATION_HISTORY_ENABLED) && + YarnConfiguration.timelineServiceEnabled(conf); ahsPageURLPrefix = pjoin( WebAppUtils.getHttpSchemePrefix(conf) + WebAppUtils.getAHSWebAppURLWithoutScheme( @@ -167,7 +168,7 @@ public void doFilter(HttpServletRequest request, } } return; - } else if (ahsEnabled) { + } else if (isHSEnabled) { String ahsRedirectUrl = ahsRedirectPath(uriWithQueryString, rmWebApp); if(ahsRedirectUrl != null) { response.setHeader("Location", ahsRedirectUrl); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/TestRMAppAttemptTransitions.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/TestRMAppAttemptTransitions.java index e2f80cafd40..6c7ab41b00e 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/TestRMAppAttemptTransitions.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/TestRMAppAttemptTransitions.java @@ -1176,6 +1176,7 @@ public void testLaunchedExpire() { public void testLaunchedFailWhileAHSEnabled() { Configuration myConf = new Configuration(conf); myConf.setBoolean(YarnConfiguration.APPLICATION_HISTORY_ENABLED, true); + myConf.setBoolean(YarnConfiguration.TIMELINE_SERVICE_ENABLED, true); ApplicationId applicationId = MockApps.newAppID(appId); ApplicationAttemptId applicationAttemptId = ApplicationAttemptId.newInstance(applicationId, 2); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/AppReportFetcher.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/AppReportFetcher.java index 6b79e194b41..95260304326 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/AppReportFetcher.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/AppReportFetcher.java @@ -44,7 +44,7 @@ private final ApplicationClientProtocol applicationsManager; private final ApplicationHistoryProtocol historyManager; private final RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory(null); - private boolean isAHSEnabled; + private boolean isHSEnabled; /** * Create a new Connection to the RM/Application History Server @@ -53,14 +53,15 @@ */ public AppReportFetcher(Configuration conf) { if (conf.getBoolean(YarnConfiguration.APPLICATION_HISTORY_ENABLED, - YarnConfiguration.DEFAULT_APPLICATION_HISTORY_ENABLED)) { - isAHSEnabled = true; + YarnConfiguration.DEFAULT_APPLICATION_HISTORY_ENABLED) && + YarnConfiguration.timelineServiceEnabled(conf)) { + isHSEnabled = true; } this.conf = conf; try { applicationsManager = ClientRMProxy.createRMProxy(conf, ApplicationClientProtocol.class); - if (isAHSEnabled) { + if (isHSEnabled) { historyManager = getAHSProxy(conf); } else { this.historyManager = null; @@ -79,12 +80,13 @@ public AppReportFetcher(Configuration conf) { */ public AppReportFetcher(Configuration conf, ApplicationClientProtocol applicationsManager) { if (conf.getBoolean(YarnConfiguration.APPLICATION_HISTORY_ENABLED, - YarnConfiguration.DEFAULT_APPLICATION_HISTORY_ENABLED)) { - isAHSEnabled = true; + YarnConfiguration.DEFAULT_APPLICATION_HISTORY_ENABLED) && + YarnConfiguration.timelineServiceEnabled(conf)) { + isHSEnabled = true; } this.conf = conf; this.applicationsManager = applicationsManager; - if (isAHSEnabled) { + if (isHSEnabled) { try { historyManager = getAHSProxy(conf); } catch (IOException e) { @@ -125,7 +127,7 @@ public FetchedAppReport getApplicationReport(ApplicationId appId) getApplicationReport(request).getApplicationReport(); fetchedAppReport = new FetchedAppReport(appReport, AppReportSource.RM); } catch (ApplicationNotFoundException e) { - if (!isAHSEnabled) { + if (!isHSEnabled) { // Just throw it as usual if historyService is not enabled. throw e; } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/test/java/org/apache/hadoop/yarn/server/webproxy/TestAppReportFetcher.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/test/java/org/apache/hadoop/yarn/server/webproxy/TestAppReportFetcher.java index bcab33fd66d..f24d77a6f02 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/test/java/org/apache/hadoop/yarn/server/webproxy/TestAppReportFetcher.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/test/java/org/apache/hadoop/yarn/server/webproxy/TestAppReportFetcher.java @@ -50,10 +50,12 @@ public void cleanUp() { fetcher = null; } - public void testHelper(boolean isAHSEnabled) + public void testHelper(boolean isAHSEnabled, boolean isTLMEnabled) throws YarnException, IOException { conf.setBoolean(YarnConfiguration.APPLICATION_HISTORY_ENABLED, isAHSEnabled); + conf.setBoolean(YarnConfiguration.TIMELINE_SERVICE_ENABLED, + isTLMEnabled); appManager = Mockito.mock(ApplicationClientProtocol.class); Mockito.when(appManager .getApplicationReport(Mockito.any(GetApplicationReportRequest.class))) @@ -64,8 +66,9 @@ public void testHelper(boolean isAHSEnabled) } @Test - public void testFetchReportAHSEnabled() throws YarnException, IOException { - testHelper(true); + public void testFetchReportAHSAndTLSEnabled() + throws YarnException, IOException { + testHelper(true, true); Mockito.verify(historyManager, Mockito.times(1)) .getApplicationReport(Mockito.any(GetApplicationReportRequest.class)); Mockito.verify(appManager, Mockito.times(1)) @@ -73,9 +76,10 @@ public void testFetchReportAHSEnabled() throws YarnException, IOException { } @Test - public void testFetchReportAHSDisabled() throws YarnException, IOException { + public void testFetchReportAHSAndTLSDisabled() + throws YarnException, IOException { try { - testHelper(false); + testHelper(false, false); } catch (ApplicationNotFoundException e) { Assert.assertTrue(e.getMessage() == appNotFoundExceptionMsg); /* RM will not know of the app and Application History Service is disabled @@ -90,6 +94,25 @@ public void testFetchReportAHSDisabled() throws YarnException, IOException { } } + @Test + public void testFetchReportAHSEnableAndTLSDisabled() + throws YarnException, IOException { + try { + testHelper(true, false); + } catch (ApplicationNotFoundException e) { + Assert.assertTrue(e.getMessage() == appNotFoundExceptionMsg); + /* RM will not know of the app and Application History Service is disabled + * So we will not try to get the report from AHS and RM will throw + * ApplicationNotFoundException + */ + } + Mockito.verify(appManager, Mockito.times(1)) + .getApplicationReport(Mockito.any(GetApplicationReportRequest.class)); + if (historyManager != null) { + Assert.fail("HistoryManager should be null as AHS is disabled"); + } + } + static class AppReportFetcherForTest extends AppReportFetcher { public AppReportFetcherForTest(Configuration conf,