This is an automated email from the ASF dual-hosted git repository. madhan pushed a commit to branch ranger-2.7 in repository https://gitbox.apache.org/repos/asf/ranger.git
The following commit(s) were added to refs/heads/ranger-2.7 by this push: new 59db73ae4 RANGER-3636: updated plugin classloader to use classloader of shim class as parent (#548) 59db73ae4 is described below commit 59db73ae477556acaba7eb61e12ec11867b18f16 Author: Madhan Neethiraj <mad...@apache.org> AuthorDate: Thu Jun 26 20:22:10 2025 +0530 RANGER-3636: updated plugin classloader to use classloader of shim class as parent (#548) (cherry picked from commit 787639a0183f7ddaacf1fbaa91d711584615cc2d) --- .../classloader/RangerPluginClassLoader.java | 221 ++++++++------------- 1 file changed, 86 insertions(+), 135 deletions(-) diff --git a/ranger-plugin-classloader/src/main/java/org/apache/ranger/plugin/classloader/RangerPluginClassLoader.java b/ranger-plugin-classloader/src/main/java/org/apache/ranger/plugin/classloader/RangerPluginClassLoader.java index 312356a82..3687162e1 100644 --- a/ranger-plugin-classloader/src/main/java/org/apache/ranger/plugin/classloader/RangerPluginClassLoader.java +++ b/ranger-plugin-classloader/src/main/java/org/apache/ranger/plugin/classloader/RangerPluginClassLoader.java @@ -19,6 +19,9 @@ package org.apache.ranger.plugin.classloader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.net.URL; import java.net.URLClassLoader; import java.security.AccessController; @@ -31,64 +34,52 @@ import java.util.List; import java.util.Map; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.script.ScriptEngine; -import javax.script.ScriptEngineFactory; -import javax.script.ScriptEngineManager; - public class RangerPluginClassLoader extends URLClassLoader { private static final Logger LOG = LoggerFactory.getLogger(RangerPluginClassLoader.class); private static final String TAG_SERVICE_TYPE = "tag"; - private static final Map<String, RangerPluginClassLoader> pluginClassLoaders = new HashMap<>(); + private static final Map<String, RangerPluginClassLoader> PLUGIN_CLASS_LOADERS = new HashMap<>(); - private final MyClassLoader componentClassLoader; + private final ComponentClassLoader componentClassLoader; private final ThreadLocal<ClassLoader> preActivateClassLoader = new ThreadLocal<>(); public RangerPluginClassLoader(String pluginType, Class<?> pluginClass ) throws Exception { super(RangerPluginClassLoaderUtil.getInstance().getPluginFilesForServiceTypeAndPluginclass(pluginType, pluginClass), null); - componentClassLoader = AccessController.doPrivileged( - (PrivilegedAction<MyClassLoader>) () -> new MyClassLoader(Thread.currentThread().getContextClassLoader()) - ); + componentClassLoader = AccessController.doPrivileged((PrivilegedAction<ComponentClassLoader>) () -> new ComponentClassLoader(pluginClass)); } public static RangerPluginClassLoader getInstance(final String pluginType, final Class<?> pluginClass ) throws Exception { - RangerPluginClassLoader ret = pluginClassLoaders.get(pluginType); + RangerPluginClassLoader ret = PLUGIN_CLASS_LOADERS.get(pluginType); if (ret == null) { synchronized(RangerPluginClassLoader.class) { - ret = pluginClassLoaders.get(pluginType); + ret = PLUGIN_CLASS_LOADERS.get(pluginType); if (ret == null) { if (pluginClass != null) { - ret = AccessController.doPrivileged( - (PrivilegedExceptionAction<RangerPluginClassLoader>) () -> new RangerPluginClassLoader(pluginType, pluginClass) - ); + ret = AccessController.doPrivileged((PrivilegedExceptionAction<RangerPluginClassLoader>) () -> new RangerPluginClassLoader(pluginType, pluginClass)); } else if (pluginType == null) { // let us pick an existing entry from pluginClassLoaders - if (!pluginClassLoaders.isEmpty()) { + if (!PLUGIN_CLASS_LOADERS.isEmpty()) { // to be predictable, sort the keys - List<String> pluginTypes = new ArrayList<>(pluginClassLoaders.keySet()); + List<String> pluginTypes = new ArrayList<>(PLUGIN_CLASS_LOADERS.keySet()); Collections.sort(pluginTypes); String pluginTypeToUse = pluginTypes.get(0); - ret = pluginClassLoaders.get(pluginTypeToUse); + ret = PLUGIN_CLASS_LOADERS.get(pluginTypeToUse); LOG.info("RangerPluginClassLoader.getInstance(pluginType=null): using classLoader for pluginType={}", pluginTypeToUse); } } if (ret != null) { - pluginClassLoaders.put(pluginType, ret); + PLUGIN_CLASS_LOADERS.put(pluginType, ret); if (pluginType != null && !pluginType.equals(TAG_SERVICE_TYPE)) { - pluginClassLoaders.put(TAG_SERVICE_TYPE, ret); + PLUGIN_CLASS_LOADERS.put(TAG_SERVICE_TYPE, ret); } } } @@ -100,97 +91,48 @@ public static RangerPluginClassLoader getInstance(final String pluginType, final @Override public Class<?> findClass(String name) throws ClassNotFoundException { - if (LOG.isDebugEnabled()) { - LOG.debug("==> RangerPluginClassLoader.findClass(" + name + ")"); - } + LOG.debug("==> RangerPluginClassLoader.findClass({})", name); Class<?> ret = null; try { // first we try to find a class inside the child classloader - if (LOG.isDebugEnabled()) { - LOG.debug("RangerPluginClassLoader.findClass(" + name + "): calling childClassLoader().findClass() "); - } + LOG.debug("RangerPluginClassLoader.findClass({}): calling childClassLoader().findClass() ", name); ret = super.findClass(name); } catch( Throwable e ) { // Use the Component ClassLoader findClass to load when childClassLoader fails to find - if (LOG.isDebugEnabled()) { - LOG.debug("RangerPluginClassLoader.findClass(" + name + "): calling componentClassLoader.findClass()"); - } + LOG.debug("RangerPluginClassLoader.findClass({}): calling componentClassLoader.findClass()", name); - MyClassLoader savedClassLoader = getComponentClassLoader(); + ComponentClassLoader savedClassLoader = getComponentClassLoader(); if (savedClassLoader != null) { ret = savedClassLoader.findClass(name); } } - if (LOG.isDebugEnabled()) { - LOG.debug("<== RangerPluginClassLoader.findClass(" + name + "): " + ret); - } - - return ret; - } - - @Override - public synchronized Class<?> loadClass(String name) throws ClassNotFoundException { - if (LOG.isDebugEnabled()) { - LOG.debug("==> RangerPluginClassLoader.loadClass(" + name + ")" ); - } - - Class<?> ret = null; - - try { - // first we try to load a class inside the child classloader - if (LOG.isDebugEnabled()) { - LOG.debug("RangerPluginClassLoader.loadClass(" + name + "): calling childClassLoader.findClass()"); - } - - ret = super.loadClass(name); - } catch(Throwable e) { - // Use the Component ClassLoader loadClass to load when childClassLoader fails to find - if (LOG.isDebugEnabled()) { - LOG.debug("RangerPluginClassLoader.loadClass(" + name + "): calling componentClassLoader.loadClass()"); - } - - MyClassLoader savedClassLoader = getComponentClassLoader(); - - if(savedClassLoader != null) { - ret = savedClassLoader.loadClass(name); - } - } - - if (LOG.isDebugEnabled()) { - LOG.debug("<== RangerPluginClassLoader.loadClass(" + name + "): " + ret); - } + LOG.debug("<== RangerPluginClassLoader.findClass({}): {}", name, ret); return ret; } @Override public URL findResource(String name) { - if (LOG.isDebugEnabled()) { - LOG.debug("==> RangerPluginClassLoader.findResource(" + name + ") "); - } + LOG.debug("==> RangerPluginClassLoader.findResource({}) ", name); URL ret = super.findResource(name); if (ret == null) { - if(LOG.isDebugEnabled()) { - LOG.debug("RangerPluginClassLoader.findResource(" + name + "): calling componentClassLoader.getResources()"); - } + LOG.debug("RangerPluginClassLoader.findResource({}): calling componentClassLoader.getResources()", name); - MyClassLoader savedClassLoader = getComponentClassLoader(); + ComponentClassLoader savedClassLoader = getComponentClassLoader(); if (savedClassLoader != null) { ret = savedClassLoader.getResource(name); } } - if (LOG.isDebugEnabled()) { - LOG.debug("<== RangerPluginClassLoader.findResource(" + name + "): " + ret); - } + LOG.debug("<== RangerPluginClassLoader.findResource({}): {}", name, ret); return ret; } @@ -199,16 +141,39 @@ public URL findResource(String name) { public Enumeration<URL> findResources(String name) { final Enumeration<URL> ret; - if (LOG.isDebugEnabled()) { - LOG.debug("==> RangerPluginClassLoader.findResources(" + name + ") "); - } + LOG.debug("==> RangerPluginClassLoader.findResources({}) ", name); ret = new MergeEnumeration(findResourcesUsingChildClassLoader(name),findResourcesUsingComponentClassLoader(name)); - if (LOG.isDebugEnabled()) { - LOG.debug("<== RangerPluginClassLoader.findResources(" + name + ") "); + LOG.debug("<== RangerPluginClassLoader.findResources({}) ", name); + + return ret; + } + + @Override + public synchronized Class<?> loadClass(String name) throws ClassNotFoundException { + LOG.debug("==> RangerPluginClassLoader.loadClass({})", name); + + Class<?> ret = null; + + try { + // first we try to load a class inside the child classloader + LOG.debug("RangerPluginClassLoader.loadClass({}): calling childClassLoader.findClass()", name); + + ret = super.loadClass(name); + } catch(Throwable e) { + // Use the Component ClassLoader loadClass to load when childClassLoader fails to find + LOG.debug("RangerPluginClassLoader.loadClass({}): calling componentClassLoader.loadClass()", name); + + ComponentClassLoader savedClassLoader = getComponentClassLoader(); + + if(savedClassLoader != null) { + ret = savedClassLoader.loadClass(name); + } } + LOG.debug("<== RangerPluginClassLoader.loadClass({}): {}", name, ret); + return ret; } @@ -216,16 +181,12 @@ public Enumeration<URL> findResourcesUsingChildClassLoader(String name) { Enumeration<URL> ret = null; try { - if (LOG.isDebugEnabled()) { - LOG.debug("RangerPluginClassLoader.findResourcesUsingChildClassLoader(" + name + "): calling childClassLoader.findResources()"); - } + LOG.debug("RangerPluginClassLoader.findResourcesUsingChildClassLoader({}): calling childClassLoader.findResources()", name); ret = super.findResources(name); } catch ( Throwable t) { //Ignore any exceptions. Null / Empty return is handle in following statements - if (LOG.isDebugEnabled()) { - LOG.debug("RangerPluginClassLoader.findResourcesUsingChildClassLoader(" + name + "): class not found in child. Falling back to componentClassLoader", t); - } + LOG.debug("RangerPluginClassLoader.findResourcesUsingChildClassLoader({}): class not found in child. Falling back to componentClassLoader", name, t); } return ret; @@ -235,32 +196,24 @@ public Enumeration<URL> findResourcesUsingComponentClassLoader(String name) { Enumeration<URL> ret = null; try { - if (LOG.isDebugEnabled()) { - LOG.debug("RangerPluginClassLoader.findResourcesUsingComponentClassLoader(" + name + "): calling componentClassLoader.getResources()"); - } + LOG.debug("RangerPluginClassLoader.findResourcesUsingComponentClassLoader({}): calling componentClassLoader.getResources()", name); - MyClassLoader savedClassLoader = getComponentClassLoader(); + ComponentClassLoader savedClassLoader = getComponentClassLoader(); if (savedClassLoader != null) { ret = savedClassLoader.getResources(name); } - if (LOG.isDebugEnabled()) { - LOG.debug("<== RangerPluginClassLoader.findResourcesUsingComponentClassLoader(" + name + "): " + ret); - } + LOG.debug("<== RangerPluginClassLoader.findResourcesUsingComponentClassLoader({}): {}", name, ret); } catch( Throwable t) { - if (LOG.isDebugEnabled()) { - LOG.debug("RangerPluginClassLoader.findResourcesUsingComponentClassLoader(" + name + "): class not found in componentClassLoader.", t); - } + LOG.debug("RangerPluginClassLoader.findResourcesUsingComponentClassLoader({}): class not found in componentClassLoader.", name, t); } return ret; } public void activate() { - if (LOG.isDebugEnabled()) { - LOG.debug("==> RangerPluginClassLoader.activate()"); - } + LOG.debug("==> RangerPluginClassLoader.activate()"); //componentClassLoader.set(new MyClassLoader(Thread.currentThread().getContextClassLoader())); @@ -268,22 +221,18 @@ public void activate() { Thread.currentThread().setContextClassLoader(this); - if (LOG.isDebugEnabled()) { - LOG.debug("<== RangerPluginClassLoader.activate()"); - } + LOG.debug("<== RangerPluginClassLoader.activate()"); } public void deactivate() { - if (LOG.isDebugEnabled()) { - LOG.debug("==> RangerPluginClassLoader.deactivate()"); - } + LOG.debug("==> RangerPluginClassLoader.deactivate()"); ClassLoader classLoader = preActivateClassLoader.get(); if (classLoader != null) { preActivateClassLoader.remove(); } else { - MyClassLoader savedClassLoader = getComponentClassLoader(); + ComponentClassLoader savedClassLoader = getComponentClassLoader(); if (savedClassLoader != null && savedClassLoader.getParent() != null) { classLoader = savedClassLoader.getParent(); @@ -296,25 +245,41 @@ public void deactivate() { LOG.warn("RangerPluginClassLoader.deactivate() was not successful. Couldn't get the saved classLoader..."); } - if (LOG.isDebugEnabled()) { - LOG.debug("<== RangerPluginClassLoader.deactivate()"); - } + LOG.debug("<== RangerPluginClassLoader.deactivate()"); + } + + public ClassLoader getPrevActiveClassLoader() { + ClassLoader ret = preActivateClassLoader.get(); + + if (ret == null) { + ComponentClassLoader savedClassLoader = getComponentClassLoader(); + + if (savedClassLoader != null && savedClassLoader.getParent() != null) { + ret = savedClassLoader.getParent(); + } + } + + return ret; } - private MyClassLoader getComponentClassLoader() { + private ComponentClassLoader getComponentClassLoader() { return componentClassLoader; //return componentClassLoader.get(); } - static class MyClassLoader extends ClassLoader { - public MyClassLoader(ClassLoader realClassLoader) { - super(realClassLoader); + static class ComponentClassLoader extends ClassLoader { + public ComponentClassLoader(Class<?> pluginShimClass) { + super(getClassLoaderOfShimClassOrCurrentThread(pluginShimClass)); } @Override public Class<?> findClass(String name) throws ClassNotFoundException { //NO PMD return super.findClass(name); } + + private static ClassLoader getClassLoaderOfShimClassOrCurrentThread(Class<?> pluginShimClass) { + return pluginShimClass != null ? pluginShimClass.getClassLoader() : Thread.currentThread().getContextClassLoader(); + } } static class MergeEnumeration implements Enumeration<URL> { //NO PMD @@ -335,9 +300,9 @@ public boolean hasMoreElements() { public URL nextElement() { final URL ret; - if (e1 != null && e1.hasMoreElements()) + if (e1 != null && e1.hasMoreElements()) { ret = e1.nextElement(); - else if ( e2 != null && e2.hasMoreElements() ) { + } else if ( e2 != null && e2.hasMoreElements() ) { ret = e2.nextElement(); } else { ret = null; @@ -346,18 +311,4 @@ else if ( e2 != null && e2.hasMoreElements() ) { return ret; } } - - public ClassLoader getPrevActiveClassLoader() { - ClassLoader ret = preActivateClassLoader.get(); - - if (ret == null) { - MyClassLoader savedClassLoader = getComponentClassLoader(); - - if (savedClassLoader != null && savedClassLoader.getParent() != null) { - ret = savedClassLoader.getParent(); - } - } - - return ret; - } }