YARN-10284. Add lazy initialization of LogAggregationFileControllerFactory in LogServlet. Contributed by Adam Antal
This commit is contained in:
parent
ec8f3714e0
commit
ac307fe20d
@ -62,15 +62,23 @@ public class LogServlet extends Configured {
|
|||||||
private static final Joiner JOINER = Joiner.on("");
|
private static final Joiner JOINER = Joiner.on("");
|
||||||
private static final String NM_DOWNLOAD_URI_STR = "/ws/v1/node/containers";
|
private static final String NM_DOWNLOAD_URI_STR = "/ws/v1/node/containers";
|
||||||
|
|
||||||
private final LogAggregationFileControllerFactory factory;
|
private LogAggregationFileControllerFactory factoryInstance = null;
|
||||||
private final AppInfoProvider appInfoProvider;
|
private final AppInfoProvider appInfoProvider;
|
||||||
|
|
||||||
public LogServlet(Configuration conf, AppInfoProvider appInfoProvider) {
|
public LogServlet(Configuration conf, AppInfoProvider appInfoProvider) {
|
||||||
super(conf);
|
super(conf);
|
||||||
this.factory = new LogAggregationFileControllerFactory(conf);
|
|
||||||
this.appInfoProvider = appInfoProvider;
|
this.appInfoProvider = appInfoProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private LogAggregationFileControllerFactory getOrCreateFactory() {
|
||||||
|
if (factoryInstance != null) {
|
||||||
|
return factoryInstance;
|
||||||
|
} else {
|
||||||
|
factoryInstance = new LogAggregationFileControllerFactory(getConf());
|
||||||
|
return factoryInstance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public String getNMWebAddressFromRM(String nodeId)
|
public String getNMWebAddressFromRM(String nodeId)
|
||||||
throws ClientHandlerException, UniformInterfaceException, JSONException {
|
throws ClientHandlerException, UniformInterfaceException, JSONException {
|
||||||
@ -226,7 +234,7 @@ public Response getContainerLogsInfo(HttpServletRequest req,
|
|||||||
String nmId, boolean redirectedFromNode,
|
String nmId, boolean redirectedFromNode,
|
||||||
String clusterId, boolean manualRedirection) {
|
String clusterId, boolean manualRedirection) {
|
||||||
|
|
||||||
builder.setFactory(factory);
|
builder.setFactory(getOrCreateFactory());
|
||||||
|
|
||||||
BasicAppInfo appInfo;
|
BasicAppInfo appInfo;
|
||||||
try {
|
try {
|
||||||
@ -361,6 +369,8 @@ public Response getLogFile(HttpServletRequest req, String containerIdStr,
|
|||||||
"Invalid ContainerId: " + containerIdStr);
|
"Invalid ContainerId: " + containerIdStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LogAggregationFileControllerFactory factory = getOrCreateFactory();
|
||||||
|
|
||||||
final long length = LogWebServiceUtils.parseLongParam(size);
|
final long length = LogWebServiceUtils.parseLongParam(size);
|
||||||
|
|
||||||
ApplicationId appId = containerId.getApplicationAttemptId()
|
ApplicationId appId = containerId.getApplicationAttemptId()
|
||||||
|
@ -0,0 +1,52 @@
|
|||||||
|
/**
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hadoop.yarn.server.webapp;
|
||||||
|
|
||||||
|
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
||||||
|
import org.apache.hadoop.yarn.logaggregation.filecontroller.LogAggregationFileControllerFactory;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.assertj.core.api.Assertions.fail;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
|
||||||
|
public class TestLogServlet {
|
||||||
|
/**
|
||||||
|
* Test that {@link LogServlet}'s constructor does not throw exception,
|
||||||
|
* if the log aggregation properties are bad.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testLogServletNoException() {
|
||||||
|
YarnConfiguration conf = new YarnConfiguration();
|
||||||
|
conf.set(YarnConfiguration.LOG_AGGREGATION_FILE_FORMATS, "22");
|
||||||
|
|
||||||
|
// first test the factory's constructor throws exception
|
||||||
|
try {
|
||||||
|
LogAggregationFileControllerFactory factory =
|
||||||
|
new LogAggregationFileControllerFactory(conf);
|
||||||
|
fail("LogAggregationFileControllerFactory should have thrown exception");
|
||||||
|
} catch (IllegalArgumentException expected) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// LogServlet should not throw exception
|
||||||
|
AppInfoProvider aip = mock(AppInfoProvider.class);
|
||||||
|
LogServlet ls = new LogServlet(conf, aip);
|
||||||
|
assertThat(ls).isNotNull();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user