YARN-6771. Use classloader inside configuration class to make new

classes. Contributed by Jongyoul Lee.
This commit is contained in:
Sangjin Lee 2017-09-20 22:22:43 -07:00
parent 53047f934e
commit 8b336632ac
4 changed files with 100 additions and 5 deletions

View File

@ -45,7 +45,6 @@ public class RpcClientFactoryPBImpl implements RpcClientFactory {
private static final String PB_IMPL_CLASS_SUFFIX = "PBClientImpl"; private static final String PB_IMPL_CLASS_SUFFIX = "PBClientImpl";
private static final RpcClientFactoryPBImpl self = new RpcClientFactoryPBImpl(); private static final RpcClientFactoryPBImpl self = new RpcClientFactoryPBImpl();
private Configuration localConf = new Configuration();
private ConcurrentMap<Class<?>, Constructor<?>> cache = new ConcurrentHashMap<Class<?>, Constructor<?>>(); private ConcurrentMap<Class<?>, Constructor<?>> cache = new ConcurrentHashMap<Class<?>, Constructor<?>>();
public static RpcClientFactoryPBImpl get() { public static RpcClientFactoryPBImpl get() {
@ -62,7 +61,7 @@ public class RpcClientFactoryPBImpl implements RpcClientFactory {
if (constructor == null) { if (constructor == null) {
Class<?> pbClazz = null; Class<?> pbClazz = null;
try { try {
pbClazz = localConf.getClassByName(getPBImplClassName(protocol)); pbClazz = conf.getClassByName(getPBImplClassName(protocol));
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
throw new YarnRuntimeException("Failed to load class: [" throw new YarnRuntimeException("Failed to load class: ["
+ getPBImplClassName(protocol) + "]", e); + getPBImplClassName(protocol) + "]", e);

View File

@ -51,7 +51,6 @@ public class RpcServerFactoryPBImpl implements RpcServerFactory {
private static final RpcServerFactoryPBImpl self = new RpcServerFactoryPBImpl(); private static final RpcServerFactoryPBImpl self = new RpcServerFactoryPBImpl();
private Configuration localConf = new Configuration();
private ConcurrentMap<Class<?>, Constructor<?>> serviceCache = new ConcurrentHashMap<Class<?>, Constructor<?>>(); private ConcurrentMap<Class<?>, Constructor<?>> serviceCache = new ConcurrentHashMap<Class<?>, Constructor<?>>();
private ConcurrentMap<Class<?>, Method> protoCache = new ConcurrentHashMap<Class<?>, Method>(); private ConcurrentMap<Class<?>, Method> protoCache = new ConcurrentHashMap<Class<?>, Method>();
@ -80,7 +79,7 @@ public class RpcServerFactoryPBImpl implements RpcServerFactory {
if (constructor == null) { if (constructor == null) {
Class<?> pbServiceImplClazz = null; Class<?> pbServiceImplClazz = null;
try { try {
pbServiceImplClazz = localConf pbServiceImplClazz = conf
.getClassByName(getPbServiceImplClassName(protocol)); .getClassByName(getPbServiceImplClassName(protocol));
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
throw new YarnRuntimeException("Failed to load class: [" throw new YarnRuntimeException("Failed to load class: ["
@ -113,7 +112,7 @@ public class RpcServerFactoryPBImpl implements RpcServerFactory {
if (method == null) { if (method == null) {
Class<?> protoClazz = null; Class<?> protoClazz = null;
try { try {
protoClazz = localConf.getClassByName(getProtoClassName(protocol)); protoClazz = conf.getClassByName(getProtoClassName(protocol));
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
throw new YarnRuntimeException("Failed to load class: [" throw new YarnRuntimeException("Failed to load class: ["
+ getProtoClassName(protocol) + "]", e); + getProtoClassName(protocol) + "]", e);

View File

@ -0,0 +1,49 @@
/**
* 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.factories.impl.pb;
import org.apache.hadoop.conf.Configuration;
import org.junit.Test;
import java.net.InetSocketAddress;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
/**
* Test class for RpcClientFactoryPBImpl.
*/
public class TestRpcClientFactoryPBImpl {
@Test
public void testToUseCustomClassloader() throws Exception {
Configuration configuration = mock(Configuration.class);
RpcClientFactoryPBImpl rpcClientFactoryPB = RpcClientFactoryPBImpl.get();
try {
rpcClientFactoryPB.getClient(
Class.forName("org.apache.hadoop.yarn.api.ApplicationClientProtocol"),
-1, new InetSocketAddress(0), configuration);
} catch (Exception e) {
// Do nothing
}
verify(configuration, atLeastOnce()).getClassByName(anyString());
}
}

View File

@ -0,0 +1,48 @@
/**
* 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.factories.impl.pb;
import org.apache.hadoop.conf.Configuration;
import org.junit.Test;
import java.net.InetSocketAddress;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
/**
* Test class for RpcServerFactoryPBImpl.
*/
public class TestRpcServerFactoryPBImpl {
@Test
public void testToUseCustomClassloader() throws Exception {
Configuration configuration = mock(Configuration.class);
RpcServerFactoryPBImpl rpcServerFactoryPB = RpcServerFactoryPBImpl.get();
try {
rpcServerFactoryPB.getServer(
Class.forName("org.apache.hadoop.yarn.api.ApplicationClientProtocol"),
-1, new InetSocketAddress(0), configuration, null, 1);
} catch (Exception e) {
// Do nothing
}
verify(configuration, atLeastOnce()).getClassByName(anyString());
}
}