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

houston pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/branch_9x by this push:
     new 631b42fe25d SOLR-16240: Fix kerberosPlugin module classloading (#1546)
631b42fe25d is described below

commit 631b42fe25d2da5fd2329ed71f8747b3b5a44a26
Author: Houston Putman <[email protected]>
AuthorDate: Mon Apr 10 13:06:26 2023 -0400

    SOLR-16240: Fix kerberosPlugin module classloading (#1546)
    
    Also added an integration test for the hadoop-auth module.
    
    (cherry picked from commit d9eba437064f20eb5a9b0edeaa050c2874578c66)
---
 solr/CHANGES.txt                                   |  5 ++++-
 .../java/org/apache/solr/core/CoreContainer.java   |  6 ++++++
 .../solr/security/hadoop/KerberosPlugin.java       |  2 +-
 solr/packaging/test/test_modules.bats              | 23 +++++++++++++++++++++-
 solr/packaging/test/test_placement_plugin.bats     |  4 ++--
 5 files changed, 35 insertions(+), 5 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 2b97f9ad84f..cde20f8bbfe 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -68,7 +68,10 @@ Bug Fixes
 * SOLR-16728: Fix Classloading Exception for inter-node requests when using 
SSL and HTTP2.
   All Jetty classes are able to be shared between the Jetty server and webApp 
now. (Houston Putman)
 
-* NPE in QueryResultKey when running clustering search query in some cases.  
(Roman Kagan, Christine Poerschke via Eric Pugh)
+* SOLR-9775: NPE in QueryResultKey when running clustering search query in 
some cases.  (Roman Kagan, Christine Poerschke via Eric Pugh)
+
+* SOLR-16240: Fix KerberosPlugin module classloading when using the 
hadoop-auth module.
+  Plugins in modules/packages that require the Thread contextClassLoader on 
startup should now work. (Houston Putman)
 
 Dependency Upgrades
 ---------------------
diff --git a/solr/core/src/java/org/apache/solr/core/CoreContainer.java 
b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
index 65cc33b8539..f13fd275349 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@@ -101,6 +101,7 @@ import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.common.util.ObjectCache;
 import org.apache.solr.common.util.SolrNamedThreadFactory;
 import org.apache.solr.common.util.StrUtils;
+import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.DirectoryFactory.DirContext;
 import org.apache.solr.core.backup.repository.BackupRepository;
@@ -742,10 +743,15 @@ public class CoreContainer {
   // -------------------------------------------------------------------
 
   /** Load the cores defined for this CoreContainer */
+  @SuppressForbidden(
+      reason =
+          "Set the thread contextClassLoader for all 3rd party dependencies 
that we cannot control")
   public void load() {
     if (log.isDebugEnabled()) {
       log.debug("Loading cores into CoreContainer [instanceDir={}]", 
getSolrHome());
     }
+    // Set the thread's contextClassLoader for any plugins that are loaded via 
Modules or Packages
+    Thread.currentThread().setContextClassLoader(loader.getClassLoader());
 
     logging = LogWatcher.newRegisteredLogWatcher(cfg.getLogWatcherConfig(), 
loader);
 
diff --git 
a/solr/modules/hadoop-auth/src/java/org/apache/solr/security/hadoop/KerberosPlugin.java
 
b/solr/modules/hadoop-auth/src/java/org/apache/solr/security/hadoop/KerberosPlugin.java
index 1bbdd3ae524..34729db1f1d 100644
--- 
a/solr/modules/hadoop-auth/src/java/org/apache/solr/security/hadoop/KerberosPlugin.java
+++ 
b/solr/modules/hadoop-auth/src/java/org/apache/solr/security/hadoop/KerberosPlugin.java
@@ -98,7 +98,7 @@ public class KerberosPlugin extends AuthenticationPlugin 
implements HttpClientBu
       kerberosFilter.init(conf);
     } catch (ServletException e) {
       throw new SolrException(
-          ErrorCode.SERVER_ERROR, "Error initializing kerberos authentication 
plugin: " + e);
+          ErrorCode.SERVER_ERROR, "Error initializing kerberos authentication 
plugin", e);
     }
   }
 
diff --git a/solr/packaging/test/test_modules.bats 
b/solr/packaging/test/test_modules.bats
index c261aef4dfe..ff6d88c8041 100644
--- a/solr/packaging/test/test_modules.bats
+++ b/solr/packaging/test/test_modules.bats
@@ -26,7 +26,7 @@ teardown() {
   save_home_on_failure
 
   delete_all_collections
-  solr stop -all >/dev/null 2>&1
+  SOLR_STOP_WAIT=1 solr stop -all >/dev/null 2>&1
 }
 
 @test "SQL Module" {
@@ -39,6 +39,27 @@ teardown() {
   refute_output --partial '"EXCEPTION"'
 }
 
+@test "Hadoop-Auth Module: KerberosPlugin Classloading" {
+  # Write a security.json that uses the KerberosPlugin
+  local security_json="${BATS_TEST_TMPDIR}/kerberos-security.json"
+  echo '{"authentication": {"class": "solr.KerberosPlugin"}}' > 
"${security_json}"
+
+  # Start Solr
+  export SOLR_MODULES=hadoop-auth
+  solr start -c \
+    -Dsolr.kerberos.principal=test \
+    -Dsolr.kerberos.keytab=test \
+    -Dsolr.kerberos.cookie.domain=test
+
+  # Upload the custom security.json and wait for Solr to try to load it
+  solr zk cp "${security_json}" zk:security.json -z localhost:9983
+  sleep 1
+
+  run cat "${SOLR_LOGS_DIR}/solr.log"
+  assert_output --partial "Initializing authentication plugin: 
solr.KerberosPlugin"
+  refute_output --partial "java.lang.ClassNotFoundException"
+}
+
 @test "icu collation in analysis-extras module" {
   run solr start -c -Dsolr.modules=analysis-extras
   run solr create_collection -c COLL_NAME -d test/analysis_extras_config/conf
diff --git a/solr/packaging/test/test_placement_plugin.bats 
b/solr/packaging/test/test_placement_plugin.bats
index 5828f1aa3c9..4db7a28fae7 100644
--- a/solr/packaging/test/test_placement_plugin.bats
+++ b/solr/packaging/test/test_placement_plugin.bats
@@ -34,7 +34,7 @@ teardown() {
   solr assert -c http://localhost:8983/solr -t 3000
   run solr create_collection -c COLL_NAME
   collection_exists COLL_NAME
-  assert_file_contains ${SOLR_LOGS_DIR}/solr.log 'Default replica placement 
plugin set in solr\.placementplugin\.default to affinity'
+  assert_file_contains "${SOLR_LOGS_DIR}/solr.log" 'Default replica placement 
plugin set in solr\.placementplugin\.default to affinity'
 }
 
 @test "Affinity placement plugin using ENV" {
@@ -43,5 +43,5 @@ teardown() {
   solr assert -c http://localhost:8983/solr -t 3000
   run solr create_collection -c COLL_NAME
   collection_exists COLL_NAME
-  assert_file_contains ${SOLR_LOGS_DIR}/solr.log 'Default replica placement 
plugin set in solr\.placementplugin\.default to random'
+  assert_file_contains "${SOLR_LOGS_DIR}/solr.log" 'Default replica placement 
plugin set in solr\.placementplugin\.default to random'
 }

Reply via email to