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

gerlowskija 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 2a39d203b0f SOLR-17256: Remove usages of deprecated 
SolrRequest.setBasePath (#2811)
2a39d203b0f is described below

commit 2a39d203b0f7b531b01acd73def5b453a3133ba8
Author: Jason Gerlowski <[email protected]>
AuthorDate: Tue Nov 5 10:56:52 2024 -0500

    SOLR-17256: Remove usages of deprecated SolrRequest.setBasePath (#2811)
    
    A previous commit deprecated SolrRequest.setBasePath but left it still
    used throughout Solr's codebase.  This commit switches (almost) all
    usage over to the safer `Http2SolrClient.requestWithBaseUrl`.
    
    This will allow setBasePath to be removed more easily in the future.
    
    ---------
    
    Co-authored-by: David Smiley <[email protected]>
---
 .../org/apache/solr/bench/MiniClusterState.java    | 36 ++++++++++------------
 .../org/apache/solr/bench/index/CloudIndexing.java |  6 ++--
 .../org/apache/solr/bench/search/FilterCache.java  | 17 +++++-----
 .../org/apache/solr/bench/search/JsonFaceting.java | 10 +++---
 .../apache/solr/bench/search/NumericSearch.java    |  8 ++---
 .../solr/bench/search/QueryResponseWriters.java    |  1 -
 .../org/apache/solr/bench/search/SimpleSearch.java |  3 --
 .../solr/bench/MiniClusterBenchStateTest.java      |  3 --
 .../java/org/apache/solr/cloud/ZkController.java   |  8 ++---
 .../java/org/apache/solr/handler/IndexFetcher.java |  3 +-
 .../org/apache/solr/update/PeerSyncWithLeader.java |  7 ++---
 .../org/apache/solr/update/SolrCmdDistributor.java |  5 +--
 .../processor/DistributedUpdateProcessor.java      |  7 +++--
 .../apache/solr/handler/ReplicationTestHelper.java |  8 ++---
 .../TestUserManagedReplicationWithAuth.java        | 14 ++++-----
 .../solrj/impl/SolrClientNodeStateProvider.java    |  6 +---
 .../solr/common/cloud/NodesSysPropsCacher.java     | 12 +++++---
 .../impl/ConcurrentUpdateHttp2SolrClient.java      | 19 ++++++------
 .../solr/client/solrj/impl/LBHttp2SolrClient.java  | 29 +++++++++--------
 .../solr/client/solrj/impl/LBSolrClient.java       | 33 +++++++++++++++-----
 .../client/solrj/request/HealthCheckRequest.java   |  5 +--
 .../client/solrj/impl/Http2SolrClientTest.java     | 16 +++++++++-
 .../client/solrj/impl/HttpJdkSolrClientTest.java   |  9 ------
 .../client/solrj/impl/HttpSolrClientTestBase.java  | 28 -----------------
 .../client/solrj/impl/LBHttp2SolrClientTest.java   | 28 ++++++++++++++---
 25 files changed, 166 insertions(+), 155 deletions(-)

diff --git 
a/solr/benchmark/src/java/org/apache/solr/bench/MiniClusterState.java 
b/solr/benchmark/src/java/org/apache/solr/bench/MiniClusterState.java
index 88bfc05af1f..34a970b3392 100755
--- a/solr/benchmark/src/java/org/apache/solr/bench/MiniClusterState.java
+++ b/solr/benchmark/src/java/org/apache/solr/bench/MiniClusterState.java
@@ -37,7 +37,6 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
-import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.Http2SolrClient;
@@ -84,7 +83,7 @@ public class MiniClusterState {
     MiniSolrCloudCluster cluster;
 
     /** The Client. */
-    public SolrClient client;
+    public Http2SolrClient client;
 
     /** The Run cnt. */
     int runCnt = 0;
@@ -288,7 +287,7 @@ public class MiniClusterState {
       }
       zkHost = cluster.getZkServer().getZkAddress();
 
-      client = new Http2SolrClient.Builder().useHttp1_1(useHttp1).build();
+      client = new 
Http2SolrClient.Builder(nodes.get(0)).useHttp1_1(useHttp1).build();
 
       log("done starting mini cluster");
       log("");
@@ -318,9 +317,8 @@ public class MiniClusterState {
 
           CollectionAdminRequest.Create request =
               CollectionAdminRequest.createCollection(collection, "conf", 
numShards, numReplicas);
-          
request.setBasePath(nodes.get(random.nextInt(cluster.getJettySolrRunners().size())));
-
-          client.request(request);
+          client.requestWithBaseUrl(
+              nodes.get(random.nextInt(cluster.getJettySolrRunners().size())), 
null, request);
 
           cluster.waitForActiveCollection(
               collection, 15, TimeUnit.SECONDS, numShards, numShards * 
numReplicas);
@@ -368,18 +366,19 @@ public class MiniClusterState {
 
         log("committing data ...");
         UpdateRequest commitRequest = new UpdateRequest();
-        
commitRequest.setBasePath(nodes.get(random.nextInt(cluster.getJettySolrRunners().size())));
+        final var url = 
nodes.get(random.nextInt(cluster.getJettySolrRunners().size()));
         commitRequest.setAction(UpdateRequest.ACTION.COMMIT, false, true);
-        commitRequest.process(client, collection);
+        client.requestWithBaseUrl(url, collection, commitRequest);
         log("done committing data");
       } else {
         cluster.waitForActiveCollection(collection, 15, TimeUnit.SECONDS);
       }
 
       QueryRequest queryRequest = new QueryRequest(new SolrQuery("q", "*:*", 
"rows", "1"));
-      
queryRequest.setBasePath(nodes.get(random.nextInt(cluster.getJettySolrRunners().size())));
+      final var url = 
nodes.get(random.nextInt(cluster.getJettySolrRunners().size()));
+      NamedList<Object> result =
+          client.requestWithBaseUrl(url, collection, 
queryRequest).getResponse();
 
-      NamedList<Object> result = client.request(queryRequest, collection);
       log("sanity check of single row query result: " + result);
       log("");
 
@@ -417,15 +416,15 @@ public class MiniClusterState {
               @Override
               public void run() {
                 UpdateRequest updateRequest = new UpdateRequest();
-                updateRequest.setBasePath(
-                    
nodes.get(threadRandom.nextInt(cluster.getJettySolrRunners().size())));
+                final var url =
+                    
nodes.get(threadRandom.nextInt(cluster.getJettySolrRunners().size()));
                 SolrInputDocument doc = docs.inputDocument();
                 // log("add doc " + doc);
                 updateRequest.add(doc);
                 meter.mark();
 
                 try {
-                  client.request(updateRequest, collection);
+                  client.requestWithBaseUrl(url, collection, updateRequest);
                 } catch (Exception e) {
                   throw new RuntimeException(e);
                 }
@@ -452,9 +451,8 @@ public class MiniClusterState {
         batch.add(docs.inputDocument());
         if (i % batchSize == 0) {
           UpdateRequest updateRequest = new UpdateRequest();
-          updateRequest.setBasePath(nodes.get(0));
           updateRequest.add(batch);
-          client.request(updateRequest, collection);
+          client.requestWithBaseUrl(nodes.get(0), collection, updateRequest);
           meter.mark(batch.size());
           batch.clear();
           log(meter.getCount() + " docs at " + (long) meter.getMeanRate() + " 
doc/s");
@@ -462,9 +460,8 @@ public class MiniClusterState {
       }
       if (!batch.isEmpty()) {
         UpdateRequest updateRequest = new UpdateRequest();
-        updateRequest.setBasePath(nodes.get(0));
         updateRequest.add(batch);
-        client.request(updateRequest, collection);
+        client.requestWithBaseUrl(nodes.get(0), collection, updateRequest);
         meter.mark(batch.size());
         batch = null;
       }
@@ -500,10 +497,9 @@ public class MiniClusterState {
         }
 
         UpdateRequest optimizeRequest = new UpdateRequest();
-        optimizeRequest.setBasePath(
-            nodes.get(random.nextInt(cluster.getJettySolrRunners().size())));
+        final var url = 
nodes.get(random.nextInt(cluster.getJettySolrRunners().size()));
         optimizeRequest.setAction(UpdateRequest.ACTION.OPTIMIZE, false, true, 
maxMergeSegments);
-        optimizeRequest.process(client, collection);
+        client.requestWithBaseUrl(url, collection, optimizeRequest);
       }
     }
 
diff --git 
a/solr/benchmark/src/java/org/apache/solr/bench/index/CloudIndexing.java 
b/solr/benchmark/src/java/org/apache/solr/bench/index/CloudIndexing.java
index 820f2130a60..0ee950e7231 100755
--- a/solr/benchmark/src/java/org/apache/solr/bench/index/CloudIndexing.java
+++ b/solr/benchmark/src/java/org/apache/solr/bench/index/CloudIndexing.java
@@ -127,9 +127,9 @@ public class CloudIndexing {
   public Object indexDoc(MiniClusterState.MiniClusterBenchState 
miniClusterState, BenchState state)
       throws Exception {
     UpdateRequest updateRequest = new UpdateRequest();
-    updateRequest.setBasePath(
-        
miniClusterState.nodes.get(miniClusterState.getRandom().nextInt(state.nodeCount)));
     updateRequest.add(state.getNextDoc());
-    return miniClusterState.client.request(updateRequest, 
BenchState.COLLECTION);
+    final var url =
+        
miniClusterState.nodes.get(miniClusterState.getRandom().nextInt(state.nodeCount));
+    return miniClusterState.client.requestWithBaseUrl(url, 
BenchState.COLLECTION, updateRequest);
   }
 }
diff --git 
a/solr/benchmark/src/java/org/apache/solr/bench/search/FilterCache.java 
b/solr/benchmark/src/java/org/apache/solr/bench/search/FilterCache.java
index e518ff90865..6b7f6bf4a4f 100644
--- a/solr/benchmark/src/java/org/apache/solr/bench/search/FilterCache.java
+++ b/solr/benchmark/src/java/org/apache/solr/bench/search/FilterCache.java
@@ -68,6 +68,7 @@ public class FilterCache {
 
     QueryRequest q1 = new QueryRequest(new SolrQuery("q", "*:*", "fq", 
"Ea_b:true"));
     QueryRequest q2 = new QueryRequest(new SolrQuery("q", "*:*", "fq", 
"FB_b:true"));
+    String baseUrl;
 
     @Setup(Level.Trial)
     public void setupTrial(MiniClusterState.MiniClusterBenchState 
miniClusterState)
@@ -100,9 +101,7 @@ public class FilterCache {
       docs.field("FB_b", booleans);
 
       miniClusterState.index(COLLECTION, docs, 30 * 1000);
-      String base = miniClusterState.nodes.get(0);
-      q1.setBasePath(base);
-      q2.setBasePath(base);
+      baseUrl = miniClusterState.nodes.get(0);
     }
 
     @Setup(Level.Iteration)
@@ -110,8 +109,7 @@ public class FilterCache {
         throws SolrServerException, IOException {
       // Reload the collection/core to drop existing caches
       CollectionAdminRequest.Reload reload = 
CollectionAdminRequest.reloadCollection(COLLECTION);
-      reload.setBasePath(miniClusterState.nodes.get(0));
-      miniClusterState.client.request(reload);
+      
miniClusterState.client.requestWithBaseUrl(miniClusterState.nodes.get(0), null, 
reload);
     }
 
     @TearDown(Level.Iteration)
@@ -139,14 +137,17 @@ public class FilterCache {
   public Object filterCacheMultipleQueries(
       BenchState benchState, MiniClusterState.MiniClusterBenchState 
miniClusterState)
       throws SolrServerException, IOException {
-    return miniClusterState.client.request(
-        miniClusterState.getRandom().nextBoolean() ? benchState.q1 : 
benchState.q2, COLLECTION);
+    return miniClusterState.client.requestWithBaseUrl(
+        benchState.baseUrl,
+        COLLECTION,
+        miniClusterState.getRandom().nextBoolean() ? benchState.q1 : 
benchState.q2);
   }
 
   @Benchmark
   public Object filterCacheSingleQuery(
       BenchState benchState, MiniClusterState.MiniClusterBenchState 
miniClusterState)
       throws SolrServerException, IOException {
-    return miniClusterState.client.request(benchState.q1, COLLECTION);
+    return miniClusterState.client.requestWithBaseUrl(
+        benchState.baseUrl, COLLECTION, benchState.q1);
   }
 }
diff --git 
a/solr/benchmark/src/java/org/apache/solr/bench/search/JsonFaceting.java 
b/solr/benchmark/src/java/org/apache/solr/bench/search/JsonFaceting.java
index 498faed5814..1595de56d3b 100755
--- a/solr/benchmark/src/java/org/apache/solr/bench/search/JsonFaceting.java
+++ b/solr/benchmark/src/java/org/apache/solr/bench/search/JsonFaceting.java
@@ -180,11 +180,13 @@ public class JsonFaceting {
       BenchState state,
       BenchState.ThreadState threadState)
       throws Exception {
+    final var url = 
miniClusterState.nodes.get(threadState.random.nextInt(state.nodeCount));
     QueryRequest queryRequest = new QueryRequest(state.params);
-    queryRequest.setBasePath(
-        
miniClusterState.nodes.get(threadState.random.nextInt(state.nodeCount)));
-
-    NamedList<Object> result = miniClusterState.client.request(queryRequest, 
state.collection);
+    NamedList<Object> result =
+        miniClusterState
+            .client
+            .requestWithBaseUrl(url, state.collection, queryRequest)
+            .getResponse();
 
     // MiniClusterState.log("result: " + result);
 
diff --git 
a/solr/benchmark/src/java/org/apache/solr/bench/search/NumericSearch.java 
b/solr/benchmark/src/java/org/apache/solr/bench/search/NumericSearch.java
index 3c7a72385f9..4d662205230 100644
--- a/solr/benchmark/src/java/org/apache/solr/bench/search/NumericSearch.java
+++ b/solr/benchmark/src/java/org/apache/solr/bench/search/NumericSearch.java
@@ -101,8 +101,8 @@ public class NumericSearch {
       q.setParam("facet.field", "numbers_i_dv", "term_low_s", "term_high_s");
       q.setParam("facet.limit", String.valueOf(maxCardinality));
       QueryRequest req = new QueryRequest(q);
-      req.setBasePath(basePath);
-      QueryResponse response = req.process(miniClusterState.client, 
COLLECTION);
+      QueryResponse response =
+          miniClusterState.client.requestWithBaseUrl(basePath, COLLECTION, 
req);
       Set<String> numbers =
           response.getFacetField("numbers_i_dv").getValues().stream()
               .map(FacetField.Count::getName)
@@ -144,8 +144,7 @@ public class NumericSearch {
         throws SolrServerException, IOException {
       // Reload the collection/core to drop existing caches
       CollectionAdminRequest.Reload reload = 
CollectionAdminRequest.reloadCollection(COLLECTION);
-      reload.setBasePath(miniClusterState.nodes.get(0));
-      miniClusterState.client.request(reload);
+      
miniClusterState.client.requestWithBaseUrl(miniClusterState.nodes.get(0), null, 
reload);
     }
 
     public QueryRequest intSetQuery(boolean dvs) {
@@ -172,7 +171,6 @@ public class NumericSearch {
                   termQueryField + ":" + lowCardTerms.next(),
                   "fq",
                   "{!terms cache=false f='" + field + "'}" + queries.next()));
-      q.setBasePath(basePath);
       return q;
     }
   }
diff --git 
a/solr/benchmark/src/java/org/apache/solr/bench/search/QueryResponseWriters.java
 
b/solr/benchmark/src/java/org/apache/solr/bench/search/QueryResponseWriters.java
index 15b4526d49e..30cd848d0ee 100644
--- 
a/solr/benchmark/src/java/org/apache/solr/bench/search/QueryResponseWriters.java
+++ 
b/solr/benchmark/src/java/org/apache/solr/bench/search/QueryResponseWriters.java
@@ -98,7 +98,6 @@ public class QueryResponseWriters {
       q = new QueryRequest(params);
       q.setResponseParser(new NoOpResponseParser(wt));
       String base = miniClusterState.nodes.get(0);
-      q.setBasePath(base);
     }
   }
 
diff --git 
a/solr/benchmark/src/java/org/apache/solr/bench/search/SimpleSearch.java 
b/solr/benchmark/src/java/org/apache/solr/bench/search/SimpleSearch.java
index 165d68ecb3b..46982b33b89 100644
--- a/solr/benchmark/src/java/org/apache/solr/bench/search/SimpleSearch.java
+++ b/solr/benchmark/src/java/org/apache/solr/bench/search/SimpleSearch.java
@@ -65,8 +65,6 @@ public class SimpleSearch {
       miniClusterState.setUseHttp1(useHttp1);
       miniClusterState.startMiniCluster(1);
       miniClusterState.createCollection(COLLECTION, 1, 1);
-      String base = miniClusterState.nodes.get(0);
-      q.setBasePath(base);
     }
 
     @Setup(Level.Iteration)
@@ -74,7 +72,6 @@ public class SimpleSearch {
         throws SolrServerException, IOException {
       // Reload the collection/core to drop existing caches
       CollectionAdminRequest.Reload reload = 
CollectionAdminRequest.reloadCollection(COLLECTION);
-      reload.setBasePath(miniClusterState.nodes.get(0));
       miniClusterState.client.request(reload);
 
       total = new AtomicLong();
diff --git 
a/solr/benchmark/src/test/org/apache/solr/bench/MiniClusterBenchStateTest.java 
b/solr/benchmark/src/test/org/apache/solr/bench/MiniClusterBenchStateTest.java
index e17ed29dcd8..af568e3bb98 100644
--- 
a/solr/benchmark/src/test/org/apache/solr/bench/MiniClusterBenchStateTest.java
+++ 
b/solr/benchmark/src/test/org/apache/solr/bench/MiniClusterBenchStateTest.java
@@ -118,10 +118,7 @@ public class MiniClusterBenchStateTest extends 
SolrTestCaseJ4 {
     miniBenchState.forceMerge(collection, 15);
 
     ModifiableSolrParams params = MiniClusterState.params("q", "*:*");
-
     QueryRequest queryRequest = new QueryRequest(params);
-    queryRequest.setBasePath(miniBenchState.nodes.get(0));
-
     QueryResponse result = queryRequest.process(miniBenchState.client, 
collection);
 
     BaseBenchState.log("match all query result=" + result);
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 f7b61765fcd..07e7743e457 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@ -415,10 +415,10 @@ public class ZkController implements Closeable {
     }
     this.overseerCollectionQueue = overseer.getCollectionQueue(zkClient);
     this.overseerConfigSetQueue = overseer.getConfigSetQueue(zkClient);
-    this.sysPropsCacher =
-        new NodesSysPropsCacher(
-            ((HttpShardHandlerFactory) 
getCoreContainer().getShardHandlerFactory()).getClient(),
-            zkStateReader);
+    final var client =
+        (Http2SolrClient)
+            ((HttpShardHandlerFactory) 
getCoreContainer().getShardHandlerFactory()).getClient();
+    this.sysPropsCacher = new NodesSysPropsCacher(client, zkStateReader);
     assert ObjectReleaseTracker.track(this);
   }
 
diff --git a/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java 
b/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
index 09588fb1be3..b609b5fb749 100644
--- a/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
+++ b/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
@@ -1981,9 +1981,8 @@ public class IndexFetcher {
       try {
         QueryRequest req = new QueryRequest(params);
         req.setResponseParser(new InputStreamResponseParser(FILE_STREAM));
-        req.setBasePath(leaderBaseUrl);
         if (useExternalCompression) req.addHeader("Accept-Encoding", "gzip");
-        response = solrClient.request(req, leaderCoreName);
+        response = solrClient.requestWithBaseUrl(leaderBaseUrl, 
leaderCoreName, req).getResponse();
         final var responseStatus = (Integer) response.get("responseStatus");
         is = (InputStream) response.get("stream");
 
diff --git a/solr/core/src/java/org/apache/solr/update/PeerSyncWithLeader.java 
b/solr/core/src/java/org/apache/solr/update/PeerSyncWithLeader.java
index ad7c76d752a..f46e0c161e7 100644
--- a/solr/core/src/java/org/apache/solr/update/PeerSyncWithLeader.java
+++ b/solr/core/src/java/org/apache/solr/update/PeerSyncWithLeader.java
@@ -28,9 +28,9 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.List;
 import java.util.Set;
-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.Http2SolrClient;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.cloud.ZkController;
@@ -54,7 +54,7 @@ public class PeerSyncWithLeader implements SolrMetricProducer 
{
 
   private UpdateHandler uhandler;
   private UpdateLog ulog;
-  private final SolrClient clientToLeader;
+  private final Http2SolrClient clientToLeader;
   private final String coreName;
   private final String leaderBaseUrl;
 
@@ -334,8 +334,7 @@ public class PeerSyncWithLeader implements 
SolrMetricProducer {
   private NamedList<Object> request(ModifiableSolrParams params, String 
onFail) {
     try {
       QueryRequest request = new QueryRequest(params, SolrRequest.METHOD.POST);
-      request.setBasePath(leaderBaseUrl);
-      QueryResponse rsp = request.process(clientToLeader, coreName);
+      QueryResponse rsp = clientToLeader.requestWithBaseUrl(leaderBaseUrl, 
coreName, request);
       Exception exception = rsp.getException();
       if (exception != null) {
         throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, onFail);
diff --git a/solr/core/src/java/org/apache/solr/update/SolrCmdDistributor.java 
b/solr/core/src/java/org/apache/solr/update/SolrCmdDistributor.java
index d31ddc9ca55..7f1998d6c82 100644
--- a/solr/core/src/java/org/apache/solr/update/SolrCmdDistributor.java
+++ b/solr/core/src/java/org/apache/solr/update/SolrCmdDistributor.java
@@ -315,8 +315,9 @@ public class SolrCmdDistributor implements Closeable {
       blockAndDoRetries();
 
       try {
-        req.uReq.setBasePath(req.node.getUrl());
-        clients.getHttpClient().request(req.uReq);
+        clients
+            .getHttpClient()
+            .requestWithBaseUrl(req.node.getBaseUrl(), req.node.getCoreName(), 
req.uReq);
       } catch (Exception e) {
         log.error("Exception making request", e);
         SolrError error = new SolrError();
diff --git 
a/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
 
b/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
index d8c88ac5786..8e3153046ad 100644
--- 
a/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
+++ 
b/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
@@ -692,8 +692,11 @@ public class DistributedUpdateProcessor extends 
UpdateRequestProcessor {
 
     NamedList<Object> rsp;
     try {
-      ur.setBasePath(leaderUrl);
-      rsp = updateShardHandler.getUpdateOnlyHttpClient().request(ur);
+      rsp =
+          updateShardHandler
+              .getUpdateOnlyHttpClient()
+              .requestWithBaseUrl(leaderUrl, null, ur)
+              .getResponse();
     } catch (SolrServerException e) {
       throw new SolrException(
           ErrorCode.SERVER_ERROR,
diff --git 
a/solr/core/src/test/org/apache/solr/handler/ReplicationTestHelper.java 
b/solr/core/src/test/org/apache/solr/handler/ReplicationTestHelper.java
index edd68727f87..2e69ba4915a 100644
--- a/solr/core/src/test/org/apache/solr/handler/ReplicationTestHelper.java
+++ b/solr/core/src/test/org/apache/solr/handler/ReplicationTestHelper.java
@@ -33,7 +33,7 @@ import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
+import org.apache.solr.client.solrj.impl.Http2SolrClient;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.common.SolrDocumentList;
@@ -76,11 +76,11 @@ public final class ReplicationTestHelper {
    * @param baseUrl the root URL for a Solr node
    * @param collectionOrCore an optional default collection/core for the 
created client
    */
-  public static SolrClient createNewSolrClient(String baseUrl, String 
collectionOrCore) {
-    return new HttpSolrClient.Builder(baseUrl)
+  public static Http2SolrClient createNewSolrClient(String baseUrl, String 
collectionOrCore) {
+    return new Http2SolrClient.Builder(baseUrl)
         .withDefaultCollection(collectionOrCore)
         .withConnectionTimeout(15000, TimeUnit.MILLISECONDS)
-        .withSocketTimeout(90000, TimeUnit.MILLISECONDS)
+        .withIdleTimeout(90000, TimeUnit.MILLISECONDS)
         .build();
   }
 
diff --git 
a/solr/core/src/test/org/apache/solr/handler/TestUserManagedReplicationWithAuth.java
 
b/solr/core/src/test/org/apache/solr/handler/TestUserManagedReplicationWithAuth.java
index b230aad2021..98a5684791d 100644
--- 
a/solr/core/src/test/org/apache/solr/handler/TestUserManagedReplicationWithAuth.java
+++ 
b/solr/core/src/test/org/apache/solr/handler/TestUserManagedReplicationWithAuth.java
@@ -33,6 +33,7 @@ import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrResponse;
 import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.impl.Http2SolrClient;
 import org.apache.solr.client.solrj.request.HealthCheckRequest;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
@@ -48,7 +49,7 @@ import org.junit.Test;
 @SuppressSSL
 public class TestUserManagedReplicationWithAuth extends SolrTestCaseJ4 {
   JettySolrRunner leaderJetty, followerJetty, followerJettyWithAuth;
-  SolrClient leaderClient, followerClient, followerClientWithAuth;
+  Http2SolrClient leaderClient, followerClient, followerClientWithAuth;
   ReplicationTestHelper.SolrInstance leader = null, follower = null, 
followerWithAuth = null;
 
   private static String user = "solr";
@@ -227,7 +228,7 @@ public class TestUserManagedReplicationWithAuth extends 
SolrTestCaseJ4 {
     return withBasicAuth(new QueryRequest(q)).process(client);
   }
 
-  private void disablePoll(JettySolrRunner Jetty, SolrClient solrClient)
+  private void disablePoll(JettySolrRunner Jetty, Http2SolrClient solrClient)
       throws SolrServerException, IOException {
     ModifiableSolrParams disablePollParams = new ModifiableSolrParams();
     disablePollParams.set(COMMAND, CMD_DISABLE_POLL);
@@ -235,19 +236,18 @@ public class TestUserManagedReplicationWithAuth extends 
SolrTestCaseJ4 {
     disablePollParams.set(CommonParams.QT, ReplicationHandler.PATH);
     QueryRequest req = new QueryRequest(disablePollParams);
     withBasicAuth(req);
-    req.setBasePath(buildUrl(Jetty.getLocalPort()));
 
-    solrClient.request(req, DEFAULT_TEST_CORENAME);
+    final var baseUrl = buildUrl(Jetty.getLocalPort());
+    solrClient.requestWithBaseUrl(baseUrl, DEFAULT_TEST_CORENAME, req);
   }
 
   private void pullIndexFromTo(
       JettySolrRunner srcSolr, JettySolrRunner destSolr, boolean authEnabled)
       throws SolrServerException, IOException {
     String srcUrl = buildUrl(srcSolr.getLocalPort()) + "/" + 
DEFAULT_TEST_CORENAME;
-    String destUrl = buildUrl(destSolr.getLocalPort()) + "/" + 
DEFAULT_TEST_CORENAME;
     QueryRequest req = getQueryRequestForFetchIndex(authEnabled, srcUrl);
-    req.setBasePath(buildUrl(destSolr.getLocalPort()));
-    followerClient.request(req, DEFAULT_TEST_CORENAME);
+    final var baseUrl = buildUrl(destSolr.getLocalPort());
+    followerClient.requestWithBaseUrl(baseUrl, DEFAULT_TEST_CORENAME, req);
   }
 
   private QueryRequest getQueryRequestForFetchIndex(boolean authEnabled, 
String srcUrl) {
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 984e1b7a18f..a9789c8a141 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
@@ -44,7 +44,6 @@ import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
-import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.Pair;
 import org.apache.solr.common.util.Utils;
 import org.slf4j.Logger;
@@ -293,10 +292,7 @@ public class SolrClientNodeStateProvider implements 
NodeStateProvider, MapWriter
       request.setResponseParser(new BinaryResponseParser());
 
       try {
-        NamedList<Object> rsp =
-            cloudSolrClient.getHttpClient().requestWithBaseUrl(url, 
request::process).getResponse();
-        request.response.setResponse(rsp);
-        return request.response;
+        return cloudSolrClient.getHttpClient().requestWithBaseUrl(url, 
request::process);
       } catch (SolrServerException | IOException e) {
         throw new SolrException(ErrorCode.SERVER_ERROR, "Fetching replica 
metrics failed", e);
       }
diff --git 
a/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/NodesSysPropsCacher.java
 
b/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/NodesSysPropsCacher.java
index df9a7c5dbde..37699901323 100644
--- 
a/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/NodesSysPropsCacher.java
+++ 
b/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/NodesSysPropsCacher.java
@@ -21,8 +21,8 @@ import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
-import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrRequest;
+import org.apache.solr.client.solrj.impl.Http2SolrClient;
 import org.apache.solr.client.solrj.request.GenericSolrRequest;
 import org.apache.solr.common.MapWriter;
 import org.apache.solr.common.NavigableObject;
@@ -35,9 +35,9 @@ public class NodesSysPropsCacher implements NodesSysProps, 
AutoCloseable {
   private volatile boolean isClosed = false;
   private final Map<String, Map<String, Object>> nodeVsTagsCache = new 
ConcurrentHashMap<>();
   private ZkStateReader zkStateReader;
-  private final SolrClient solrClient;
+  private final Http2SolrClient solrClient;
 
-  public NodesSysPropsCacher(SolrClient solrClient, ZkStateReader 
zkStateReader) {
+  public NodesSysPropsCacher(Http2SolrClient solrClient, ZkStateReader 
zkStateReader) {
     this.zkStateReader = zkStateReader;
     this.solrClient = solrClient;
     zkStateReader.registerLiveNodesListener(
@@ -86,10 +86,12 @@ public class NodesSysPropsCacher implements NodesSysProps, 
AutoCloseable {
     }
 
     GenericSolrRequest req = new GenericSolrRequest(SolrRequest.METHOD.GET, 
"/admin/metrics", msp);
-    req.setBasePath(zkStateReader.getBaseUrlForNodeName(nodeName));
     try {
       LinkedHashMap<String, Object> result = new LinkedHashMap<>();
-      NavigableObject response = solrClient.request(req);
+      NavigableObject response =
+          solrClient
+              
.requestWithBaseUrl(zkStateReader.getBaseUrlForNodeName(nodeName), null, req)
+              .getResponse();
       NavigableObject metrics = (NavigableObject) response._get("metrics", 
MapWriter.EMPTY);
       keys.forEach((tag, key) -> result.put(tag, metrics._get(key, null)));
       return result;
diff --git 
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ConcurrentUpdateHttp2SolrClient.java
 
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ConcurrentUpdateHttp2SolrClient.java
index 417e985d901..5065256070c 100644
--- 
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ConcurrentUpdateHttp2SolrClient.java
+++ 
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ConcurrentUpdateHttp2SolrClient.java
@@ -367,14 +367,14 @@ public class ConcurrentUpdateHttp2SolrClient extends 
SolrClient {
   @Override
   public NamedList<Object> request(final SolrRequest<?> request, String 
collection)
       throws SolrServerException, IOException {
-    if (ClientUtils.shouldApplyDefaultCollection(collection, request))
-      collection = defaultCollection;
+    final String effectiveCollection =
+        ClientUtils.shouldApplyDefaultCollection(collection, request)
+            ? defaultCollection
+            : collection;
     if (!(request instanceof UpdateRequest)) {
-      request.setBasePath(basePath);
-      return client.request(request, collection);
+      return client.requestWithBaseUrl(basePath, (c) -> c.request(request, 
effectiveCollection));
     }
     UpdateRequest req = (UpdateRequest) request;
-    req.setBasePath(basePath);
     // this happens for commit...
     if (streamDeletes) {
       if ((req.getDocuments() == null || req.getDocuments().isEmpty())
@@ -382,13 +382,14 @@ public class ConcurrentUpdateHttp2SolrClient extends 
SolrClient {
           && (req.getDeleteByIdMap() == null || 
req.getDeleteByIdMap().isEmpty())) {
         if (req.getDeleteQuery() == null) {
           blockUntilFinished();
-          return client.request(request, collection);
+          return client.requestWithBaseUrl(
+              basePath, (c) -> c.request(request, effectiveCollection));
         }
       }
     } else {
       if ((req.getDocuments() == null || req.getDocuments().isEmpty())) {
         blockUntilFinished();
-        return client.request(request, collection);
+        return client.requestWithBaseUrl(basePath, (c) -> c.request(request, 
effectiveCollection));
       }
     }
 
@@ -398,7 +399,7 @@ public class ConcurrentUpdateHttp2SolrClient extends 
SolrClient {
       if (params.getBool(UpdateParams.WAIT_SEARCHER, false)) {
         log.info("blocking for commit/optimize");
         blockUntilFinished(); // empty the queue
-        return client.request(request, collection);
+        return client.requestWithBaseUrl(basePath, (c) -> c.request(request, 
effectiveCollection));
       }
     }
 
@@ -408,7 +409,7 @@ public class ConcurrentUpdateHttp2SolrClient extends 
SolrClient {
         tmpLock.await();
       }
 
-      Update update = new Update(req, collection);
+      Update update = new Update(req, effectiveCollection);
       boolean success = queue.offer(update);
 
       long lastStallTime = -1;
diff --git 
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttp2SolrClient.java 
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttp2SolrClient.java
index 12327a6b9fa..15ee0a229d6 100644
--- 
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttp2SolrClient.java
+++ 
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttp2SolrClient.java
@@ -290,18 +290,23 @@ public class LBHttp2SolrClient extends LBSolrClient {
       RetryListener listener) {
     String baseUrl = endpoint.toString();
     rsp.server = baseUrl;
-    req.getRequest().setBasePath(baseUrl);
-    CompletableFuture<NamedList<Object>> future =
-        ((Http2SolrClient) getClient(endpoint)).requestAsync(req.getRequest());
-    future.whenComplete(
-        (result, throwable) -> {
-          if (!future.isCompletedExceptionally()) {
-            onSuccessfulRequest(result, endpoint, rsp, isZombie, listener);
-          } else if (!future.isCancelled()) {
-            onFailedRequest(throwable, endpoint, isNonRetryable, isZombie, 
listener);
-          }
-        });
-    return future;
+    final var client = (Http2SolrClient) getClient(endpoint);
+    try {
+      CompletableFuture<NamedList<Object>> future =
+          client.requestWithBaseUrl(baseUrl, (c) -> 
c.requestAsync(req.getRequest()));
+      future.whenComplete(
+          (result, throwable) -> {
+            if (!future.isCompletedExceptionally()) {
+              onSuccessfulRequest(result, endpoint, rsp, isZombie, listener);
+            } else if (!future.isCancelled()) {
+              onFailedRequest(throwable, endpoint, isNonRetryable, isZombie, 
listener);
+            }
+          });
+      return future;
+    } catch (SolrServerException | IOException e) {
+      // Unreachable, since 'requestWithBaseUrl' above is running the request 
asynchronously
+      throw new RuntimeException(e);
+    }
   }
 
   private void onSuccessfulRequest(
diff --git 
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBSolrClient.java 
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBSolrClient.java
index e8fad19f3ca..4305809f23d 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBSolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBSolrClient.java
@@ -493,8 +493,7 @@ public abstract class LBSolrClient extends SolrClient {
     Exception ex = null;
     try {
       rsp.server = baseUrl;
-      req.getRequest().setBasePath(baseUrl);
-      rsp.rsp = getClient(baseUrl).request(req.getRequest(), (String) null);
+      rsp.rsp = doRequest(baseUrl, req.getRequest(), null);
       if (isZombie) {
         // TODO: zombieServers key is String not Endpoint.
         zombieServers.remove(baseUrl);
@@ -541,6 +540,25 @@ public abstract class LBSolrClient extends SolrClient {
     return ex;
   }
 
+  // TODO SOLR-17541 should remove the need for the special-casing below; 
remove as a part of that
+  // ticket
+  protected NamedList<Object> doRequest(
+      String baseUrl, SolrRequest<?> solrRequest, String collection)
+      throws SolrServerException, IOException {
+    final var solrClient = getClient(baseUrl);
+
+    // Some implementations of LBSolrClient.getClient(...) return a 
Http2SolrClient that may not be
+    // pointed at the desired URL (or any URL for that matter).  We special 
case that here to ensure
+    // the appropriate URL is provided.
+    if (solrClient instanceof Http2SolrClient) {
+      final var httpSolrClient = (Http2SolrClient) solrClient;
+      return httpSolrClient.requestWithBaseUrl(baseUrl, (c) -> 
c.request(solrRequest, collection));
+    }
+
+    // Assume provided client already uses 'baseUrl'
+    return solrClient.request(solrRequest, collection);
+  }
+
   protected abstract SolrClient getClient(String baseUrl);
 
   protected abstract SolrClient getClient(Endpoint endpoint);
@@ -636,8 +654,9 @@ public abstract class LBSolrClient extends SolrClient {
   private void checkAZombieServer(ServerWrapper zombieServer) {
     try {
       QueryRequest queryRequest = new QueryRequest(solrQuery);
-      queryRequest.setBasePath(zombieServer.baseUrl);
-      QueryResponse resp = 
queryRequest.process(getClient(zombieServer.getBaseUrl()));
+      final var responseRaw = doRequest(zombieServer.getBaseUrl(), 
queryRequest, null);
+      final var resp = new QueryResponse();
+      resp.setResponse(responseRaw);
       if (resp.getStatus() == 0) {
         // server has come back up.
         // make sure to remove from zombies before adding to the alive list to 
avoid a race
@@ -755,8 +774,7 @@ public abstract class LBSolrClient extends SolrClient {
       ServerWrapper wrapper = pickServer(serverList, request);
       try {
         ++numServersTried;
-        request.setBasePath(wrapper.baseUrl);
-        return getClient(wrapper.getBaseUrl()).request(request, collection);
+        return doRequest(wrapper.getBaseUrl(), request, collection);
       } catch (SolrException e) {
         // Server is alive but the request was malformed or invalid
         throw e;
@@ -785,8 +803,7 @@ public abstract class LBSolrClient extends SolrClient {
           || (justFailed != null && 
justFailed.containsKey(wrapper.getBaseUrl()))) continue;
       try {
         ++numServersTried;
-        request.setBasePath(wrapper.baseUrl);
-        NamedList<Object> rsp = getClient(wrapper.baseUrl).request(request, 
collection);
+        final var rsp = doRequest(wrapper.baseUrl, request, collection);
         // remove from zombie list *before* adding the alive list to avoid a 
race that could lose a
         // server
         zombieServers.remove(wrapper.getBaseUrl());
diff --git 
a/solr/solrj/src/java/org/apache/solr/client/solrj/request/HealthCheckRequest.java
 
b/solr/solrj/src/java/org/apache/solr/client/solrj/request/HealthCheckRequest.java
index 7937beadd02..77a7165bdf5 100644
--- 
a/solr/solrj/src/java/org/apache/solr/client/solrj/request/HealthCheckRequest.java
+++ 
b/solr/solrj/src/java/org/apache/solr/client/solrj/request/HealthCheckRequest.java
@@ -22,7 +22,8 @@ import static 
org.apache.solr.common.params.CommonParams.HEALTH_CHECK_HANDLER_PA
 import java.util.OptionalInt;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrRequest;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
+import org.apache.solr.client.solrj.impl.BaseHttpSolrClient;
+import org.apache.solr.client.solrj.impl.HttpSolrClientBase;
 import org.apache.solr.client.solrj.response.HealthCheckResponse;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
@@ -58,7 +59,7 @@ public class HealthCheckRequest extends 
SolrRequest<HealthCheckResponse> {
   protected HealthCheckResponse createResponse(SolrClient client) {
     // TODO: Accept requests w/ CloudSolrClient while ensuring that the 
request doesn't get routed
     // to an unintended recipient.
-    assert client instanceof HttpSolrClient;
+    assert client instanceof BaseHttpSolrClient || client instanceof 
HttpSolrClientBase;
     return new HealthCheckResponse();
   }
 
diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/Http2SolrClientTest.java
 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/Http2SolrClientTest.java
index 0e6ee7bb8a2..0748b133d6a 100644
--- 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/Http2SolrClientTest.java
+++ 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/Http2SolrClientTest.java
@@ -30,6 +30,8 @@ import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.request.RequestWriter;
+import org.apache.solr.client.solrj.request.SolrPing;
+import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.MapSolrParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
@@ -118,10 +120,22 @@ public class Http2SolrClientTest extends 
HttpSolrClientTestBase {
     }
   }
 
+  /** test that temporary baseURL overrides are reflected in error messages */
   @Test
   public void testSolrExceptionWithNullBaseurl() throws IOException, 
SolrServerException {
+    final int status = 527;
+    DebugServlet.setErrorCode(status);
+
     try (Http2SolrClient client = new Http2SolrClient.Builder(null).build()) {
-      super.testSolrExceptionWithNullBaseurl(client);
+      try {
+        // if client base url is null, request url will be used in exception 
message
+        client.requestWithBaseUrl(getBaseUrl() + DEBUG_SERVLET_PATH, 
DEFAULT_CORE, new SolrPing());
+
+        fail("Didn't get excepted exception from oversided request");
+      } catch (SolrException e) {
+        assertEquals("Unexpected exception status code", status, e.code());
+        assertTrue(e.getMessage().contains(getBaseUrl()));
+      }
     } finally {
       DebugServlet.clear();
     }
diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpJdkSolrClientTest.java
 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpJdkSolrClientTest.java
index 294b6ae9a48..07a202ccc65 100644
--- 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpJdkSolrClientTest.java
+++ 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpJdkSolrClientTest.java
@@ -389,15 +389,6 @@ public class HttpJdkSolrClientTest extends 
HttpSolrClientTestBase {
     }
   }
 
-  @Test
-  public void testSolrExceptionWithNullBaseurl() throws IOException, 
SolrServerException {
-    try (HttpJdkSolrClient client = builder(null).build()) {
-      super.testSolrExceptionWithNullBaseurl(client);
-    } finally {
-      DebugServlet.clear();
-    }
-  }
-
   @Test
   public void testUpdateDefault() throws Exception {
     String url = getBaseUrl() + DEBUG_SERVLET_PATH;
diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpSolrClientTestBase.java
 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpSolrClientTestBase.java
index 23f577cffa9..919af4ef266 100644
--- 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpSolrClientTestBase.java
+++ 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpSolrClientTestBase.java
@@ -41,7 +41,6 @@ import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.request.QueryRequest;
-import org.apache.solr.client.solrj.request.SolrPing;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.client.solrj.util.Cancellable;
@@ -251,33 +250,6 @@ public abstract class HttpSolrClientTestBase extends 
SolrJettyTestBase {
     }
   }
 
-  /**
-   * test that SolrExceptions thrown by HttpSolrClient can correctly 
encapsulate http status codes
-   * even when not on the list of ErrorCodes solr may return.
-   */
-  public void testSolrExceptionWithNullBaseurl(HttpSolrClientBase client)
-      throws IOException, SolrServerException {
-    final int status = 527;
-    assertEquals(
-        status
-            + " didn't generate an UNKNOWN error code, someone modified the 
list of valid ErrorCode's w/o changing this test to work a different way",
-        SolrException.ErrorCode.UNKNOWN,
-        SolrException.ErrorCode.getErrorCode(status));
-
-    DebugServlet.setErrorCode(status);
-    try {
-      // if client base url is null, request url will be used in exception 
message
-      SolrPing ping = new SolrPing();
-      ping.setBasePath(getBaseUrl() + DEBUG_SERVLET_PATH);
-      client.request(ping, DEFAULT_CORE);
-
-      fail("Didn't get excepted exception from oversided request");
-    } catch (SolrException e) {
-      assertEquals("Unexpected exception status code", status, e.code());
-      assertTrue(e.getMessage().contains(getBaseUrl()));
-    }
-  }
-
   protected enum WT {
     JAVABIN,
     XML
diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/LBHttp2SolrClientTest.java
 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/LBHttp2SolrClientTest.java
index cd1e0d1afd8..2e20a88ca1c 100644
--- 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/LBHttp2SolrClientTest.java
+++ 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/LBHttp2SolrClientTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.solr.client.solrj.impl;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
@@ -28,7 +29,9 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import org.apache.solr.SolrTestCase;
+import org.apache.solr.client.solrj.SolrClientFunction;
 import org.apache.solr.client.solrj.SolrRequest;
+import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.util.AsyncListener;
 import org.apache.solr.client.solrj.util.Cancellable;
@@ -204,9 +207,11 @@ public class LBHttp2SolrClientTest extends SolrTestCase {
         int index = Integer.parseInt(lastQueryReq.getParams().get("q"));
         assertNull("Found same request twice: " + index, queryRequests[index]);
         queryRequests[index] = lastQueryReq;
-        if (lastQueryReq.getBasePath().equals(ep1.toString())) {
+
+        final String lastBasePath = client.lastBasePaths.get(i);
+        if (lastBasePath.equals(ep1.toString())) {
           numEndpointOne++;
-        } else if (lastQueryReq.getBasePath().equals(ep2.toString())) {
+        } else if (lastBasePath.equals(ep2.toString())) {
           numEndpointTwo++;
         }
         NamedList<Object> lastResponse;
@@ -292,6 +297,8 @@ public class LBHttp2SolrClientTest extends SolrTestCase {
 
     public String basePathToFail = null;
 
+    public String tmpBaseUrl = null;
+
     protected MockHttp2SolrClient(String serverBaseUrl, Builder builder) {
       // TODO: Consider creating an interface for Http*SolrClient
       // so mocks can Implement, not Extend, and not actually need to
@@ -307,14 +314,27 @@ public class LBHttp2SolrClientTest extends SolrTestCase {
       throw new UnsupportedOperationException("do not use deprecated method.");
     }
 
+    @Override
+    public <R> R requestWithBaseUrl(
+        String baseUrl, SolrClientFunction<Http2SolrClient, R> clientFunction)
+        throws SolrServerException, IOException {
+      // This use of 'tmpBaseUrl' is NOT thread safe, but that's fine for our 
purposes here.
+      try {
+        tmpBaseUrl = baseUrl;
+        return clientFunction.apply(this);
+      } finally {
+        tmpBaseUrl = null;
+      }
+    }
+
     @Override
     public CompletableFuture<NamedList<Object>> requestAsync(
         final SolrRequest<?> solrRequest, String collection) {
       CompletableFuture<NamedList<Object>> cf = new CompletableFuture<>();
       lastSolrRequests.add(solrRequest);
-      lastBasePaths.add(solrRequest.getBasePath());
+      lastBasePaths.add(tmpBaseUrl);
       lastCollections.add(collection);
-      if (solrRequest.getBasePath().equals(basePathToFail)) {
+      if (tmpBaseUrl != null && tmpBaseUrl.equals(basePathToFail)) {
         cf.completeExceptionally(
             new SolrException(SolrException.ErrorCode.SERVER_ERROR, "We should 
retry this."));
       } else {

Reply via email to