This is an automated email from the ASF dual-hosted git repository. madhan pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/atlas.git
The following commit(s) were added to refs/heads/master by this push: new 218dd81db ATLAS-4642: replace use of static volatile member from plugin classloader 218dd81db is described below commit 218dd81db9f3ea87f75833bee6acee1c70e2b1df Author: Madhan Neethiraj <mad...@apache.org> AuthorDate: Tue Feb 22 23:13:51 2022 -0800 ATLAS-4642: replace use of static volatile member from plugin classloader --- .../plugin/classloader/AtlasPluginClassLoader.java | 36 ++++++++++++++-------- .../classloader/AtlasPluginClassLoaderUtil.java | 10 +++--- .../classloader/AtlasPluginClassLoaderTest.java | 2 +- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/plugin-classloader/src/main/java/org/apache/atlas/plugin/classloader/AtlasPluginClassLoader.java b/plugin-classloader/src/main/java/org/apache/atlas/plugin/classloader/AtlasPluginClassLoader.java index fc75a7ebc..0a71bf160 100644 --- a/plugin-classloader/src/main/java/org/apache/atlas/plugin/classloader/AtlasPluginClassLoader.java +++ b/plugin-classloader/src/main/java/org/apache/atlas/plugin/classloader/AtlasPluginClassLoader.java @@ -30,6 +30,8 @@ import java.security.PrivilegedAction; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; /** * AtlasPluginClassLoader to use plugin classpath first, before component classpath. @@ -37,39 +39,43 @@ import java.util.Enumeration; public final class AtlasPluginClassLoader extends URLClassLoader { private static final Logger LOG = LoggerFactory.getLogger(AtlasPluginClassLoader.class); - private static volatile AtlasPluginClassLoader me = null; + private static final Map<String, AtlasPluginClassLoader> pluginClassLoaders = new HashMap<>(); private final ThreadLocal<ClassLoader> preActivateClassLoader = new ThreadLocal<>(); - - private final MyClassLoader componentClassLoader; + private final MyClassLoader componentClassLoader; private AtlasPluginClassLoader(String pluginType, Class<?> pluginClass) throws URISyntaxException { - this(AtlasPluginClassLoaderUtil.getPluginImplLibPath(pluginType, pluginClass)); + this(AtlasPluginClassLoaderUtil.getPluginImplLibPath(pluginType, pluginClass), pluginClass); } //visible for testing - AtlasPluginClassLoader(String libraryPath) { - super(AtlasPluginClassLoaderUtil.getFilesInDirectories(new String[]{libraryPath}), null); + AtlasPluginClassLoader(String[] libraryPath, Class<?> pluginShimClass) { + super(AtlasPluginClassLoaderUtil.getFilesInDirectories(libraryPath), null); componentClassLoader = AccessController.doPrivileged(new PrivilegedAction<MyClassLoader>() { public MyClassLoader run() { - return new MyClassLoader(Thread.currentThread().getContextClassLoader()); + return new MyClassLoader(pluginShimClass); } }); } public static AtlasPluginClassLoader getInstance(final String pluginType, final Class<?> pluginClass) throws PrivilegedActionException { - AtlasPluginClassLoader ret = me; + AtlasPluginClassLoader ret = pluginClassLoaders.get(pluginType); + if (ret == null) { synchronized (AtlasPluginClassLoader.class) { - ret = me; + ret = pluginClassLoaders.get(pluginType); + if (ret == null) { - me = AccessController.doPrivileged(new PrivilegedExceptionAction<AtlasPluginClassLoader>() { + ret = AccessController.doPrivileged(new PrivilegedExceptionAction<AtlasPluginClassLoader>() { public AtlasPluginClassLoader run() throws URISyntaxException { return new AtlasPluginClassLoader(pluginType, pluginClass); } }); - ret = me; + + if (ret != null) { + pluginClassLoaders.put(pluginType, ret); + } } } } @@ -332,13 +338,17 @@ public final class AtlasPluginClassLoader extends URLClassLoader { } static class MyClassLoader extends ClassLoader { - public MyClassLoader(ClassLoader realClassLoader) { - super(realClassLoader); + public MyClassLoader(Class<?> pluginShimClass) { + super(getParentClassLoaderToUse(pluginShimClass)); } @Override public Class<?> findClass(String name) throws ClassNotFoundException { //NOPMD return super.findClass(name); } + + private static ClassLoader getParentClassLoaderToUse(Class<?> pluginShimClass) { + return pluginShimClass != null ? pluginShimClass.getClassLoader() : Thread.currentThread().getContextClassLoader(); + } } } diff --git a/plugin-classloader/src/main/java/org/apache/atlas/plugin/classloader/AtlasPluginClassLoaderUtil.java b/plugin-classloader/src/main/java/org/apache/atlas/plugin/classloader/AtlasPluginClassLoaderUtil.java index f44603b84..e6f868be7 100644 --- a/plugin-classloader/src/main/java/org/apache/atlas/plugin/classloader/AtlasPluginClassLoaderUtil.java +++ b/plugin-classloader/src/main/java/org/apache/atlas/plugin/classloader/AtlasPluginClassLoaderUtil.java @@ -96,19 +96,19 @@ final class AtlasPluginClassLoaderUtil { } } - public static String getPluginImplLibPath(String pluginType, Class<?> pluginClass) throws URISyntaxException { + public static String[] getPluginImplLibPath(String pluginType, Class<?> pluginClass) throws URISyntaxException { if (LOG.isDebugEnabled()) { LOG.debug("==> AtlasPluginClassLoaderUtil.getPluginImplLibPath for Class ({})", pluginClass.getName()); } - URI uri = pluginClass.getProtectionDomain().getCodeSource().getLocation().toURI(); - Path path = Paths.get(URI.create(uri.toString())); - String ret = path.getParent().toString() + File.separatorChar + ATLAS_PLUGIN_LIBDIR.replaceAll("%", pluginType); + URI uri = pluginClass.getProtectionDomain().getCodeSource().getLocation().toURI(); + Path path = Paths.get(URI.create(uri.toString())); + String ret = path.getParent().toString() + File.separatorChar + ATLAS_PLUGIN_LIBDIR.replaceAll("%", pluginType); if (LOG.isDebugEnabled()) { LOG.debug("<== AtlasPluginClassLoaderUtil.getPluginImplLibPath for Class {}): {})", pluginClass.getName(), ret); } - return ret; + return new String[] { ret }; } } diff --git a/plugin-classloader/src/test/java/org/apache/atlas/plugin/classloader/AtlasPluginClassLoaderTest.java b/plugin-classloader/src/test/java/org/apache/atlas/plugin/classloader/AtlasPluginClassLoaderTest.java index 6139a0032..e12584f92 100644 --- a/plugin-classloader/src/test/java/org/apache/atlas/plugin/classloader/AtlasPluginClassLoaderTest.java +++ b/plugin-classloader/src/test/java/org/apache/atlas/plugin/classloader/AtlasPluginClassLoaderTest.java @@ -34,7 +34,7 @@ public class AtlasPluginClassLoaderTest { //expected } - AtlasPluginClassLoader classLoader = new AtlasPluginClassLoader("../common/target"); + AtlasPluginClassLoader classLoader = new AtlasPluginClassLoader(new String[]{ "../common/target" }, this.getClass()); classLoader.activate();