This is an automated email from the ASF dual-hosted git repository.
dsmiley 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 9af999a2b7c SOLR-17630 Add SolrCloudManager.getSolrClient (#3049)
9af999a2b7c is described below
commit 9af999a2b7c5fe800d10312896f6458cad5bc252
Author: David Smiley <[email protected]>
AuthorDate: Thu Feb 13 17:04:34 2025 -0500
SOLR-17630 Add SolrCloudManager.getSolrClient (#3049)
and ZkController.getSolrClient for a canonical node managed CloudSolrClient.
Deprecate SolrCloudManager.request
Deprecate CoreContainer.getSolrClientCache
(cherry picked from commit 158074d40f271a0d5afd3698ebbe333d1820e598)
---
solr/CHANGES.txt | 3 +++
.../java/org/apache/solr/cloud/ZkController.java | 5 +++++
.../cloud/api/collections/ReindexCollectionCmd.java | 11 +++--------
.../solr/cloud/api/collections/SplitShardCmd.java | 7 +++----
.../events/impl/CollectionsRepairEventListener.java | 4 +---
.../cluster/maintenance/InactiveShardRemover.java | 2 +-
.../java/org/apache/solr/core/CoreContainer.java | 18 +++++++++++++++---
.../org/apache/solr/handler/admin/ColStatus.java | 21 ++++++++++-----------
.../solr/handler/admin/api/CollectionStatus.java | 4 ++--
.../solr/handler/designer/SchemaDesignerAPI.java | 4 +---
.../designer/SchemaDesignerConfigSetHelper.java | 2 +-
.../client/solrj/cloud/DelegatingCloudManager.java | 6 ++++++
.../solr/client/solrj/cloud/SolrCloudManager.java | 8 +++++---
.../client/solrj/impl/SolrClientCloudManager.java | 5 +++++
14 files changed, 61 insertions(+), 39 deletions(-)
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index fdee6b6a41a..1d5b77765e1 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -50,6 +50,9 @@ Bug Fixes
* SOLR-17649: Fix a regression of faceting on multi-valued EnumFieldType,
introduced by an earlier 9.x version. (Thomas Wöckinger, David Smiley)
+* SOLR-17630: Added a node-wide CloudSolrClient to ZkController, and
accessible via SolrCloudManager too.
+ Uses Jetty HttpClient. Deprecated CloudSolrClient.getSolrClientCache.
Redirected some callers. (David Smiley)
+
Dependency Upgrades
---------------------
* SOLR-17471: Upgrade Lucene to 9.12.1. (Pierre Salagnac, Christine Poerschke)
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 90044cec098..3f85011c7c9 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@ -58,6 +58,7 @@ import java.util.stream.Collectors;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.cloud.SolrCloudManager;
import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
+import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.client.solrj.impl.Http2SolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrClient.Builder;
import org.apache.solr.client.solrj.impl.SolrClientCloudManager;
@@ -592,6 +593,10 @@ public class ZkController implements Closeable {
}
}
+ public CloudSolrClient getSolrClient() {
+ return getSolrCloudManager().getSolrClient();
+ }
+
public int getLeaderVoteWait() {
return leaderVoteWait;
}
diff --git
a/solr/core/src/java/org/apache/solr/cloud/api/collections/ReindexCollectionCmd.java
b/solr/core/src/java/org/apache/solr/cloud/api/collections/ReindexCollectionCmd.java
index 1fa86897b8f..9620cff4260 100644
---
a/solr/core/src/java/org/apache/solr/cloud/api/collections/ReindexCollectionCmd.java
+++
b/solr/core/src/java/org/apache/solr/cloud/api/collections/ReindexCollectionCmd.java
@@ -36,7 +36,6 @@ import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.solr.client.solrj.SolrResponse;
import org.apache.solr.client.solrj.cloud.DistribStateManager;
-import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.client.solrj.request.CollectionAdminRequest;
import org.apache.solr.client.solrj.request.QueryRequest;
import org.apache.solr.client.solrj.response.QueryResponse;
@@ -163,8 +162,6 @@ public class ReindexCollectionCmd implements
CollApiCmds.CollectionApiCommand {
.collect(Collectors.toUnmodifiableMap(Cmd::toLower,
Function.identity()));
}
- private String zkHost;
-
public ReindexCollectionCmd(CollectionCommandContext ccc) {
this.ccc = ccc;
}
@@ -277,7 +274,6 @@ public class ReindexCollectionCmd implements
CollApiCmds.CollectionApiCommand {
Exception exc = null;
boolean createdTarget = false;
try {
- zkHost = ccc.getZkStateReader().getZkClient().getZkServerAddress();
// set the running flag
reindexingState.clear();
reindexingState.put("actualSourceCollection", collection);
@@ -454,9 +450,9 @@ public class ReindexCollectionCmd implements
CollApiCmds.CollectionApiCommand {
+ "\","
+ "initialCheckpoint=\"0\"))))");
log.debug("- starting copying documents from {} to {}", collection,
targetCollection);
- SolrResponse rsp = null;
+ SolrResponse rsp;
try {
- rsp = ccc.getSolrCloudManager().request(new QueryRequest(q));
+ rsp = new
QueryRequest(q).process(ccc.getSolrCloudManager().getSolrClient());
} catch (Exception e) {
throw new SolrException(
SolrException.ErrorCode.SERVER_ERROR,
@@ -640,8 +636,7 @@ public class ReindexCollectionCmd implements
CollApiCmds.CollectionApiCommand {
}
private long getNumberOfDocs(String collection) {
- CloudSolrClient solrClient =
- ccc.getCoreContainer().getSolrClientCache().getCloudSolrClient(zkHost);
+ var solrClient = ccc.getCoreContainer().getZkController().getSolrClient();
try {
ModifiableSolrParams params = new ModifiableSolrParams();
params.add(CommonParams.Q, "*:*");
diff --git
a/solr/core/src/java/org/apache/solr/cloud/api/collections/SplitShardCmd.java
b/solr/core/src/java/org/apache/solr/cloud/api/collections/SplitShardCmd.java
index dcb5a1cfb27..905b3712888 100644
---
a/solr/core/src/java/org/apache/solr/cloud/api/collections/SplitShardCmd.java
+++
b/solr/core/src/java/org/apache/solr/cloud/api/collections/SplitShardCmd.java
@@ -27,7 +27,6 @@ import static
org.apache.solr.common.params.CollectionParams.CollectionAction.DE
import static org.apache.solr.common.params.CommonAdminParams.ASYNC;
import static org.apache.solr.common.params.CommonAdminParams.NUM_SUB_SHARDS;
-import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.util.ArrayList;
import java.util.Collection;
@@ -872,7 +871,7 @@ public class SplitShardCmd implements
CollApiCmds.CollectionApiCommand {
Replica parentShardLeader,
SolrIndexSplitter.SplitMethod method,
SolrCloudManager cloudManager)
- throws SolrException, IOException {
+ throws Exception {
// check that enough disk space is available on the parent leader node
// otherwise the actual index splitting will always fail
@@ -887,8 +886,8 @@ public class SplitShardCmd implements
CollApiCmds.CollectionApiCommand {
.add("key", indexSizeMetricName)
.add("key", freeDiskSpaceMetricName);
SolrResponse rsp =
- cloudManager.request(
- new GenericSolrRequest(SolrRequest.METHOD.GET, "/admin/metrics",
params));
+ new GenericSolrRequest(SolrRequest.METHOD.GET, "/admin/metrics",
params)
+ .process(cloudManager.getSolrClient());
Number size = (Number) rsp.getResponse().findRecursive("metrics",
indexSizeMetricName);
if (size == null) {
diff --git
a/solr/core/src/java/org/apache/solr/cluster/events/impl/CollectionsRepairEventListener.java
b/solr/core/src/java/org/apache/solr/cluster/events/impl/CollectionsRepairEventListener.java
index e26e3d08197..c0ef7b33933 100644
---
a/solr/core/src/java/org/apache/solr/cluster/events/impl/CollectionsRepairEventListener.java
+++
b/solr/core/src/java/org/apache/solr/cluster/events/impl/CollectionsRepairEventListener.java
@@ -80,9 +80,7 @@ public class CollectionsRepairEventListener
public CollectionsRepairEventListener(CoreContainer cc) {
this.cc = cc;
- this.solrClient =
- cc.getSolrClientCache()
-
.getCloudSolrClient(cc.getZkController().getZkClient().getZkServerAddress());
+ this.solrClient = cc.getZkController().getSolrClient();
this.solrCloudManager = cc.getZkController().getSolrCloudManager();
}
diff --git
a/solr/core/src/java/org/apache/solr/cluster/maintenance/InactiveShardRemover.java
b/solr/core/src/java/org/apache/solr/cluster/maintenance/InactiveShardRemover.java
index 1d951492afd..67be0f2116b 100644
---
a/solr/core/src/java/org/apache/solr/cluster/maintenance/InactiveShardRemover.java
+++
b/solr/core/src/java/org/apache/solr/cluster/maintenance/InactiveShardRemover.java
@@ -65,7 +65,7 @@ public class InactiveShardRemover
CollectionAdminRequest.deleteShard(slice.getCollection(),
slice.getName());
try {
SolrResponse response =
-
coreContainer.getZkController().getSolrCloudManager().request(deleteRequest);
+
deleteRequest.process(coreContainer.getZkController().getSolrClient());
if (response.getException() != null) {
throw response.getException();
}
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 450a36a9ee9..b9f441801b2 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@@ -67,6 +67,7 @@ import org.apache.lucene.util.BytesRef;
import org.apache.solr.api.ClusterPluginsSource;
import org.apache.solr.api.ContainerPluginsRegistry;
import org.apache.solr.api.JerseyResource;
+import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.impl.Http2SolrClient;
import org.apache.solr.client.solrj.impl.HttpClientUtil;
import org.apache.solr.client.solrj.impl.SolrHttpClientBuilder;
@@ -743,7 +744,18 @@ public class CoreContainer {
return caches.get(name);
}
+ /**
+ * The {@link SolrClientCache} is mostly for streaming expressions. Prefer
other clients for other
+ * use-cases.
+ *
+ * @see #getDefaultHttpSolrClient()
+ * @see ZkController#getSolrClient()
+ * @see Http2SolrClient#requestWithBaseUrl(String, String, SolrRequest)
+ * @deprecated likely to simply be moved to the ObjectCache so as to not be
used
+ */
+ @Deprecated
public SolrClientCache getSolrClientCache() {
+ // TODO put in the objectCache instead
return solrClientCache;
}
@@ -2556,12 +2568,12 @@ public class CoreContainer {
}
/**
- * Provides the existing general-purpose HTTP/2 Solr client from {@link
HttpSolrClientProvider}.
+ * A general-purpose HTTP/2 Solr client.
*
- * <p>The caller does not need to close the client, as its lifecycle is
managed by {@link
- * HttpSolrClientProvider}.
+ * <p>The caller does not need to close the client.
*
* @return the existing {@link Http2SolrClient}
+ * @see Http2SolrClient#requestWithBaseUrl(String, String, SolrRequest)
*/
public Http2SolrClient getDefaultHttpSolrClient() {
return solrClientProvider.getSolrClient();
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/ColStatus.java
b/solr/core/src/java/org/apache/solr/handler/admin/ColStatus.java
index 234682e8473..d4980a0a674 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/ColStatus.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/ColStatus.java
@@ -26,9 +26,8 @@ import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import org.apache.solr.client.api.model.GetSegmentDataResponse;
-import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.io.SolrClientCache;
+import org.apache.solr.client.solrj.impl.Http2SolrClient;
import org.apache.solr.client.solrj.request.QueryRequest;
import org.apache.solr.common.cloud.ClusterState;
import org.apache.solr.common.cloud.DocCollection;
@@ -51,9 +50,9 @@ import org.slf4j.LoggerFactory;
public class ColStatus {
private static final Logger log =
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+ private final Http2SolrClient solrClient;
private final ClusterState clusterState;
private final ZkNodeProps props;
- private final SolrClientCache solrClientCache;
public static final String CORE_INFO_PROP =
SegmentsInfoRequestHandler.CORE_INFO_PARAM;
public static final String FIELD_INFO_PROP =
SegmentsInfoRequestHandler.FIELD_INFO_PARAM;
@@ -67,10 +66,10 @@ public class ColStatus {
SegmentsInfoRequestHandler.RAW_SIZE_SAMPLING_PERCENT_PARAM;
public static final String SEGMENTS_PROP = "segments";
- public ColStatus(SolrClientCache solrClientCache, ClusterState clusterState,
ZkNodeProps props) {
- this.props = props;
- this.solrClientCache = solrClientCache;
+ public ColStatus(Http2SolrClient solrClient, ClusterState clusterState,
ZkNodeProps props) {
+ this.solrClient = solrClient;
this.clusterState = clusterState;
+ this.props = props;
}
@SuppressWarnings({"unchecked"})
@@ -190,7 +189,7 @@ public class ColStatus {
continue;
}
if (getSegments) {
- try (SolrClient client = solrClientCache.getHttpSolrClient(url)) {
+ try {
ModifiableSolrParams params = new ModifiableSolrParams();
params.add(CommonParams.QT, "/admin/segments");
params.add(FIELD_INFO_PROP, "true");
@@ -203,7 +202,7 @@ public class ColStatus {
params.add(RAW_SIZE_SAMPLING_PERCENT_PROP,
String.valueOf(samplingPercent));
}
QueryRequest req = new QueryRequest(params);
- NamedList<Object> rsp = client.request(req);
+ NamedList<Object> rsp = solrClient.requestWithBaseUrl(url, null,
req).getResponse();
final var segmentResponse =
SolrJacksonMapper.getObjectMapper().convertValue(rsp,
GetSegmentDataResponse.class);
segmentResponse.responseHeader = null;
@@ -236,13 +235,13 @@ public class ColStatus {
} catch (SolrServerException | IOException e) {
log.warn("Error getting details of replica segments from {}", url,
e);
}
- }
- }
+ } // if getSegments
+ } // for slice
if (nonCompliant.isEmpty()) {
nonCompliant.add("(NONE)");
}
colMap.add("schemaNonCompliant", nonCompliant);
colMap.add("shards", shards);
- }
+ } // for collection
}
}
diff --git
a/solr/core/src/java/org/apache/solr/handler/admin/api/CollectionStatus.java
b/solr/core/src/java/org/apache/solr/handler/admin/api/CollectionStatus.java
index f80b6363071..c06842ed9e3 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/api/CollectionStatus.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/api/CollectionStatus.java
@@ -89,8 +89,8 @@ public class CollectionStatus extends AdminAPIBase implements
CollectionStatusAp
CoreContainer coreContainer, ZkNodeProps params, NamedList<Object>
colStatusSink) {
final var colStatusAssembler =
new ColStatus(
- coreContainer.getSolrClientCache(),
-
coreContainer.getZkController().getZkStateReader().getClusterState(),
+ coreContainer.getDefaultHttpSolrClient(),
+ coreContainer.getZkController().getClusterState(),
params);
colStatusAssembler.getColStatus(colStatusSink);
}
diff --git
a/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerAPI.java
b/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerAPI.java
index b2ad3aa879b..e22835090d7 100644
--- a/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerAPI.java
+++ b/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerAPI.java
@@ -987,9 +987,7 @@ public class SchemaDesignerAPI implements
SchemaDesignerConstants {
}
protected CloudSolrClient cloudClient() {
- return coreContainer
- .getSolrClientCache()
-
.getCloudSolrClient(coreContainer.getZkController().getZkServerAddress());
+ return coreContainer.getZkController().getSolrClient();
}
protected ZkStateReader zkStateReader() {
diff --git
a/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java
b/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java
index 9864548cfc1..f24fe26ed61 100644
---
a/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java
+++
b/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java
@@ -658,7 +658,7 @@ class SchemaDesignerConfigSetHelper implements
SchemaDesignerConstants {
}
protected CloudSolrClient cloudClient() {
- return
cc.getSolrClientCache().getCloudSolrClient(cc.getZkController().getZkServerAddress());
+ return cc.getZkController().getSolrClient();
}
protected ZkStateReader zkStateReader() {
diff --git
a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/cloud/DelegatingCloudManager.java
b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/cloud/DelegatingCloudManager.java
index c259ac3a29c..e5c46301bbd 100644
---
a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/cloud/DelegatingCloudManager.java
+++
b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/cloud/DelegatingCloudManager.java
@@ -19,6 +19,7 @@ package org.apache.solr.client.solrj.cloud;
import java.io.IOException;
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.SolrResponse;
+import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.client.solrj.impl.ClusterStateProvider;
import org.apache.solr.common.util.ObjectCache;
import org.apache.solr.common.util.TimeSource;
@@ -33,6 +34,11 @@ public class DelegatingCloudManager implements
SolrCloudManager {
this.delegate = delegate;
}
+ @Override
+ public CloudSolrClient getSolrClient() {
+ return delegate.getSolrClient();
+ }
+
@Override
public ClusterStateProvider getClusterStateProvider() {
return delegate.getClusterStateProvider();
diff --git
a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/cloud/SolrCloudManager.java
b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/cloud/SolrCloudManager.java
index d244addd952..e38b029af81 100644
---
a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/cloud/SolrCloudManager.java
+++
b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/cloud/SolrCloudManager.java
@@ -20,6 +20,7 @@ package org.apache.solr.client.solrj.cloud;
import java.io.IOException;
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.SolrResponse;
+import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.client.solrj.impl.ClusterStateProvider;
import org.apache.solr.common.SolrCloseable;
import org.apache.solr.common.cloud.ClusterState;
@@ -28,13 +29,15 @@ import org.apache.solr.common.util.TimeSource;
/**
* This interface abstracts the access to a SolrCloud cluster, including
interactions with
- * Zookeeper, Solr and generic HTTP calls.
+ * Zookeeper, Solr.
*
* <p>This abstraction should be used when possible instead of directly
referencing ZK, Solr and
* HTTP.
*/
public interface SolrCloudManager extends SolrCloseable {
+ CloudSolrClient getSolrClient();
+
ClusterStateProvider getClusterStateProvider();
default ClusterState getClusterState() throws IOException {
@@ -49,7 +52,6 @@ public interface SolrCloudManager extends SolrCloseable {
TimeSource getTimeSource();
- // Solr-like methods
-
+ @Deprecated
<T extends SolrResponse> T request(SolrRequest<T> req) throws IOException;
}
diff --git
a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/SolrClientCloudManager.java
b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/SolrClientCloudManager.java
index 3dca5176aa1..1732791bf54 100644
---
a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/SolrClientCloudManager.java
+++
b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/SolrClientCloudManager.java
@@ -60,6 +60,11 @@ public class SolrClientCloudManager implements
SolrCloudManager {
}
}
+ @Override
+ public CloudSolrClient getSolrClient() {
+ return cloudSolrClient;
+ }
+
@Override
public void close() {
isClosed = true;