YARN-7266. Fixed deadlock in Timeline Server thread initialization.

Contributed by Prabhu Joseph

(cherry picked from commit 7b42e0e32a)
This commit is contained in:
Eric Yang 2019-03-05 12:17:01 -05:00 committed by Akira Ajisaka
parent f9463e5111
commit 0d88d832cd
4 changed files with 92 additions and 0 deletions

View File

@ -92,6 +92,12 @@
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/jaxb.properties</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>

View File

@ -0,0 +1,13 @@
# Licensed 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.
javax.xml.bind.context.factory=org.apache.hadoop.yarn.server.applicationhistoryservice.webapp.ContextFactory

View File

@ -0,0 +1,62 @@
/**
* 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.applicationhistoryservice.webapp;
import java.util.Map;
import java.lang.reflect.Method;
import javax.xml.bind.JAXBContext;
/**
* ContextFactory to reuse JAXBContextImpl for DAO Classes.
*/
public final class ContextFactory {
private static JAXBContext jaxbContext;
private ContextFactory() {
}
// Called from WebComponent.service
public static JAXBContext createContext(Class[] classes,
Map<String, Object> properties) throws Exception {
synchronized (ContextFactory.class) {
if (jaxbContext == null) {
Class spFactory = Class.forName(
"com.sun.xml.internal.bind.v2.ContextFactory");
Method m = spFactory.getMethod("createContext", Class[].class,
Map.class);
jaxbContext = (JAXBContext) m.invoke((Object) null, classes,
properties);
}
}
return jaxbContext;
}
// Called from WebComponent.init
public static JAXBContext createContext(String contextPath, ClassLoader
classLoader, Map<String, Object> properties) throws Exception {
Class spFactory = Class.forName(
"com.sun.xml.internal.bind.v2.ContextFactory");
Method m = spFactory.getMethod("createContext", String.class,
ClassLoader.class, Map.class);
return (JAXBContext) m.invoke(null, contextPath, classLoader,
properties);
}
}

View File

@ -28,12 +28,14 @@ import java.net.URI;
import java.net.URL;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import javax.xml.bind.JAXBContext;
import javax.ws.rs.core.MediaType;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
@ -946,6 +948,15 @@ public class TestAHSWebServices extends JerseyTestBase {
String.valueOf(content.length()));
}
@Test
public void testContextFactory() throws Exception {
JAXBContext jaxbContext1 = ContextFactory.createContext(
new Class[]{}, Collections.EMPTY_MAP);
JAXBContext jaxbContext2 = ContextFactory.createContext(
new Class[]{}, Collections.EMPTY_MAP);
assertEquals(jaxbContext1, jaxbContext2);
}
private static String getRedirectURL(String url) {
String redirectUrl = null;
try {