You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ds...@apache.org on 2025/12/01 03:17:05 UTC
(solr) 03/03: SOLR-17996: SolrRequest.processWithBaseUrl and HttpSolrClientBase.requestWithBaseUrl (#3881)
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
commit 6de48936afdea86382d0e059987ed484eac74097
Author: David Smiley <ds...@apache.org>
AuthorDate: Sun Nov 30 21:20:57 2025 -0500
SOLR-17996: SolrRequest.processWithBaseUrl and HttpSolrClientBase.requestWithBaseUrl (#3881)
New HttpSolrClientBase.requestWithBaseUrl (abstract, returns NamedList).
Change Http2SolrClient.requestWithBaseUrl to implement it, return NamedList instead of SolrRequest generic return type.
New SolrRequest.processWithBaseUrl that returns the SolrRequest response.
backported to 9x; kept existing requestWithBaseUrl overload and deprecated
Ported HttpJdkSolrClient.requestWithBaseUrl from 10x
---
.../unreleased/SOLR-17996-requestWithBaseUrl.yml | 8 +++++++
.../org/apache/solr/bench/MiniClusterState.java | 15 ++++++------
.../org/apache/solr/bench/index/CloudIndexing.java | 2 +-
.../org/apache/solr/bench/search/FilterCache.java | 8 +++----
.../org/apache/solr/bench/search/JsonFaceting.java | 5 +---
.../apache/solr/bench/search/NumericSearch.java | 4 ++--
.../api/collections/ReindexCollectionCmd.java | 5 ++--
.../java/org/apache/solr/core/CoreContainer.java | 5 ++--
.../java/org/apache/solr/handler/IndexFetcher.java | 9 ++++----
.../org/apache/solr/handler/admin/ColStatus.java | 2 +-
.../solr/security/PKIAuthenticationPlugin.java | 2 +-
.../org/apache/solr/update/PeerSyncWithLeader.java | 2 +-
.../org/apache/solr/update/SolrCmdDistributor.java | 2 +-
.../processor/DistributedUpdateProcessor.java | 6 +----
.../TestUserManagedReplicationWithAuth.java | 4 ++--
.../solrj/impl/SolrClientNodeStateProvider.java | 2 +-
.../solr/common/cloud/NodesSysPropsCacher.java | 4 +---
.../org/apache/solr/client/solrj/SolrRequest.java | 24 +++++++++++++++++++
.../impl/ConcurrentUpdateHttp2SolrClient.java | 9 ++++----
.../solr/client/solrj/impl/Http2SolrClient.java | 8 +++++++
.../solr/client/solrj/impl/HttpJdkSolrClient.java | 27 ++++++++++++++++------
.../solr/client/solrj/impl/HttpSolrClientBase.java | 15 ++++++++++++
.../solr/client/solrj/impl/LBSolrClient.java | 12 +++++-----
.../client/solrj/impl/Http2SolrClientTest.java | 4 ++--
.../client/solrj/impl/HttpJdkSolrClientTest.java | 19 +++++++++++++++
25 files changed, 139 insertions(+), 64 deletions(-)
diff --git a/changelog/unreleased/SOLR-17996-requestWithBaseUrl.yml b/changelog/unreleased/SOLR-17996-requestWithBaseUrl.yml
new file mode 100644
index 00000000000..cdd4d944a74
--- /dev/null
+++ b/changelog/unreleased/SOLR-17996-requestWithBaseUrl.yml
@@ -0,0 +1,8 @@
+# See https://github.com/apache/solr/blob/main/dev-docs/changelog.adoc
+title: New SolrJ SolrRequest.processWithBaseUrl, new HttpSolrClientBase.requestWithBaseUrl. HttpJdkSolrClient.requestWithBaseUrl ported from 10x.
+type: other # added, changed, fixed, deprecated, removed, dependency_update, security, other
+authors:
+ - name: David Smiley
+links:
+ - name: SOLR-17996
+ url: https://issues.apache.org/jira/browse/SOLR-17996
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 34a970b3392..6fa2b06a346 100755
--- a/solr/benchmark/src/java/org/apache/solr/bench/MiniClusterState.java
+++ b/solr/benchmark/src/java/org/apache/solr/bench/MiniClusterState.java
@@ -318,7 +318,7 @@ public class MiniClusterState {
CollectionAdminRequest.Create request =
CollectionAdminRequest.createCollection(collection, "conf", numShards, numReplicas);
client.requestWithBaseUrl(
- nodes.get(random.nextInt(cluster.getJettySolrRunners().size())), null, request);
+ nodes.get(random.nextInt(cluster.getJettySolrRunners().size())), request, null);
cluster.waitForActiveCollection(
collection, 15, TimeUnit.SECONDS, numShards, numShards * numReplicas);
@@ -368,7 +368,7 @@ public class MiniClusterState {
UpdateRequest commitRequest = new UpdateRequest();
final var url = nodes.get(random.nextInt(cluster.getJettySolrRunners().size()));
commitRequest.setAction(UpdateRequest.ACTION.COMMIT, false, true);
- client.requestWithBaseUrl(url, collection, commitRequest);
+ client.requestWithBaseUrl(url, commitRequest, collection);
log("done committing data");
} else {
cluster.waitForActiveCollection(collection, 15, TimeUnit.SECONDS);
@@ -376,8 +376,7 @@ public class MiniClusterState {
QueryRequest queryRequest = new QueryRequest(new SolrQuery("q", "*:*", "rows", "1"));
final var url = nodes.get(random.nextInt(cluster.getJettySolrRunners().size()));
- NamedList<Object> result =
- client.requestWithBaseUrl(url, collection, queryRequest).getResponse();
+ NamedList<Object> result = client.requestWithBaseUrl(url, queryRequest, collection);
log("sanity check of single row query result: " + result);
log("");
@@ -424,7 +423,7 @@ public class MiniClusterState {
meter.mark();
try {
- client.requestWithBaseUrl(url, collection, updateRequest);
+ client.requestWithBaseUrl(url, updateRequest, collection);
} catch (Exception e) {
throw new RuntimeException(e);
}
@@ -452,7 +451,7 @@ public class MiniClusterState {
if (i % batchSize == 0) {
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.add(batch);
- client.requestWithBaseUrl(nodes.get(0), collection, updateRequest);
+ client.requestWithBaseUrl(nodes.get(0), updateRequest, collection);
meter.mark(batch.size());
batch.clear();
log(meter.getCount() + " docs at " + (long) meter.getMeanRate() + " doc/s");
@@ -461,7 +460,7 @@ public class MiniClusterState {
if (!batch.isEmpty()) {
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.add(batch);
- client.requestWithBaseUrl(nodes.get(0), collection, updateRequest);
+ client.requestWithBaseUrl(nodes.get(0), updateRequest, collection);
meter.mark(batch.size());
batch = null;
}
@@ -499,7 +498,7 @@ public class MiniClusterState {
UpdateRequest optimizeRequest = new UpdateRequest();
final var url = nodes.get(random.nextInt(cluster.getJettySolrRunners().size()));
optimizeRequest.setAction(UpdateRequest.ACTION.OPTIMIZE, false, true, maxMergeSegments);
- client.requestWithBaseUrl(url, collection, optimizeRequest);
+ client.requestWithBaseUrl(url, optimizeRequest, collection);
}
}
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 0ee950e7231..5f6c6526690 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
@@ -130,6 +130,6 @@ public class CloudIndexing {
updateRequest.add(state.getNextDoc());
final var url =
miniClusterState.nodes.get(miniClusterState.getRandom().nextInt(state.nodeCount));
- return miniClusterState.client.requestWithBaseUrl(url, BenchState.COLLECTION, updateRequest);
+ return miniClusterState.client.requestWithBaseUrl(url, updateRequest, BenchState.COLLECTION);
}
}
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 6b7f6bf4a4f..4b1bf9485e8 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
@@ -109,7 +109,7 @@ public class FilterCache {
throws SolrServerException, IOException {
// Reload the collection/core to drop existing caches
CollectionAdminRequest.Reload reload = CollectionAdminRequest.reloadCollection(COLLECTION);
- miniClusterState.client.requestWithBaseUrl(miniClusterState.nodes.get(0), null, reload);
+ miniClusterState.client.requestWithBaseUrl(miniClusterState.nodes.get(0), reload, null);
}
@TearDown(Level.Iteration)
@@ -139,8 +139,8 @@ public class FilterCache {
throws SolrServerException, IOException {
return miniClusterState.client.requestWithBaseUrl(
benchState.baseUrl,
- COLLECTION,
- miniClusterState.getRandom().nextBoolean() ? benchState.q1 : benchState.q2);
+ miniClusterState.getRandom().nextBoolean() ? benchState.q1 : benchState.q2,
+ COLLECTION);
}
@Benchmark
@@ -148,6 +148,6 @@ public class FilterCache {
BenchState benchState, MiniClusterState.MiniClusterBenchState miniClusterState)
throws SolrServerException, IOException {
return miniClusterState.client.requestWithBaseUrl(
- benchState.baseUrl, COLLECTION, benchState.q1);
+ benchState.baseUrl, benchState.q1, COLLECTION);
}
}
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 1595de56d3b..2577581611e 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
@@ -183,10 +183,7 @@ public class JsonFaceting {
final var url = miniClusterState.nodes.get(threadState.random.nextInt(state.nodeCount));
QueryRequest queryRequest = new QueryRequest(state.params);
NamedList<Object> result =
- miniClusterState
- .client
- .requestWithBaseUrl(url, state.collection, queryRequest)
- .getResponse();
+ miniClusterState.client.requestWithBaseUrl(url, queryRequest, state.collection);
// 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 398d102ec7c..7717b005fb3 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
@@ -102,7 +102,7 @@ public class NumericSearch {
q.setParam("facet.limit", String.valueOf(maxCardinality));
QueryRequest req = new QueryRequest(q);
QueryResponse response =
- miniClusterState.client.requestWithBaseUrl(basePath, COLLECTION, req);
+ req.processWithBaseUrl(miniClusterState.client, basePath, COLLECTION);
Set<String> numbers =
response.getFacetField("numbers_i_dv").getValues().stream()
.map(FacetField.Count::getName)
@@ -144,7 +144,7 @@ public class NumericSearch {
throws SolrServerException, IOException {
// Reload the collection/core to drop existing caches
CollectionAdminRequest.Reload reload = CollectionAdminRequest.reloadCollection(COLLECTION);
- miniClusterState.client.requestWithBaseUrl(miniClusterState.nodes.get(0), null, reload);
+ miniClusterState.client.requestWithBaseUrl(miniClusterState.nodes.get(0), reload, null);
}
public QueryRequest intSetQuery(boolean dvs) {
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 9620cff4260..a4bffd5b795 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
@@ -872,9 +872,8 @@ public class ReindexCollectionCmd implements CollApiCmds.CollectionApiCommand {
solrParams.set(CommonParams.DISTRIB, false);
final var req = new QueryRequest(solrParams);
- final var solrResponse =
- solrClient.requestWithBaseUrl(daemonReplica.getBaseUrl(), daemonReplica.getCoreName(), req);
- return solrResponse.getResponse();
+ return solrClient.requestWithBaseUrl(
+ daemonReplica.getBaseUrl(), req, daemonReplica.getCoreName());
}
private void cleanup(
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 d5106edb252..2ed0a3fb2d1 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@@ -71,6 +71,7 @@ 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.HttpSolrClientBase;
import org.apache.solr.client.solrj.impl.SolrHttpClientBuilder;
import org.apache.solr.client.solrj.impl.SolrHttpClientContextBuilder;
import org.apache.solr.client.solrj.impl.SolrHttpClientContextBuilder.AuthSchemeRegistryProvider;
@@ -762,7 +763,7 @@ public class CoreContainer {
*
* @see #getDefaultHttpSolrClient()
* @see ZkController#getSolrClient()
- * @see Http2SolrClient#requestWithBaseUrl(String, String, SolrRequest)
+ * @see HttpSolrClientBase#requestWithBaseUrl(String, SolrRequest, String)
* @deprecated likely to simply be moved to the ObjectCache so as to not be used
*/
@Deprecated
@@ -2585,7 +2586,7 @@ public class CoreContainer {
* <p>The caller does not need to close the client.
*
* @return the existing {@link Http2SolrClient}
- * @see Http2SolrClient#requestWithBaseUrl(String, String, SolrRequest)
+ * @see HttpSolrClientBase#requestWithBaseUrl(String, SolrRequest, String)
*/
public Http2SolrClient getDefaultHttpSolrClient() {
return solrClientProvider.getSolrClient();
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 cc9d4cd79ce..17664a9fcd5 100644
--- a/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
+++ b/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
@@ -361,7 +361,7 @@ public class IndexFetcher {
params.set(CommonParams.QT, ReplicationHandler.PATH);
QueryRequest req = new QueryRequest(params);
try {
- return solrClient.requestWithBaseUrl(leaderBaseUrl, leaderCoreName, req).getResponse();
+ return solrClient.requestWithBaseUrl(leaderBaseUrl, req, leaderCoreName);
} catch (SolrServerException e) {
throw new SolrException(ErrorCode.SERVER_ERROR, e.getMessage(), e);
}
@@ -380,8 +380,7 @@ public class IndexFetcher {
params.set(CommonParams.QT, ReplicationHandler.PATH);
QueryRequest req = new QueryRequest(params);
try {
- NamedList<?> response =
- solrClient.requestWithBaseUrl(leaderBaseUrl, leaderCoreName, req).getResponse();
+ NamedList<?> response = solrClient.requestWithBaseUrl(leaderBaseUrl, req, leaderCoreName);
List<Map<String, Object>> files = (List<Map<String, Object>>) response.get(CMD_GET_FILE_LIST);
if (files != null) filesToDownload = Collections.synchronizedList(files);
@@ -1955,7 +1954,7 @@ public class IndexFetcher {
QueryRequest req = new QueryRequest(params);
req.setResponseParser(new InputStreamResponseParser(FILE_STREAM));
if (useExternalCompression) req.addHeader("Accept-Encoding", "gzip");
- response = solrClient.requestWithBaseUrl(leaderBaseUrl, leaderCoreName, req).getResponse();
+ response = solrClient.requestWithBaseUrl(leaderBaseUrl, req, leaderCoreName);
final var responseStatus = (Integer) response.get("responseStatus");
is = (InputStream) response.get("stream");
@@ -2101,7 +2100,7 @@ public class IndexFetcher {
QueryRequest request = new QueryRequest(params);
// TODO use shardhandler
- return solrClient.requestWithBaseUrl(leaderBaseUrl, leaderCoreName, request).getResponse();
+ return solrClient.requestWithBaseUrl(leaderBaseUrl, request, leaderCoreName);
}
public void destroy() {
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 39e115146b9..d3576d364b8 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
@@ -201,7 +201,7 @@ public class ColStatus {
params.add(RAW_SIZE_SAMPLING_PERCENT_PROP, String.valueOf(samplingPercent));
}
QueryRequest req = new QueryRequest(params);
- NamedList<Object> rsp = solrClient.requestWithBaseUrl(url, null, req).getResponse();
+ NamedList<Object> rsp = solrClient.requestWithBaseUrl(url, req, null);
final var segmentResponse =
SolrJacksonMapper.getObjectMapper().convertValue(rsp, GetSegmentDataResponse.class);
segmentResponse.responseHeader = null;
diff --git a/solr/core/src/java/org/apache/solr/security/PKIAuthenticationPlugin.java b/solr/core/src/java/org/apache/solr/security/PKIAuthenticationPlugin.java
index fe5923eb751..ce1c09a8742 100644
--- a/solr/core/src/java/org/apache/solr/security/PKIAuthenticationPlugin.java
+++ b/solr/core/src/java/org/apache/solr/security/PKIAuthenticationPlugin.java
@@ -390,7 +390,7 @@ public class PKIAuthenticationPlugin extends AuthenticationPlugin
final var request = new GenericSolrRequest(GET, PublicKeyHandler.PATH, solrParams);
log.debug("Fetching fresh public key from: {}", url);
var solrClient = cores.getDefaultHttpSolrClient();
- NamedList<Object> resp = solrClient.requestWithBaseUrl(url, request::process).getResponse();
+ NamedList<Object> resp = solrClient.requestWithBaseUrl(url, request, null);
String key = (String) resp.get("key");
if (key == null) {
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 f46e0c161e7..df356944e17 100644
--- a/solr/core/src/java/org/apache/solr/update/PeerSyncWithLeader.java
+++ b/solr/core/src/java/org/apache/solr/update/PeerSyncWithLeader.java
@@ -334,7 +334,7 @@ public class PeerSyncWithLeader implements SolrMetricProducer {
private NamedList<Object> request(ModifiableSolrParams params, String onFail) {
try {
QueryRequest request = new QueryRequest(params, SolrRequest.METHOD.POST);
- QueryResponse rsp = clientToLeader.requestWithBaseUrl(leaderBaseUrl, coreName, request);
+ QueryResponse rsp = request.processWithBaseUrl(clientToLeader, leaderBaseUrl, coreName);
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 7f1998d6c82..de00ffa9213 100644
--- a/solr/core/src/java/org/apache/solr/update/SolrCmdDistributor.java
+++ b/solr/core/src/java/org/apache/solr/update/SolrCmdDistributor.java
@@ -317,7 +317,7 @@ public class SolrCmdDistributor implements Closeable {
try {
clients
.getHttpClient()
- .requestWithBaseUrl(req.node.getBaseUrl(), req.node.getCoreName(), req.uReq);
+ .requestWithBaseUrl(req.node.getBaseUrl(), req.uReq, req.node.getCoreName());
} 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 8e3153046ad..3485e3d9e17 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,11 +692,7 @@ public class DistributedUpdateProcessor extends UpdateRequestProcessor {
NamedList<Object> rsp;
try {
- rsp =
- updateShardHandler
- .getUpdateOnlyHttpClient()
- .requestWithBaseUrl(leaderUrl, null, ur)
- .getResponse();
+ rsp = updateShardHandler.getUpdateOnlyHttpClient().requestWithBaseUrl(leaderUrl, ur, null);
} catch (SolrServerException e) {
throw new SolrException(
ErrorCode.SERVER_ERROR,
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 98a5684791d..fdf8ef49709 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestUserManagedReplicationWithAuth.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestUserManagedReplicationWithAuth.java
@@ -238,7 +238,7 @@ public class TestUserManagedReplicationWithAuth extends SolrTestCaseJ4 {
withBasicAuth(req);
final var baseUrl = buildUrl(Jetty.getLocalPort());
- solrClient.requestWithBaseUrl(baseUrl, DEFAULT_TEST_CORENAME, req);
+ solrClient.requestWithBaseUrl(baseUrl, req, DEFAULT_TEST_CORENAME);
}
private void pullIndexFromTo(
@@ -247,7 +247,7 @@ public class TestUserManagedReplicationWithAuth extends SolrTestCaseJ4 {
String srcUrl = buildUrl(srcSolr.getLocalPort()) + "/" + DEFAULT_TEST_CORENAME;
QueryRequest req = getQueryRequestForFetchIndex(authEnabled, srcUrl);
final var baseUrl = buildUrl(destSolr.getLocalPort());
- followerClient.requestWithBaseUrl(baseUrl, DEFAULT_TEST_CORENAME, req);
+ followerClient.requestWithBaseUrl(baseUrl, req, DEFAULT_TEST_CORENAME);
}
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 eb2e377c3ad..1494f616016 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
@@ -289,7 +289,7 @@ public class SolrClientNodeStateProvider implements NodeStateProvider, MapWriter
request.setResponseParser(new BinaryResponseParser());
try {
- return cloudSolrClient.getHttpClient().requestWithBaseUrl(url, request::process);
+ return request.processWithBaseUrl(cloudSolrClient.getHttpClient(), url, null);
} 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 35d6829f7cb..f16858be16a 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
@@ -88,9 +88,7 @@ public class NodesSysPropsCacher implements NodesSysProps, AutoCloseable {
try {
LinkedHashMap<String, Object> result = new LinkedHashMap<>();
NavigableObject response =
- solrClient
- .requestWithBaseUrl(zkStateReader.getBaseUrlForNodeName(nodeName), null, req)
- .getResponse();
+ solrClient.requestWithBaseUrl(zkStateReader.getBaseUrlForNodeName(nodeName), req, null);
var metrics = NavigableObject.wrap(response._get("metrics"));
keys.forEach((tag, key) -> result.put(tag, metrics._get(key)));
return result;
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/SolrRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/SolrRequest.java
index c86b8046128..49c52f18d36 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/SolrRequest.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/SolrRequest.java
@@ -26,6 +26,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
+import org.apache.solr.client.solrj.impl.HttpSolrClientBase;
import org.apache.solr.client.solrj.request.RequestWriter;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.util.ContentStream;
@@ -283,6 +284,29 @@ public abstract class SolrRequest<T extends SolrResponse> implements Serializabl
return res;
}
+ /**
+ * Send this request to a {@link SolrClient} and return the response
+ *
+ * @param client the SolrClient to communicate with
+ * @param baseUrl the base URL, e.g. {@code Http://localhost:8983/solr}
+ * @param collection the collection to execute the request against
+ * @return the response
+ * @throws SolrServerException if there is an error on the Solr server
+ * @throws IOException if there is a communication error
+ * @lucene.experimental
+ */
+ public final T processWithBaseUrl(HttpSolrClientBase client, String baseUrl, String collection)
+ throws SolrServerException, IOException {
+ // duplicative with process(), except for requestWithBaseUrl
+ long startNanos = System.nanoTime();
+ T res = createResponse(client);
+ var namedList = client.requestWithBaseUrl(baseUrl, this, collection);
+ res.setResponse(namedList);
+ long endNanos = System.nanoTime();
+ res.setElapsedTime(TimeUnit.NANOSECONDS.toMillis(endNanos - startNanos));
+ return res;
+ }
+
/**
* Send this request to a {@link SolrClient} and return the response
*
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 ae79909e212..895f66f8719 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
@@ -395,7 +395,7 @@ public class ConcurrentUpdateHttp2SolrClient extends SolrClient {
? defaultCollection
: collection;
if (!(request instanceof UpdateRequest)) {
- return client.requestWithBaseUrl(basePath, (c) -> c.request(request, effectiveCollection));
+ return client.requestWithBaseUrl(basePath, request, effectiveCollection);
}
UpdateRequest req = (UpdateRequest) request;
// this happens for commit...
@@ -405,14 +405,13 @@ public class ConcurrentUpdateHttp2SolrClient extends SolrClient {
&& (req.getDeleteByIdMap() == null || req.getDeleteByIdMap().isEmpty())) {
if (req.getDeleteQuery() == null) {
blockUntilFinished();
- return client.requestWithBaseUrl(
- basePath, (c) -> c.request(request, effectiveCollection));
+ return client.requestWithBaseUrl(basePath, request, effectiveCollection);
}
}
} else {
if ((req.getDocuments() == null || req.getDocuments().isEmpty())) {
blockUntilFinished();
- return client.requestWithBaseUrl(basePath, (c) -> c.request(request, effectiveCollection));
+ return client.requestWithBaseUrl(basePath, request, effectiveCollection);
}
}
@@ -422,7 +421,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.requestWithBaseUrl(basePath, (c) -> c.request(request, effectiveCollection));
+ return client.requestWithBaseUrl(basePath, request, effectiveCollection);
}
}
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java
index 5b7fbf1e62b..b4936da4160 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java
@@ -637,6 +637,13 @@ public class Http2SolrClient extends HttpSolrClientBase {
}
}
+ @Override
+ public NamedList<Object> requestWithBaseUrl(
+ String baseUrl, SolrRequest<?> solrRequest, String collection)
+ throws SolrServerException, IOException {
+ return requestWithBaseUrl(baseUrl, c -> c.request(solrRequest, collection));
+ }
+
/**
* Executes a SolrRequest using the provided URL to temporarily override any "base URL" currently
* used by this client
@@ -647,6 +654,7 @@ public class Http2SolrClient extends HttpSolrClientBase {
* on the client's default
* @param req the SolrRequest to send
*/
+ @Deprecated(since = "9.11")
public final <R extends SolrResponse> R requestWithBaseUrl(
String baseUrl, String collection, SolrRequest<R> req)
throws SolrServerException, IOException {
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpJdkSolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpJdkSolrClient.java
index fe7612d074e..78b5bf18d28 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpJdkSolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpJdkSolrClient.java
@@ -167,7 +167,7 @@ public class HttpJdkSolrClient extends HttpSolrClientBase {
public CompletableFuture<NamedList<Object>> requestAsync(
final SolrRequest<?> solrRequest, String collection) {
try {
- PreparedRequest pReq = prepareRequest(solrRequest, collection);
+ PreparedRequest pReq = prepareRequest(solrRequest, collection, null);
return httpClient
.sendAsync(pReq.reqb.build(), HttpResponse.BodyHandlers.ofInputStream())
.thenApply(
@@ -187,9 +187,10 @@ public class HttpJdkSolrClient extends HttpSolrClientBase {
}
@Override
- public NamedList<Object> request(SolrRequest<?> solrRequest, String collection)
+ public NamedList<Object> requestWithBaseUrl(
+ String baseUrl, SolrRequest<?> solrRequest, String collection)
throws SolrServerException, IOException {
- PreparedRequest pReq = prepareRequest(solrRequest, collection);
+ PreparedRequest pReq = prepareRequest(solrRequest, collection, baseUrl);
HttpResponse<InputStream> response = null;
try {
response = httpClient.send(pReq.reqb.build(), HttpResponse.BodyHandlers.ofInputStream());
@@ -202,8 +203,8 @@ public class HttpJdkSolrClient extends HttpSolrClientBase {
"Timeout occurred while waiting response from server at: " + pReq.url, e);
} catch (SolrException se) {
throw se;
- } catch (RuntimeException re) {
- throw new SolrServerException(re);
+ } catch (RuntimeException e) {
+ throw new SolrServerException(e);
} finally {
if (pReq.contentWritingFuture != null) {
pReq.contentWritingFuture.cancel(true);
@@ -221,13 +222,25 @@ public class HttpJdkSolrClient extends HttpSolrClientBase {
}
}
- private PreparedRequest prepareRequest(SolrRequest<?> solrRequest, String collection)
+ @Override
+ public NamedList<Object> request(SolrRequest<?> solrRequest, String collection)
+ throws SolrServerException, IOException {
+ return requestWithBaseUrl(null, solrRequest, collection);
+ }
+
+ protected PreparedRequest prepareRequest(
+ SolrRequest<?> solrRequest, String collection, String overrideBaseUrl)
throws SolrServerException, IOException {
checkClosed();
if (ClientUtils.shouldApplyDefaultCollection(collection, solrRequest)) {
collection = defaultCollection;
}
- String url = getRequestUrl(solrRequest, collection);
+ String url;
+ if (overrideBaseUrl != null) {
+ url = ClientUtils.buildRequestUrl(solrRequest, requestWriter, overrideBaseUrl, collection);
+ } else {
+ url = getRequestUrl(solrRequest, collection);
+ }
ResponseParser parserToUse = responseParser(solrRequest);
ModifiableSolrParams queryParams = initializeSolrParams(solrRequest, parserToUse);
var reqb = HttpRequest.newBuilder();
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClientBase.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClientBase.java
index b29195f3d9e..9893f6ce7fd 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClientBase.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClientBase.java
@@ -348,6 +348,21 @@ public abstract class HttpSolrClientBase extends SolrClient {
protected abstract void updateDefaultMimeTypeForParser();
+ /**
+ * Executes a SolrRequest using the provided URL to temporarily override any "base URL" currently
+ * used by this client
+ *
+ * @param baseUrl a URL to a root Solr path (i.e. "/solr") that should be used for this request
+ * @param solrRequest the SolrRequest to send
+ * @param collection an optional collection or core name used to override the client's "default
+ * collection". May be 'null' for any requests that don't require a collection or wish to rely
+ * on the client's default
+ * @see SolrRequest#processWithBaseUrl(HttpSolrClientBase, String, String)
+ */
+ public abstract NamedList<Object> requestWithBaseUrl(
+ String baseUrl, SolrRequest<?> solrRequest, String collection)
+ throws SolrServerException, IOException;
+
/**
* @deprecated use {@link #requestAsync(SolrRequest, String)}.
* @param solrRequest the request to perform
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 d8a82df701b..5bdfa4cea05 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
@@ -564,12 +564,12 @@ public abstract class LBSolrClient extends SolrClient {
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));
+ // Some implementations of LBSolrClient.getClient(...) return a HttpSolrClientBase 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 HttpSolrClientBase) {
+ final var httpSolrClient = (HttpSolrClientBase) solrClient;
+ return httpSolrClient.requestWithBaseUrl(baseUrl, solrRequest, collection);
}
// Assume provided client already uses 'baseUrl'
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 ab9bf93540b..f9aa19b7c19 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
@@ -138,7 +138,7 @@ public class Http2SolrClientTest extends HttpSolrClientTestBase {
try (Http2SolrClient client = new Http2SolrClient.Builder(null).build()) {
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());
+ client.requestWithBaseUrl(getBaseUrl() + DEBUG_SERVLET_PATH, new SolrPing(), DEFAULT_CORE);
fail("Didn't get excepted exception from oversided request");
} catch (SolrException e) {
@@ -231,7 +231,7 @@ public class Http2SolrClientTest extends HttpSolrClientTestBase {
try (Http2SolrClient client =
new Http2SolrClient.Builder(defaultUrl).withDefaultCollection(DEFAULT_CORE).build()) {
try {
- client.requestWithBaseUrl(baseUrlToUse, null, new QueryRequest(queryParams));
+ client.requestWithBaseUrl(baseUrlToUse, new QueryRequest(queryParams), null);
} catch (BaseHttpSolrClient.RemoteSolrException rse) {
}
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 3c32ccfe7e9..f88a67674c4 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
@@ -192,6 +192,25 @@ public class HttpJdkSolrClientTest extends HttpSolrClientTestBase {
}
}
+ @Test
+ public void testRequestWithBaseUrl() throws Exception {
+ DebugServlet.clear();
+ DebugServlet.addResponseHeader("Content-Type", "application/octet-stream");
+ DebugServlet.responseBodyByQueryFragment.put("", javabinResponse());
+ String someOtherUrl = getBaseUrl() + "/some/other/base/url";
+ String intendedUrl = getBaseUrl() + DEBUG_SERVLET_PATH;
+ SolrQuery q = new SolrQuery("foo");
+ q.setParam("a", MUST_ENCODE);
+
+ HttpJdkSolrClient.Builder b =
+ builder(someOtherUrl).withResponseParser(new BinaryResponseParser());
+ try (HttpJdkSolrClient client = b.build()) {
+ client.requestWithBaseUrl(intendedUrl, new QueryRequest(q, SolrRequest.METHOD.GET), null);
+ assertEquals(
+ client.getParser().getWriterType(), DebugServlet.parameters.get(CommonParams.WT)[0]);
+ }
+ }
+
@Test
public void testGetById() throws Exception {
DebugServlet.clear();