From 8b336632acad10e45d029596c5e3196e1857d891 Mon Sep 17 00:00:00 2001 From: Sangjin Lee Date: Wed, 20 Sep 2017 22:22:43 -0700 Subject: [PATCH] YARN-6771. Use classloader inside configuration class to make new classes. Contributed by Jongyoul Lee. --- .../impl/pb/RpcClientFactoryPBImpl.java | 3 +- .../impl/pb/RpcServerFactoryPBImpl.java | 5 +- .../impl/pb/TestRpcClientFactoryPBImpl.java | 49 +++++++++++++++++++ .../impl/pb/TestRpcServerFactoryPBImpl.java | 48 ++++++++++++++++++ 4 files changed, 100 insertions(+), 5 deletions(-) create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/factories/impl/pb/TestRpcClientFactoryPBImpl.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/factories/impl/pb/TestRpcServerFactoryPBImpl.java diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/factories/impl/pb/RpcClientFactoryPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/factories/impl/pb/RpcClientFactoryPBImpl.java index 062fa66985f..07c5e23a101 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/factories/impl/pb/RpcClientFactoryPBImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/factories/impl/pb/RpcClientFactoryPBImpl.java @@ -45,7 +45,6 @@ public class RpcClientFactoryPBImpl implements RpcClientFactory { private static final String PB_IMPL_CLASS_SUFFIX = "PBClientImpl"; private static final RpcClientFactoryPBImpl self = new RpcClientFactoryPBImpl(); - private Configuration localConf = new Configuration(); private ConcurrentMap, Constructor> cache = new ConcurrentHashMap, Constructor>(); public static RpcClientFactoryPBImpl get() { @@ -62,7 +61,7 @@ public class RpcClientFactoryPBImpl implements RpcClientFactory { if (constructor == null) { Class pbClazz = null; try { - pbClazz = localConf.getClassByName(getPBImplClassName(protocol)); + pbClazz = conf.getClassByName(getPBImplClassName(protocol)); } catch (ClassNotFoundException e) { throw new YarnRuntimeException("Failed to load class: [" + getPBImplClassName(protocol) + "]", e); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/factories/impl/pb/RpcServerFactoryPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/factories/impl/pb/RpcServerFactoryPBImpl.java index 60e549ac04d..ec9a5f2d3f9 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/factories/impl/pb/RpcServerFactoryPBImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/factories/impl/pb/RpcServerFactoryPBImpl.java @@ -51,7 +51,6 @@ public class RpcServerFactoryPBImpl implements RpcServerFactory { private static final RpcServerFactoryPBImpl self = new RpcServerFactoryPBImpl(); - private Configuration localConf = new Configuration(); private ConcurrentMap, Constructor> serviceCache = new ConcurrentHashMap, Constructor>(); private ConcurrentMap, Method> protoCache = new ConcurrentHashMap, Method>(); @@ -80,7 +79,7 @@ public class RpcServerFactoryPBImpl implements RpcServerFactory { if (constructor == null) { Class pbServiceImplClazz = null; try { - pbServiceImplClazz = localConf + pbServiceImplClazz = conf .getClassByName(getPbServiceImplClassName(protocol)); } catch (ClassNotFoundException e) { throw new YarnRuntimeException("Failed to load class: [" @@ -113,7 +112,7 @@ public class RpcServerFactoryPBImpl implements RpcServerFactory { if (method == null) { Class protoClazz = null; try { - protoClazz = localConf.getClassByName(getProtoClassName(protocol)); + protoClazz = conf.getClassByName(getProtoClassName(protocol)); } catch (ClassNotFoundException e) { throw new YarnRuntimeException("Failed to load class: [" + getProtoClassName(protocol) + "]", e); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/factories/impl/pb/TestRpcClientFactoryPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/factories/impl/pb/TestRpcClientFactoryPBImpl.java new file mode 100644 index 00000000000..41febd3de7e --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/factories/impl/pb/TestRpcClientFactoryPBImpl.java @@ -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()); + } + +} \ No newline at end of file diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/factories/impl/pb/TestRpcServerFactoryPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/factories/impl/pb/TestRpcServerFactoryPBImpl.java new file mode 100644 index 00000000000..6a5ce840be5 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/factories/impl/pb/TestRpcServerFactoryPBImpl.java @@ -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()); + } +} \ No newline at end of file