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();
 

Reply via email to