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

gerlowskija 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 fc45f5e8406 SOLR-17939: Give all ZK-plugins to SolrZkClient (#3720)
fc45f5e8406 is described below

commit fc45f5e8406750ee7c3a3498c23f6dade5dacdd2
Author: Jason Gerlowski <[email protected]>
AuthorDate: Thu Oct 2 11:47:13 2025 -0400

    SOLR-17939: Give all ZK-plugins to SolrZkClient (#3720)
    
    Prior to this commit ZkController creates a ZkAclProvider,
    ZkCredentialsProvider, and ZkCredentialsInjector for its SolrZkClient to
    use, but then only passes along the ZkAclProvider.
    
    This commit tweaks the SolrZkClient creation code to pass the
    created ZkCredentialsProvider as well.
---
 solr/CHANGES.txt                                   |  2 +
 .../java/org/apache/solr/cloud/ZkController.java   | 54 +++++++++++-----------
 2 files changed, 30 insertions(+), 26 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index d47d93b2d0a..282a74d31f4 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -326,6 +326,8 @@ Bug Fixes
 
 * SOLR-17883: SolrCLI tools such as "bin/solr zk" can now access jars located 
in `<install_dir>/lib`.
 
+* SOLR-17939: Solr now uses correct resource-loader to load 
ZkCredentialsProvider/ZkCredentialsInjector, preventing errant 
ClassNotFoundExceptions (Jason Gerlowski)
+
 Dependency Upgrades
 ---------------------
 (No changes)
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkController.java 
b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
index 688ce428501..d12732b123f 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@ -27,6 +27,7 @@ import static 
org.apache.solr.common.cloud.ZkStateReader.UNSUPPORTED_SOLR_XML;
 import static 
org.apache.solr.common.params.CollectionParams.CollectionAction.ADDROLE;
 import static org.apache.zookeeper.ZooDefs.Ids.OPEN_ACL_UNSAFE;
 
+import io.opentelemetry.api.internal.StringUtils;
 import java.io.Closeable;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
@@ -310,38 +311,29 @@ public class ZkController implements Closeable {
     MDCLoggingContext.setNode(nodeName);
     this.leaderVoteWait = cloudConfig.getLeaderVoteWait();
     this.leaderConflictResolveWait = 
cloudConfig.getLeaderConflictResolveWait();
-
-    String zkCredentialsInjectorClass = 
cloudConfig.getZkCredentialsInjectorClass();
-    ZkCredentialsInjector zkCredentialsInjector =
-        StrUtils.isNullOrEmpty(zkCredentialsInjectorClass)
-            ? new DefaultZkCredentialsInjector()
-            : cc.getResourceLoader()
-                .newInstance(zkCredentialsInjectorClass, 
ZkCredentialsInjector.class);
-
     this.clientTimeout = cloudConfig.getZkClientTimeout();
 
-    String zkACLProviderClass = cloudConfig.getZkACLProviderClass();
-    ZkACLProvider zkACLProvider =
-        StrUtils.isNullOrEmpty(zkACLProviderClass)
-            ? new DefaultZkACLProvider()
-            : cc.getResourceLoader().newInstance(zkACLProviderClass, 
ZkACLProvider.class);
+    final var zkCredentialsInjector =
+        loadPluginOrDefault(
+            ZkCredentialsInjector.class,
+            cloudConfig.getZkCredentialsInjectorClass(),
+            new DefaultZkCredentialsInjector());
+    final var zkACLProvider =
+        loadPluginOrDefault(
+            ZkACLProvider.class, cloudConfig.getZkACLProviderClass(), new 
DefaultZkACLProvider());
     zkACLProvider.setZkCredentialsInjector(zkCredentialsInjector);
-
-    String zkCredentialsProviderClass = 
cloudConfig.getZkCredentialsProviderClass();
-    ZkCredentialsProvider zkCredentialsProvider =
-        StrUtils.isNullOrEmpty(zkCredentialsProviderClass)
-            ? new DefaultZkCredentialsProvider()
-            : cc.getResourceLoader()
-                .newInstance(zkCredentialsProviderClass, 
ZkCredentialsProvider.class);
-
+    final var zkCredentialsProvider =
+        loadPluginOrDefault(
+            ZkCredentialsProvider.class,
+            cloudConfig.getZkCredentialsProviderClass(),
+            new DefaultZkCredentialsProvider());
     zkCredentialsProvider.setZkCredentialsInjector(zkCredentialsInjector);
+
     addOnReconnectListener(getConfigDirListener());
 
-    String stateCompressionProviderClass = 
cloudConfig.getStateCompressorClass();
-    Compressor compressor =
-        StrUtils.isNullOrEmpty(stateCompressionProviderClass)
-            ? new ZLibCompressor()
-            : 
cc.getResourceLoader().newInstance(stateCompressionProviderClass, 
Compressor.class);
+    final var compressor =
+        loadPluginOrDefault(
+            Compressor.class, cloudConfig.getStateCompressorClass(), new 
ZLibCompressor());
 
     zkClient =
         new SolrZkClient.Builder()
@@ -349,6 +341,7 @@ public class ZkController implements Closeable {
             .withTimeout(clientTimeout, TimeUnit.MILLISECONDS)
             .withConnTimeOut(zkClientConnectTimeout, TimeUnit.MILLISECONDS)
             .withAclProvider(zkACLProvider)
+            .withZkCredentialsProvider(zkCredentialsProvider)
             .withClosedCheck(cc::isShutDown)
             .withCompressor(compressor)
             .build();
@@ -440,6 +433,15 @@ public class ZkController implements Closeable {
     }
   }
 
+  private <T> T loadPluginOrDefault(
+      Class<T> basePluginType, String concretePluginClassName, T 
defaultPluginInstance) {
+    if (StringUtils.isNullOrEmpty(concretePluginClassName)) {
+      return defaultPluginInstance;
+    }
+
+    return cc.getResourceLoader().newInstance(concretePluginClassName, 
basePluginType);
+  }
+
   private void onReconnect() {
     // on reconnect, reload cloud info
     log.info("ZooKeeper session re-connected ... refreshing core states after 
session expiration.");

Reply via email to