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.");