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 200c9a6607d0..6740c5ba046d 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 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 static void checkDiskSpace( var req = new MetricsRequest(params); req.setResponseParser(new InputStreamResponseParser("prometheus")); - var cloudClient = (CloudHttp2SolrClient) cloudManager.getSolrClient(); + var cloudClient = cloudManager.getSolrClient(); var httpClient = cloudClient.getHttpClient(); NamedList 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 b52177d006fb..9b7053adda55 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.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 @@ private void doSplitStaticIndexReplication(SolrIndexSplitter.SplitMethod splitMe 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 decefc3f36f9..aabf9d73fc0d 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 44e4babce6dc..a0fadf60590a 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 @@ 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>>> nodeVsCollectionVsShardVsReplicaInfo = new HashMap<>(); @@ -61,11 +61,7 @@ public class SolrClientNodeStateProvider implements NodeStateProvider, MapWriter private 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 String toString() { static class RemoteCallCtx { ZkClientClusterStateProvider zkClientClusterStateProvider; - CloudHttp2SolrClient cloudSolrClient; + CloudSolrClient cloudSolrClient; public final Map tags = new HashMap<>(); private final String node; public Map session; @@ -254,7 +250,7 @@ public boolean isNodeAlive(String node) { 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 0118b6804280..067b26cf373d 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 ClusterStateProvider getClusterStateProvider() { 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 69e5c8d58095..d6907904accd 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 @@ -639,6 +639,9 @@ public void close() { } } + /** 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 706e334f1d16..18a279cbcd2c 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 ClusterStateProvider getClusterStateProvider() { return provider; } + @Override + public HttpSolrClient getHttpClient() { + throw new UnsupportedOperationException(); + } + @FunctionalInterface interface Invocation { NamedList invoke(SolrRequest request, List 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 3124d5c14511..f569f3f12e00 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 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 @@ private void testBackupAndRestore(String collectionName) throws Exception { public static Map getShardToDocCountMap( CloudSolrClient client, DocCollection docCollection) throws SolrServerException, IOException { Map 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);