You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by if...@apache.org on 2020/04/16 11:10:11 UTC

[cassandra-in-jvm-dtest-api] 04/04: Make shared class filter for InstanceClassLoader pluggable

This is an automated email from the ASF dual-hosted git repository.

ifesdjeen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cassandra-in-jvm-dtest-api.git

commit d59833f2223a85a4dc3f4ea597384588d5d008df
Author: David Capwell <dc...@gmail.com>
AuthorDate: Fri Apr 10 15:27:56 2020 -0700

    Make shared class filter for InstanceClassLoader pluggable
    
    Patch by David Capwell; reviewed by Jon Meredith and Alex Petrov for CASSANDRA-15713.
---
 CHANGELOG.txt                                      |  3 +-
 .../distributed/shared/InstanceClassLoader.java    | 41 ++++++++++++++--------
 2 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index bb3d907..86a9490 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,3 +1,4 @@
 # 0.0.2
 
-CASSANDRA-15684: improve error codes in NodeToolResult to produce better errors and to allow Any style message checks
+CASSANDRA-15684: Improve error codes in NodeToolResult to produce better errors and to allow Any style message checks
+CASSANDRA-15713: Make shared class filter for InstanceClassLoader pluggable
diff --git a/src/main/java/org/apache/cassandra/distributed/shared/InstanceClassLoader.java b/src/main/java/org/apache/cassandra/distributed/shared/InstanceClassLoader.java
index 4f2fc8a..51cd14a 100644
--- a/src/main/java/org/apache/cassandra/distributed/shared/InstanceClassLoader.java
+++ b/src/main/java/org/apache/cassandra/distributed/shared/InstanceClassLoader.java
@@ -26,33 +26,46 @@ import java.util.function.Predicate;
 
 public class InstanceClassLoader extends URLClassLoader
 {
-    private static final Predicate<String> sharePackage = name ->
-                                                          name.startsWith("org.apache.cassandra.distributed.api.")
-                                                          || name.startsWith("org.apache.cassandra.distributed.shared.")
-                                                          || name.startsWith("sun.")
-                                                          || name.startsWith("oracle.")
-                                                          || name.startsWith("com.intellij.")
-                                                          || name.startsWith("com.sun.")
-                                                          || name.startsWith("com.oracle.")
-                                                          || name.startsWith("java.")
-                                                          || name.startsWith("javax.")
-                                                          || name.startsWith("jdk.")
-                                                          || name.startsWith("netscape.")
-                                                          || name.startsWith("org.xml.sax.");
+    private static final Predicate<String> DEFAULT_SHARED_PACKAGES =
+              name ->
+              name.startsWith("org.apache.cassandra.distributed.api.")
+              || name.startsWith("org.apache.cassandra.distributed.shared.")
+              || name.startsWith("sun.")
+              || name.startsWith("oracle.")
+              || name.startsWith("com.intellij.")
+              || name.startsWith("com.sun.")
+              || name.startsWith("com.oracle.")
+              || name.startsWith("java.")
+              || name.startsWith("javax.")
+              || name.startsWith("jdk.")
+              || name.startsWith("netscape.")
+              || name.startsWith("org.xml.sax.");
 
     private volatile boolean isClosed = false;
     private final URL[] urls;
     private final int generation; // used to help debug class loader leaks, by helping determine which classloaders should have been collected
     private final int id;
     private final ClassLoader sharedClassLoader;
+    private final Predicate<String> loadShared;
 
     public InstanceClassLoader(int generation, int id, URL[] urls, ClassLoader sharedClassLoader)
     {
+        this(generation, id, urls, sharedClassLoader, DEFAULT_SHARED_PACKAGES);
+    }
+
+    public InstanceClassLoader(int generation, int id, URL[] urls, ClassLoader sharedClassLoader, Predicate<String> loadShared)
+    {
         super(urls, null);
         this.urls = urls;
         this.sharedClassLoader = sharedClassLoader;
         this.generation = generation;
         this.id = id;
+        this.loadShared = loadShared == null ? DEFAULT_SHARED_PACKAGES : loadShared;
+    }
+
+    public static Predicate<String> getDefaultLoadSharedFilter()
+    {
+        return DEFAULT_SHARED_PACKAGES;
     }
 
     public int getClusterGeneration()
@@ -68,7 +81,7 @@ public class InstanceClassLoader extends URLClassLoader
     @Override
     public Class<?> loadClass(String name) throws ClassNotFoundException
     {
-        if (sharePackage.test(name))
+        if (loadShared.test(name))
             return sharedClassLoader.loadClass(name);
 
         return loadClassInternal(name);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org