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

dsmiley pushed a commit to branch branch_10x
in repository https://gitbox.apache.org/repos/asf/solr.git

commit 99c70a67a01261574fde1fa364898a4c040bc173
Author: David Smiley <[email protected]>
AuthorDate: Mon Jun 22 22:02:08 2026 -0400

    Add CloudSolrClient.getHttpClient (#4523)
    
    The subclasses had this but now we can define this at the root abstraction. 
 The CloudLegacySolrClient had prevented this from being added.
    
    (cherry picked from commit dc910ce85803e292a9279dba80e394f24b4b964f)
---
 .../org/apache/solr/cloud/api/collections/SplitShardCmd.java |  3 +--
 .../apache/solr/cloud/api/collections/ShardSplitTest.java    |  3 +--
 .../solr-ref-guide/modules/deployment-guide/pages/solrj.adoc |  4 ++--
 .../solr/client/solrj/impl/SolrClientNodeStateProvider.java  | 12 ++++--------
 .../apache/solr/client/solrj/impl/CloudHttp2SolrClient.java  |  1 +
 .../org/apache/solr/client/solrj/impl/CloudSolrClient.java   |  3 +++
 .../solr/client/solrj/impl/CloudSolrClientCacheTest.java     |  5 +++++
 .../api/collections/AbstractCloudBackupRestoreTestCase.java  |  6 +++---
 8 files changed, 20 insertions(+), 17 deletions(-)

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 200c9a6607d..6740c5ba046 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
@@ -43,7 +43,6 @@ import java.util.concurrent.atomic.AtomicReference;
 import org.apache.solr.client.solrj.cloud.DistribStateManager;
 import org.apache.solr.client.solrj.cloud.SolrCloudManager;
 import org.apache.solr.client.solrj.cloud.VersionedData;
-import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
 import org.apache.solr.client.solrj.impl.NodeValueFetcher;
 import org.apache.solr.client.solrj.request.CoreAdminRequest;
 import org.apache.solr.client.solrj.request.MetricsRequest;
@@ -879,7 +878,7 @@ public class SplitShardCmd implements 
CollApiCmds.CollectionApiCommand {
     var req = new MetricsRequest(params);
     req.setResponseParser(new InputStreamResponseParser("prometheus"));
 
-    var cloudClient = (CloudHttp2SolrClient) cloudManager.getSolrClient();
+    var cloudClient = cloudManager.getSolrClient();
     var httpClient = cloudClient.getHttpClient();
 
     NamedList<Object> resp =
diff --git 
a/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java 
b/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java
index b52177d006f..9b7053adda5 100644
--- 
a/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java
+++ 
b/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java
@@ -41,7 +41,6 @@ import org.apache.solr.client.solrj.RemoteSolrException;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
-import org.apache.solr.client.solrj.jetty.CloudJettySolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.request.SolrQuery;
@@ -157,7 +156,7 @@ public class ShardSplitTest extends BasicDistributedZkTest {
         builder
             .withDefaultCollection(collectionName)
             .sendUpdatesOnlyToShardLeaders()
-            .withHttpClient(((CloudJettySolrClient) 
cloudClient).getHttpClient())
+            .withHttpClient(cloudClient.getHttpClient())
             .build()) {
       StoppableIndexingThread thread =
           new StoppableIndexingThread(controlClient, client, "i1", true);
diff --git a/solr/solr-ref-guide/modules/deployment-guide/pages/solrj.adoc 
b/solr/solr-ref-guide/modules/deployment-guide/pages/solrj.adoc
index decefc3f36f..aabf9d73fc0 100644
--- a/solr/solr-ref-guide/modules/deployment-guide/pages/solrj.adoc
+++ b/solr/solr-ref-guide/modules/deployment-guide/pages/solrj.adoc
@@ -183,8 +183,8 @@ processing time of the largest update request.
 
 === Cloud Request Routing
 
-The SolrJ `CloudSolrClient` implementations (`CloudSolrClient` and 
`CloudHttp2SolrClient`) respect the 
xref:solrcloud-distributed-requests.adoc#shards-preference-parameter[shards.preference
 parameter].
-Therefore requests sent to single-sharded collections, using either of the 
above clients, will route requests the same way that distributed requests are 
routed to individual shards.
+SolrJ `CloudSolrClient` respects the 
xref:solrcloud-distributed-requests.adoc#shards-preference-parameter[shards.preference
 parameter].
+Therefore requests sent to single-sharded collections will route requests the 
same way that distributed requests are routed to individual shards.
 If no `shards.preference` parameter is provided, the clients will default to 
sorting replicas randomly.
 
 For update requests, while the replicas are sorted in the order defined by the 
request, leader replicas will always be sorted first.
diff --git 
a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/SolrClientNodeStateProvider.java
 
b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/SolrClientNodeStateProvider.java
index 44e4babce6d..a0fadf60590 100644
--- 
a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/SolrClientNodeStateProvider.java
+++ 
b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/SolrClientNodeStateProvider.java
@@ -53,7 +53,7 @@ import org.slf4j.LoggerFactory;
 public class SolrClientNodeStateProvider implements NodeStateProvider, 
MapWriter {
   private static final Logger log = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-  private final CloudHttp2SolrClient solrClient;
+  private final CloudSolrClient solrClient;
   protected final Map<String, Map<String, Map<String, List<Replica>>>>
       nodeVsCollectionVsShardVsReplicaInfo = new HashMap<>();
 
@@ -61,11 +61,7 @@ public class SolrClientNodeStateProvider implements 
NodeStateProvider, MapWriter
   private Map<String, Map> nodeVsTags = new HashMap<>();
 
   public SolrClientNodeStateProvider(CloudSolrClient solrClient) {
-    if (!(solrClient instanceof CloudHttp2SolrClient)) {
-      throw new IllegalArgumentException(
-          "The passed-in CloudSolrClient must be a " + 
CloudHttp2SolrClient.class);
-    }
-    this.solrClient = (CloudHttp2SolrClient) solrClient;
+    this.solrClient = solrClient;
     try {
       readReplicaDetails();
     } catch (IOException e) {
@@ -242,7 +238,7 @@ public class SolrClientNodeStateProvider implements 
NodeStateProvider, MapWriter
   static class RemoteCallCtx {
 
     ZkClientClusterStateProvider zkClientClusterStateProvider;
-    CloudHttp2SolrClient cloudSolrClient;
+    CloudSolrClient cloudSolrClient;
     public final Map<String, Object> tags = new HashMap<>();
     private final String node;
     public Map<String, Object> session;
@@ -254,7 +250,7 @@ public class SolrClientNodeStateProvider implements 
NodeStateProvider, MapWriter
       return true;
     }
 
-    public RemoteCallCtx(String node, CloudHttp2SolrClient cloudSolrClient) {
+    public RemoteCallCtx(String node, CloudSolrClient cloudSolrClient) {
       this.node = node;
       this.cloudSolrClient = cloudSolrClient;
       this.zkClientClusterStateProvider =
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 0118b680428..067b26cf373 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
@@ -102,6 +102,7 @@ public class CloudHttp2SolrClient extends CloudSolrClient {
     return stateProvider;
   }
 
+  @Override
   public HttpSolrClient getHttpClient() {
     return myClient;
   }
diff --git 
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java 
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
index b9b52442297..220f1a72f64 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
@@ -220,6 +220,9 @@ public abstract class CloudSolrClient extends SolrClient {
     }
   }
 
+  /** The HttpSolrClient that underlies this one. It has no baseUrl or default 
collection. */
+  public abstract HttpSolrClient getHttpClient();
+
   public ResponseParser getParser() {
     return getLbClient().getParser();
   }
diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientCacheTest.java
 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientCacheTest.java
index 706e334f1d1..18a279cbcd2 100644
--- 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientCacheTest.java
+++ 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientCacheTest.java
@@ -424,6 +424,11 @@ public class CloudSolrClientCacheTest extends 
SolrTestCaseJ4 {
       return provider;
     }
 
+    @Override
+    public HttpSolrClient getHttpClient() {
+      throw new UnsupportedOperationException();
+    }
+
     @FunctionalInterface
     interface Invocation {
       NamedList<Object> invoke(SolrRequest<?> request, List<String> 
inputCollections)
diff --git 
a/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractCloudBackupRestoreTestCase.java
 
b/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractCloudBackupRestoreTestCase.java
index 3124d5c1451..f569f3f12e0 100644
--- 
a/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractCloudBackupRestoreTestCase.java
+++ 
b/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractCloudBackupRestoreTestCase.java
@@ -32,7 +32,6 @@ import java.util.UUID;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
-import org.apache.solr.client.solrj.jetty.CloudJettySolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest.ClusterProp;
 import org.apache.solr.client.solrj.request.QueryRequest;
@@ -467,12 +466,13 @@ public abstract class AbstractCloudBackupRestoreTestCase 
extends SolrCloudTestCa
   public static Map<String, Integer> getShardToDocCountMap(
       CloudSolrClient client, DocCollection docCollection) throws 
SolrServerException, IOException {
     Map<String, Integer> shardToDocCount = new TreeMap<>();
-    var jettySolrClient = ((CloudJettySolrClient) client).getHttpClient();
     for (Slice slice : docCollection.getActiveSlices()) {
       long docsInShard =
           new QueryRequest("/select", params("q", "*:*", "distrib", "false"))
               .processWithBaseUrl(
-                  jettySolrClient, slice.getLeader().getBaseUrl(), 
slice.getLeader().getCoreName())
+                  client.getHttpClient(),
+                  slice.getLeader().getBaseUrl(),
+                  slice.getLeader().getCoreName())
               .getResults()
               .getNumFound();
       shardToDocCount.put(slice.getName(), (int) docsInShard);

Reply via email to