You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by st...@apache.org on 2023/08/11 22:15:25 UTC
[solr] branch main updated: SOLR-14667 Make zkClientTimeout consistent and based on a system property (#1831)
This is an automated email from the ASF dual-hosted git repository.
stillalex 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 8724b1d0936 SOLR-14667 Make zkClientTimeout consistent and based on a system property (#1831)
8724b1d0936 is described below
commit 8724b1d093633d0363b256384cfa75a9e5197f80
Author: Alex D <st...@apache.org>
AuthorDate: Fri Aug 11 15:15:19 2023 -0700
SOLR-14667 Make zkClientTimeout consistent and based on a system property (#1831)
---
solr/CHANGES.txt | 2 +
.../src/java/org/apache/solr/cli/AuthTool.java | 13 +++--
.../org/apache/solr/cli/ConfigSetDownloadTool.java | 3 +-
.../org/apache/solr/cli/ConfigSetUploadTool.java | 3 +-
.../src/java/org/apache/solr/cli/ZkCpTool.java | 3 +-
.../src/java/org/apache/solr/cli/ZkLsTool.java | 3 +-
.../src/java/org/apache/solr/cli/ZkMkrootTool.java | 3 +-
.../src/java/org/apache/solr/cli/ZkMvTool.java | 3 +-
.../src/java/org/apache/solr/cli/ZkRmTool.java | 3 +-
.../core/src/java/org/apache/solr/cloud/ZkCLI.java | 6 +-
.../java/org/apache/solr/cloud/ZkController.java | 13 ++---
.../src/java/org/apache/solr/core/CloudConfig.java | 4 +-
.../src/java/org/apache/solr/core/ZkContainer.java | 3 +-
.../apache/solr/packagemanager/PackageManager.java | 3 +-
.../solr/schema/ManagedIndexSchemaFactory.java | 2 +-
.../solrj/impl/ZkClientClusterStateProvider.java | 10 +++-
.../org/apache/solr/common/cloud/SolrZkClient.java | 27 ++++++---
.../client/solrj/impl/CloudHttp2SolrClient.java | 66 ++++++++++++----------
.../client/solrj/impl/CloudLegacySolrClient.java | 61 +++++++++++---------
.../client/solrj/impl/SolrZkClientTimeout.java | 29 ++++++++++
.../src/java/org/apache/solr/util/TestHarness.java | 3 +-
21 files changed, 168 insertions(+), 95 deletions(-)
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index e961fdfa2ec..9951772eecc 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -89,6 +89,8 @@ Improvements
circumstances as they are generated and more likely to remain up-to-date with future API changes.
(Jason Gerlowski, David Smiley, Houston Putman)
+* SOLR-14667: Make zkClientTimeout consistent and based on a system property. The defauls values are stored in a single place referenced everywhere and they are based on system properties (Alex Deparvu)
+
Optimizations
---------------------
diff --git a/solr/core/src/java/org/apache/solr/cli/AuthTool.java b/solr/core/src/java/org/apache/solr/cli/AuthTool.java
index a502fa77cef..318f9feaced 100644
--- a/solr/core/src/java/org/apache/solr/cli/AuthTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/AuthTool.java
@@ -34,6 +34,7 @@ import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.lucene.util.Constants;
+import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
import org.apache.solr.common.cloud.SolrZkClient;
import org.apache.solr.common.util.StrUtils;
import org.apache.solr.security.Sha256AuthenticationProvider;
@@ -187,7 +188,8 @@ public class AuthTool extends ToolBase {
try (SolrZkClient zkClient =
new SolrZkClient.Builder()
.withUrl(zkHost)
- .withTimeout(10000, TimeUnit.MILLISECONDS)
+ .withTimeout(
+ SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, TimeUnit.MILLISECONDS)
.build()) {
checkSecurityJsonExists(zkClient);
} catch (Exception ex) {
@@ -206,7 +208,8 @@ public class AuthTool extends ToolBase {
try (SolrZkClient zkClient =
new SolrZkClient.Builder()
.withUrl(zkHost)
- .withTimeout(10000, TimeUnit.MILLISECONDS)
+ .withTimeout(
+ SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, TimeUnit.MILLISECONDS)
.build()) {
zkClient.setData(
"/security.json", securityJson.getBytes(StandardCharsets.UTF_8), true);
@@ -321,7 +324,7 @@ public class AuthTool extends ToolBase {
try (SolrZkClient zkClient =
new SolrZkClient.Builder()
.withUrl(zkHost)
- .withTimeout(10000, TimeUnit.MILLISECONDS)
+ .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, TimeUnit.MILLISECONDS)
.build()) {
checkSecurityJsonExists(zkClient);
}
@@ -384,7 +387,7 @@ public class AuthTool extends ToolBase {
try (SolrZkClient zkClient =
new SolrZkClient.Builder()
.withUrl(zkHost)
- .withTimeout(10000, TimeUnit.MILLISECONDS)
+ .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, TimeUnit.MILLISECONDS)
.build()) {
zkClient.setData("/security.json", securityJson.getBytes(StandardCharsets.UTF_8), true);
}
@@ -479,7 +482,7 @@ public class AuthTool extends ToolBase {
try (SolrZkClient zkClient =
new SolrZkClient.Builder()
.withUrl(zkHost)
- .withTimeout(10000, TimeUnit.MILLISECONDS)
+ .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, TimeUnit.MILLISECONDS)
.build()) {
zkClient.setData("/security.json", "{}".getBytes(StandardCharsets.UTF_8), true);
}
diff --git a/solr/core/src/java/org/apache/solr/cli/ConfigSetDownloadTool.java b/solr/core/src/java/org/apache/solr/cli/ConfigSetDownloadTool.java
index 8603af39513..c11e0e70a79 100644
--- a/solr/core/src/java/org/apache/solr/cli/ConfigSetDownloadTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/ConfigSetDownloadTool.java
@@ -25,6 +25,7 @@ import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
+import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
import org.apache.solr.common.cloud.SolrZkClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -79,7 +80,7 @@ public class ConfigSetDownloadTool extends ToolBase {
try (SolrZkClient zkClient =
new SolrZkClient.Builder()
.withUrl(zkHost)
- .withTimeout(30000, TimeUnit.MILLISECONDS)
+ .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, TimeUnit.MILLISECONDS)
.build()) {
echoIfVerbose("\nConnecting to ZooKeeper at " + zkHost + " ...", cli);
String confName = cli.getOptionValue("confname");
diff --git a/solr/core/src/java/org/apache/solr/cli/ConfigSetUploadTool.java b/solr/core/src/java/org/apache/solr/cli/ConfigSetUploadTool.java
index a36370784dd..5fd4a538bd7 100644
--- a/solr/core/src/java/org/apache/solr/cli/ConfigSetUploadTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/ConfigSetUploadTool.java
@@ -23,6 +23,7 @@ import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
+import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
import org.apache.solr.common.cloud.SolrZkClient;
import org.apache.solr.common.cloud.ZkMaintenanceUtils;
import org.apache.solr.core.ConfigSetService;
@@ -86,7 +87,7 @@ public class ConfigSetUploadTool extends ToolBase {
try (SolrZkClient zkClient =
new SolrZkClient.Builder()
.withUrl(zkHost)
- .withTimeout(30000, TimeUnit.MILLISECONDS)
+ .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, TimeUnit.MILLISECONDS)
.build()) {
echoIfVerbose("\nConnecting to ZooKeeper at " + zkHost + " ...", cli);
Path confPath =
diff --git a/solr/core/src/java/org/apache/solr/cli/ZkCpTool.java b/solr/core/src/java/org/apache/solr/cli/ZkCpTool.java
index 571db1351c2..02379d5748a 100644
--- a/solr/core/src/java/org/apache/solr/cli/ZkCpTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/ZkCpTool.java
@@ -23,6 +23,7 @@ import java.util.Locale;
import java.util.concurrent.TimeUnit;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
+import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
import org.apache.solr.common.cloud.SolrZkClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -78,7 +79,7 @@ public class ZkCpTool extends ToolBase {
try (SolrZkClient zkClient =
new SolrZkClient.Builder()
.withUrl(zkHost)
- .withTimeout(30000, TimeUnit.MILLISECONDS)
+ .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, TimeUnit.MILLISECONDS)
.build()) {
echoIfVerbose("\nConnecting to ZooKeeper at " + zkHost + " ...", cli);
String src = cli.getOptionValue("src");
diff --git a/solr/core/src/java/org/apache/solr/cli/ZkLsTool.java b/solr/core/src/java/org/apache/solr/cli/ZkLsTool.java
index 5f4d6d83fca..24f1c80144e 100644
--- a/solr/core/src/java/org/apache/solr/cli/ZkLsTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/ZkLsTool.java
@@ -22,6 +22,7 @@ import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
+import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
import org.apache.solr.common.cloud.SolrZkClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -72,7 +73,7 @@ public class ZkLsTool extends ToolBase {
try (SolrZkClient zkClient =
new SolrZkClient.Builder()
.withUrl(zkHost)
- .withTimeout(30000, TimeUnit.MILLISECONDS)
+ .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, TimeUnit.MILLISECONDS)
.build()) {
echoIfVerbose("\nConnecting to ZooKeeper at " + zkHost + " ...", cli);
diff --git a/solr/core/src/java/org/apache/solr/cli/ZkMkrootTool.java b/solr/core/src/java/org/apache/solr/cli/ZkMkrootTool.java
index 8a9b7d769d8..e41187839f4 100644
--- a/solr/core/src/java/org/apache/solr/cli/ZkMkrootTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/ZkMkrootTool.java
@@ -22,6 +22,7 @@ import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
+import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
import org.apache.solr.common.cloud.SolrZkClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -71,7 +72,7 @@ public class ZkMkrootTool extends ToolBase {
try (SolrZkClient zkClient =
new SolrZkClient.Builder()
.withUrl(zkHost)
- .withTimeout(30000, TimeUnit.MILLISECONDS)
+ .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, TimeUnit.MILLISECONDS)
.build()) {
echoIfVerbose("\nConnecting to ZooKeeper at " + zkHost + " ...", cli);
diff --git a/solr/core/src/java/org/apache/solr/cli/ZkMvTool.java b/solr/core/src/java/org/apache/solr/cli/ZkMvTool.java
index 6c147c85594..6506aa9176e 100644
--- a/solr/core/src/java/org/apache/solr/cli/ZkMvTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/ZkMvTool.java
@@ -24,6 +24,7 @@ import java.util.concurrent.TimeUnit;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
import org.apache.solr.common.cloud.SolrZkClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -78,7 +79,7 @@ public class ZkMvTool extends ToolBase {
try (SolrZkClient zkClient =
new SolrZkClient.Builder()
.withUrl(zkHost)
- .withTimeout(30000, TimeUnit.MILLISECONDS)
+ .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, TimeUnit.MILLISECONDS)
.build()) {
echoIfVerbose("\nConnecting to ZooKeeper at " + zkHost + " ...", cli);
String src = cli.getOptionValue("src");
diff --git a/solr/core/src/java/org/apache/solr/cli/ZkRmTool.java b/solr/core/src/java/org/apache/solr/cli/ZkRmTool.java
index 0ca4694ac89..dad5bdbbe94 100644
--- a/solr/core/src/java/org/apache/solr/cli/ZkRmTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/ZkRmTool.java
@@ -24,6 +24,7 @@ import java.util.concurrent.TimeUnit;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
import org.apache.solr.common.cloud.SolrZkClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -84,7 +85,7 @@ public class ZkRmTool extends ToolBase {
try (SolrZkClient zkClient =
new SolrZkClient.Builder()
.withUrl(zkHost)
- .withTimeout(30000, TimeUnit.MILLISECONDS)
+ .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, TimeUnit.MILLISECONDS)
.build()) {
if (!recurse && zkClient.getChildren(znode, null, true).size() != 0) {
throw new SolrServerException(
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkCLI.java b/solr/core/src/java/org/apache/solr/cloud/ZkCLI.java
index ef2f29cb62a..c1f9b826529 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkCLI.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkCLI.java
@@ -42,6 +42,7 @@ import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import org.apache.solr.cli.CLIO;
+import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.cloud.ClusterProperties;
import org.apache.solr.common.cloud.SolrZkClient;
@@ -299,8 +300,9 @@ public class ZkCLI implements CLIO {
try (SolrZkClient zkClient =
new SolrZkClient.Builder()
.withUrl(zkServerAddress)
- .withTimeout(30000, TimeUnit.MILLISECONDS)
- .withConnTimeOut(30000, TimeUnit.MILLISECONDS)
+ .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, TimeUnit.MILLISECONDS)
+ .withConnTimeOut(
+ SolrZkClientTimeout.DEFAULT_ZK_CONNECT_TIMEOUT, TimeUnit.MILLISECONDS)
.withReconnectListener(() -> {})
.withCompressor(compressor)
.build()) {
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 c812b7767cb..c93a7dfef99 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@ -62,6 +62,7 @@ import org.apache.solr.client.solrj.cloud.SolrCloudManager;
import org.apache.solr.client.solrj.impl.CloudLegacySolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrClient.Builder;
import org.apache.solr.client.solrj.impl.SolrClientCloudManager;
+import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
import org.apache.solr.client.solrj.impl.ZkClientClusterStateProvider;
import org.apache.solr.client.solrj.request.CoreAdminRequest.WaitForState;
import org.apache.solr.cloud.overseer.ClusterStateMutator;
@@ -233,8 +234,6 @@ public class ZkController implements Closeable {
private boolean genericCoreNodeNames;
- private int clientTimeout;
-
private volatile boolean isClosed;
private final ConcurrentHashMap<String, Throwable> replicasMetTragicEvent =
@@ -331,7 +330,7 @@ public class ZkController implements Closeable {
this.leaderVoteWait = cloudConfig.getLeaderVoteWait();
this.leaderConflictResolveWait = cloudConfig.getLeaderConflictResolveWait();
- this.clientTimeout = cloudConfig.getZkClientTimeout();
+ int clientTimeout = cloudConfig.getZkClientTimeout();
String connectionStrategy = System.getProperty("solr.zookeeper.connectionStrategy");
ZkClientConnectionStrategy strat =
@@ -1188,8 +1187,8 @@ public class ZkController implements Closeable {
SolrZkClient tmpClient =
new SolrZkClient.Builder()
.withUrl(zkHost.substring(0, zkHost.indexOf('/')))
- .withTimeout(60000, TimeUnit.MILLISECONDS)
- .withConnTimeOut(30000, TimeUnit.MILLISECONDS)
+ .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, TimeUnit.MILLISECONDS)
+ .withConnTimeOut(SolrZkClientTimeout.DEFAULT_ZK_CONNECT_TIMEOUT, TimeUnit.MILLISECONDS)
.build();
boolean exists = tmpClient.exists(chrootPath, true);
if (!exists && create) {
@@ -2339,10 +2338,6 @@ public class ZkController implements Closeable {
}
}
- public int getClientTimeout() {
- return clientTimeout;
- }
-
public Overseer getOverseer() {
return overseer;
}
diff --git a/solr/core/src/java/org/apache/solr/core/CloudConfig.java b/solr/core/src/java/org/apache/solr/core/CloudConfig.java
index 5cc3e58e37e..790aa333012 100644
--- a/solr/core/src/java/org/apache/solr/core/CloudConfig.java
+++ b/solr/core/src/java/org/apache/solr/core/CloudConfig.java
@@ -16,6 +16,7 @@
*/
package org.apache.solr.core;
+import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
import org.apache.solr.common.SolrException;
public class CloudConfig {
@@ -179,7 +180,6 @@ public class CloudConfig {
public static class CloudConfigBuilder {
- private static final int DEFAULT_ZK_CLIENT_TIMEOUT = 45000;
private static final int DEFAULT_LEADER_VOTE_WAIT = 180000; // 3 minutes
private static final int DEFAULT_LEADER_CONFLICT_RESOLVE_WAIT = 180000;
private static final int DEFAULT_CREATE_COLLECTION_ACTIVE_WAIT = 45; // 45 seconds
@@ -188,7 +188,7 @@ public class CloudConfig {
-1; // By default compression for state is disabled
private String zkHost;
- private int zkClientTimeout = Integer.getInteger("zkClientTimeout", DEFAULT_ZK_CLIENT_TIMEOUT);
+ private int zkClientTimeout = SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT;
private final int hostPort;
private final String hostName;
private boolean useGenericCoreNames;
diff --git a/solr/core/src/java/org/apache/solr/core/ZkContainer.java b/solr/core/src/java/org/apache/solr/core/ZkContainer.java
index 23be2346099..f7ea012b249 100644
--- a/solr/core/src/java/org/apache/solr/core/ZkContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/ZkContainer.java
@@ -29,6 +29,7 @@ import java.util.concurrent.TimeoutException;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collectors;
+import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
import org.apache.solr.cloud.SolrZkServer;
import org.apache.solr.cloud.ZkController;
import org.apache.solr.common.AlreadyClosedException;
@@ -111,7 +112,7 @@ public class ZkContainer {
}
}
- int zkClientConnectTimeout = 30000;
+ int zkClientConnectTimeout = SolrZkClientTimeout.DEFAULT_ZK_CONNECT_TIMEOUT;
if (zookeeperHost != null) {
diff --git a/solr/core/src/java/org/apache/solr/packagemanager/PackageManager.java b/solr/core/src/java/org/apache/solr/packagemanager/PackageManager.java
index a8387b4c669..79b9fa1c9c3 100644
--- a/solr/core/src/java/org/apache/solr/packagemanager/PackageManager.java
+++ b/solr/core/src/java/org/apache/solr/packagemanager/PackageManager.java
@@ -42,6 +42,7 @@ import org.apache.solr.client.api.util.SolrVersion;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
import org.apache.solr.client.solrj.request.GenericSolrRequest;
import org.apache.solr.client.solrj.request.V2Request;
import org.apache.solr.client.solrj.request.beans.PackagePayload;
@@ -83,7 +84,7 @@ public class PackageManager implements Closeable {
this.zkClient =
new SolrZkClient.Builder()
.withUrl(zkHost)
- .withTimeout(30000, TimeUnit.MILLISECONDS)
+ .withTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT, TimeUnit.MILLISECONDS)
.build();
log.info("Done initializing a zkClient instance...");
}
diff --git a/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java b/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java
index 1cc5903ba4e..9008b3e443e 100644
--- a/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java
+++ b/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java
@@ -485,7 +485,7 @@ public class ManagedIndexSchemaFactory extends IndexSchemaFactory implements Sol
// Rename the non-managed schema znode in ZooKeeper
final String nonManagedSchemaPath = zkLoader.getConfigSetZkPath() + "/" + resourceName;
try {
- ZkCmdExecutor zkCmdExecutor = new ZkCmdExecutor(zkController.getClientTimeout());
+ ZkCmdExecutor zkCmdExecutor = new ZkCmdExecutor(zkClient.getZkClientTimeout());
if (zkController.pathExists(nonManagedSchemaPath)) {
// First, copy the non-managed schema znode content to the upgraded schema znode
byte[] bytes = zkController.getZkClient().getData(nonManagedSchemaPath, null, null, true);
diff --git a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/ZkClientClusterStateProvider.java b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/ZkClientClusterStateProvider.java
index ff805fced17..075c1e4d3de 100644
--- a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/ZkClientClusterStateProvider.java
+++ b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/ZkClientClusterStateProvider.java
@@ -24,6 +24,7 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import org.apache.solr.client.solrj.impl.SolrZkClientTimeout.SolrZkClientTimeoutAware;
import org.apache.solr.common.AlreadyClosedException;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.cloud.ClusterState;
@@ -40,14 +41,15 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** Retrieves cluster state from Zookeeper */
-public class ZkClientClusterStateProvider implements ClusterStateProvider {
+public class ZkClientClusterStateProvider
+ implements ClusterStateProvider, SolrZkClientTimeoutAware {
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
volatile ZkStateReader zkStateReader;
private boolean closeZkStateReader = true;
private final String zkHost;
- private int zkConnectTimeout = 15000;
- private int zkClientTimeout = 45000;
+ private int zkConnectTimeout = SolrZkClientTimeout.DEFAULT_ZK_CONNECT_TIMEOUT;
+ private int zkClientTimeout = SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT;
private volatile boolean isClosed = false;
@@ -306,6 +308,7 @@ public class ZkClientClusterStateProvider implements ClusterStateProvider {
}
/** Set the connect timeout to the zookeeper ensemble in ms */
+ @Override
public void setZkConnectTimeout(int zkConnectTimeout) {
this.zkConnectTimeout = zkConnectTimeout;
}
@@ -315,6 +318,7 @@ public class ZkClientClusterStateProvider implements ClusterStateProvider {
}
/** Set the timeout to the zookeeper ensemble in ms */
+ @Override
public void setZkClientTimeout(int zkClientTimeout) {
this.zkClientTimeout = zkClientTimeout;
}
diff --git a/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/SolrZkClient.java b/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/SolrZkClient.java
index b7aeec05b7d..ddbd70d375f 100644
--- a/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/SolrZkClient.java
+++ b/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/SolrZkClient.java
@@ -34,6 +34,7 @@ import java.util.function.Function;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
import org.apache.solr.common.MapWriter;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.annotation.JsonProperty;
@@ -70,8 +71,6 @@ public class SolrZkClient implements Closeable {
static final String NEWL = System.getProperty("line.separator");
- static final int DEFAULT_CLIENT_CONNECT_TIMEOUT = 30000;
-
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private ConnectionManager connManager;
@@ -1127,8 +1126,8 @@ public class SolrZkClient implements Closeable {
public static class Builder {
public String zkServerAddress;
- public int zkClientTimeout = DEFAULT_CLIENT_CONNECT_TIMEOUT;
- public int zkClientConnectTimeout = DEFAULT_CLIENT_CONNECT_TIMEOUT;
+ public int zkClientTimeout = SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT;
+ public int zkClientConnectTimeout = SolrZkClientTimeout.DEFAULT_ZK_CONNECT_TIMEOUT;
public OnReconnect onReconnect;
public BeforeReconnect beforeReconnect;
public ZkClientConnectionStrategy connectionStrategy;
@@ -1143,13 +1142,25 @@ public class SolrZkClient implements Closeable {
return this;
}
- public Builder withTimeout(int i, TimeUnit unit) {
- this.zkClientTimeout = (int) unit.toMillis(i);
+ /**
+ * Sets the Zk client session timeout
+ *
+ * @param zkClientTimeout timeout value
+ * @param unit time unit
+ */
+ public Builder withTimeout(int zkClientTimeout, TimeUnit unit) {
+ this.zkClientTimeout = Math.toIntExact(unit.toMillis(zkClientTimeout));
return this;
}
- public Builder withConnTimeOut(int i, TimeUnit unit) {
- this.zkClientConnectTimeout = (int) unit.toMillis(i);
+ /**
+ * Sets the Zk connection timeout
+ *
+ * @param zkConnectTimeout timeout value
+ * @param unit time unit
+ */
+ public Builder withConnTimeOut(int zkConnectTimeout, TimeUnit unit) {
+ this.zkClientConnectTimeout = Math.toIntExact(unit.toMillis(zkConnectTimeout));
return this;
}
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudHttp2SolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudHttp2SolrClient.java
index 5222275c069..6311acf1b29 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudHttp2SolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudHttp2SolrClient.java
@@ -24,6 +24,7 @@ import java.util.List;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
import org.apache.solr.client.solrj.ResponseParser;
+import org.apache.solr.client.solrj.impl.SolrZkClientTimeout.SolrZkClientTimeoutAware;
import org.apache.solr.client.solrj.request.RequestWriter;
import org.apache.solr.client.solrj.request.UpdateRequest;
import org.apache.solr.common.SolrException;
@@ -73,31 +74,7 @@ public class CloudHttp2SolrClient extends CloudSolrClient {
if (builder.responseParser != null) {
this.myClient.setParser(builder.responseParser);
}
- if (builder.stateProvider == null) {
- if (builder.zkHosts != null && builder.solrUrls != null) {
- throw new IllegalArgumentException(
- "Both zkHost(s) & solrUrl(s) have been specified. Only specify one.");
- }
- if (builder.zkHosts != null) {
- this.stateProvider =
- ClusterStateProvider.newZkClusterStateProvider(builder.zkHosts, builder.zkChroot);
- } else if (builder.solrUrls != null && !builder.solrUrls.isEmpty()) {
- try {
- this.stateProvider = new Http2ClusterStateProvider(builder.solrUrls, builder.httpClient);
- } catch (Exception e) {
- throw new RuntimeException(
- "Couldn't initialize a HttpClusterStateProvider (is/are the "
- + "Solr server(s), "
- + builder.solrUrls
- + ", down?)",
- e);
- }
- } else {
- throw new IllegalArgumentException("Both zkHosts and solrUrl cannot be null.");
- }
- } else {
- this.stateProvider = builder.stateProvider;
- }
+ this.stateProvider = builder.stateProvider;
this.collectionStateCache.timeToLiveMs =
TimeUnit.MILLISECONDS.convert(builder.timeToLiveSeconds, TimeUnit.SECONDS);
@@ -159,6 +136,8 @@ public class CloudHttp2SolrClient extends CloudSolrClient {
private String defaultCollection;
private long timeToLiveSeconds = 60;
private int parallelCacheRefreshesLocks = 3;
+ private int zkConnectTimeout = SolrZkClientTimeout.DEFAULT_ZK_CONNECT_TIMEOUT;
+ private int zkClientTimeout = SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT;
/**
* Provide a series of Solr URLs to be used when configuring {@link CloudHttp2SolrClient}
@@ -389,13 +368,42 @@ public class CloudHttp2SolrClient extends CloudSolrClient {
return this;
}
+ /**
+ * Sets the Zk connection timeout
+ *
+ * @param zkConnectTimeout timeout value
+ * @param unit time unit
+ */
+ public Builder withZkConnectTimeout(int zkConnectTimeout, TimeUnit unit) {
+ this.zkConnectTimeout = Math.toIntExact(unit.toMillis(zkConnectTimeout));
+ return this;
+ }
+
+ /**
+ * Sets the Zk client session timeout
+ *
+ * @param zkClientTimeout timeout value
+ * @param unit time unit
+ */
+ public Builder withZkClientTimeout(int zkClientTimeout, TimeUnit unit) {
+ this.zkClientTimeout = Math.toIntExact(unit.toMillis(zkClientTimeout));
+ return this;
+ }
+
/** Create a {@link CloudHttp2SolrClient} based on the provided configuration. */
public CloudHttp2SolrClient build() {
if (stateProvider == null) {
- if (!zkHosts.isEmpty()) {
- stateProvider =
- ClusterStateProvider.newZkClusterStateProvider(zkHosts, Builder.this.zkChroot);
- } else if (!this.solrUrls.isEmpty()) {
+ if (!zkHosts.isEmpty() && !solrUrls.isEmpty()) {
+ throw new IllegalArgumentException(
+ "Both zkHost(s) & solrUrl(s) have been specified. Only specify one.");
+ } else if (!zkHosts.isEmpty()) {
+ stateProvider = ClusterStateProvider.newZkClusterStateProvider(zkHosts, zkChroot);
+ if (stateProvider instanceof SolrZkClientTimeoutAware) {
+ var timeoutAware = (SolrZkClientTimeoutAware) stateProvider;
+ timeoutAware.setZkClientTimeout(zkClientTimeout);
+ timeoutAware.setZkConnectTimeout(zkConnectTimeout);
+ }
+ } else if (!solrUrls.isEmpty()) {
try {
stateProvider = new Http2ClusterStateProvider(solrUrls, httpClient);
} catch (Exception e) {
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudLegacySolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudLegacySolrClient.java
index 4a94359fca5..c1bc6811411 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudLegacySolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudLegacySolrClient.java
@@ -26,6 +26,7 @@ import java.util.concurrent.TimeUnit;
import org.apache.http.NoHttpResponseException;
import org.apache.http.client.HttpClient;
import org.apache.http.conn.ConnectTimeoutException;
+import org.apache.solr.client.solrj.impl.SolrZkClientTimeout.SolrZkClientTimeoutAware;
import org.apache.solr.client.solrj.request.UpdateRequest;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.cloud.DocCollection;
@@ -61,31 +62,7 @@ public class CloudLegacySolrClient extends CloudSolrClient {
*/
protected CloudLegacySolrClient(Builder builder) {
super(builder.shardLeadersOnly, builder.parallelUpdates, builder.directUpdatesToLeadersOnly);
- if (builder.stateProvider == null) {
- if (builder.zkHosts != null && builder.solrUrls != null) {
- throw new IllegalArgumentException(
- "Both zkHost(s) & solrUrl(s) have been specified. Only specify one.");
- }
- if (builder.zkHosts != null) {
- this.stateProvider =
- ClusterStateProvider.newZkClusterStateProvider(builder.zkHosts, builder.zkChroot);
- } else if (builder.solrUrls != null && !builder.solrUrls.isEmpty()) {
- try {
- this.stateProvider = new HttpClusterStateProvider(builder.solrUrls, builder.httpClient);
- } catch (Exception e) {
- throw new RuntimeException(
- "Couldn't initialize a HttpClusterStateProvider (is/are the "
- + "Solr server(s), "
- + builder.solrUrls
- + ", down?)",
- e);
- }
- } else {
- throw new IllegalArgumentException("Both zkHosts and solrUrl cannot be null.");
- }
- } else {
- this.stateProvider = builder.stateProvider;
- }
+ this.stateProvider = builder.stateProvider;
this.retryExpiryTimeNano = builder.retryExpiryTimeNano;
this.defaultCollection = builder.defaultCollection;
this.collectionStateCache.timeToLiveMs =
@@ -194,6 +171,8 @@ public class CloudLegacySolrClient extends CloudSolrClient {
protected long retryExpiryTimeNano =
TimeUnit.NANOSECONDS.convert(3, TimeUnit.SECONDS); // 3 seconds or 3 million nanos
protected ClusterStateProvider stateProvider;
+ private int zkConnectTimeout = SolrZkClientTimeout.DEFAULT_ZK_CONNECT_TIMEOUT;
+ private int zkClientTimeout = SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT;
/** Constructor for use by subclasses. This constructor was public prior to version 9.0 */
protected Builder() {}
@@ -370,11 +349,41 @@ public class CloudLegacySolrClient extends CloudSolrClient {
return this;
}
+ /**
+ * Sets the Zk connection timeout
+ *
+ * @param zkConnectTimeout timeout value
+ * @param unit time unit
+ */
+ public Builder withZkConnectTimeout(int zkConnectTimeout, TimeUnit unit) {
+ this.zkConnectTimeout = Math.toIntExact(unit.toMillis(zkConnectTimeout));
+ return this;
+ }
+
+ /**
+ * Sets the Zk client session timeout
+ *
+ * @param zkClientTimeout timeout value
+ * @param unit time unit
+ */
+ public Builder withZkClientTimeout(int zkClientTimeout, TimeUnit unit) {
+ this.zkClientTimeout = Math.toIntExact(unit.toMillis(zkClientTimeout));
+ return this;
+ }
+
/** Create a {@link CloudLegacySolrClient} based on the provided configuration. */
public CloudLegacySolrClient build() {
if (stateProvider == null) {
- if (!zkHosts.isEmpty()) {
+ if (!zkHosts.isEmpty() && !solrUrls.isEmpty()) {
+ throw new IllegalArgumentException(
+ "Both zkHost(s) & solrUrl(s) have been specified. Only specify one.");
+ } else if (!zkHosts.isEmpty()) {
this.stateProvider = ClusterStateProvider.newZkClusterStateProvider(zkHosts, zkChroot);
+ if (stateProvider instanceof SolrZkClientTimeoutAware) {
+ var timeoutAware = (SolrZkClientTimeoutAware) stateProvider;
+ timeoutAware.setZkClientTimeout(zkClientTimeout);
+ timeoutAware.setZkConnectTimeout(zkConnectTimeout);
+ }
} else if (!this.solrUrls.isEmpty()) {
try {
stateProvider = new HttpClusterStateProvider(solrUrls, httpClient);
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrZkClientTimeout.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrZkClientTimeout.java
new file mode 100644
index 00000000000..0a0cfd7fdad
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrZkClientTimeout.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.client.solrj.impl;
+
+public class SolrZkClientTimeout {
+ public static final int DEFAULT_ZK_CLIENT_TIMEOUT = Integer.getInteger("zkClientTimeout", 30000);
+ public static final int DEFAULT_ZK_CONNECT_TIMEOUT =
+ Integer.getInteger("zkConnectTimeout", 15000);
+
+ interface SolrZkClientTimeoutAware {
+ void setZkClientTimeout(int zkClientTimeout);
+
+ void setZkConnectTimeout(int zkConnectTimeout);
+ }
+}
diff --git a/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java b/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java
index 3384a03d0be..157f0a935e2 100644
--- a/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java
+++ b/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java
@@ -26,6 +26,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.util.NamedList;
@@ -190,7 +191,7 @@ public class TestHarness extends BaseTestHarness {
? null
: new CloudConfig.CloudConfigBuilder(
System.getProperty("host"), Integer.getInteger("hostPort", 8983))
- .setZkClientTimeout(Integer.getInteger("zkClientTimeout", 30000))
+ .setZkClientTimeout(SolrZkClientTimeout.DEFAULT_ZK_CLIENT_TIMEOUT)
.setZkHost(System.getProperty("zkHost"))
.build();