You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by ma...@apache.org on 2022/07/22 02:17:26 UTC

[atlas] branch master updated: ATLAS-4642: replace use of static volatile member from plugin classloader

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 <ma...@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();