Skip to content

Commit aa6d134

Browse files
YARN-10284. Add lazy initialization of LogAggregationFileControllerFactory in LogServlet. Contributed by Adam Antal
1 parent e0a0741 commit aa6d134

File tree

2 files changed

+65
-3
lines changed
  • hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src

2 files changed

+65
-3
lines changed

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/LogServlet.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,23 @@ public class LogServlet extends Configured {
6262
private static final Joiner JOINER = Joiner.on("");
6363
private static final String NM_DOWNLOAD_URI_STR = "/ws/v1/node/containers";
6464

65-
private final LogAggregationFileControllerFactory factory;
65+
private LogAggregationFileControllerFactory factoryInstance = null;
6666
private final AppInfoProvider appInfoProvider;
6767

6868
public LogServlet(Configuration conf, AppInfoProvider appInfoProvider) {
6969
super(conf);
70-
this.factory = new LogAggregationFileControllerFactory(conf);
7170
this.appInfoProvider = appInfoProvider;
7271
}
7372

73+
private LogAggregationFileControllerFactory getOrCreateFactory() {
74+
if (factoryInstance != null) {
75+
return factoryInstance;
76+
} else {
77+
factoryInstance = new LogAggregationFileControllerFactory(getConf());
78+
return factoryInstance;
79+
}
80+
}
81+
7482
@VisibleForTesting
7583
public String getNMWebAddressFromRM(String nodeId)
7684
throws ClientHandlerException, UniformInterfaceException, JSONException {
@@ -226,7 +234,7 @@ public Response getContainerLogsInfo(HttpServletRequest req,
226234
String nmId, boolean redirectedFromNode,
227235
String clusterId, boolean manualRedirection) {
228236

229-
builder.setFactory(factory);
237+
builder.setFactory(getOrCreateFactory());
230238

231239
BasicAppInfo appInfo;
232240
try {
@@ -361,6 +369,8 @@ public Response getLogFile(HttpServletRequest req, String containerIdStr,
361369
"Invalid ContainerId: " + containerIdStr);
362370
}
363371

372+
LogAggregationFileControllerFactory factory = getOrCreateFactory();
373+
364374
final long length = LogWebServiceUtils.parseLongParam(size);
365375

366376
ApplicationId appId = containerId.getApplicationAttemptId()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/**
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
package org.apache.hadoop.yarn.server.webapp;
20+
21+
import org.apache.hadoop.yarn.conf.YarnConfiguration;
22+
import org.apache.hadoop.yarn.logaggregation.filecontroller.LogAggregationFileControllerFactory;
23+
import org.junit.Test;
24+
25+
import static org.assertj.core.api.Assertions.assertThat;
26+
import static org.assertj.core.api.Assertions.fail;
27+
import static org.mockito.Mockito.mock;
28+
29+
public class TestLogServlet {
30+
/**
31+
* Test that {@link LogServlet}'s constructor does not throw exception,
32+
* if the log aggregation properties are bad.
33+
*/
34+
@Test
35+
public void testLogServletNoException() {
36+
YarnConfiguration conf = new YarnConfiguration();
37+
conf.set(YarnConfiguration.LOG_AGGREGATION_FILE_FORMATS, "22");
38+
39+
// first test the factory's constructor throws exception
40+
try {
41+
LogAggregationFileControllerFactory factory =
42+
new LogAggregationFileControllerFactory(conf);
43+
fail("LogAggregationFileControllerFactory should have thrown exception");
44+
} catch (IllegalArgumentException expected) {
45+
}
46+
47+
// LogServlet should not throw exception
48+
AppInfoProvider aip = mock(AppInfoProvider.class);
49+
LogServlet ls = new LogServlet(conf, aip);
50+
assertThat(ls).isNotNull();
51+
}
52+
}

0 commit comments

Comments
 (0)