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 <[email protected]>
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;
- }
}