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;

Reply via email to