This is an automated email from the ASF dual-hosted git repository.
houston pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/main by this push:
new d9eba437064 SOLR-16240: Fix kerberosPlugin module classloading (#1546)
d9eba437064 is described below
commit d9eba437064f20eb5a9b0edeaa050c2874578c66
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.
---
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 c94deb9251f..ec75b887948 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -108,7 +108,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'
}