From b4a8995ceb1ac85e94755920df41fa17c5724068 Mon Sep 17 00:00:00 2001 From: David Smiley Date: Sat, 18 Oct 2025 23:41:37 -0400 Subject: [PATCH 1/2] SOLR-16367: Don't depend on Apache HttpClient solrj-streaming DatabaseMetaDataImpl ZkController ConcurrentUpdateHttp2SolrClient (jetty) --- .../src/java/org/apache/solr/cloud/ZkController.java | 10 +++++----- .../client/solrj/io/sql/DatabaseMetaDataImpl.java | 4 ++-- .../solrj/impl/ConcurrentUpdateHttp2SolrClient.java | 12 +++++++----- 3 files changed, 14 insertions(+), 12 deletions(-) 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 bc41a64136ed..d9a6cae4b5e8 100644 --- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java +++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java @@ -62,7 +62,7 @@ import org.apache.solr.client.solrj.cloud.SolrCloudManager; import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient; import org.apache.solr.client.solrj.impl.CloudSolrClient; -import org.apache.solr.client.solrj.impl.HttpSolrClient.Builder; +import org.apache.solr.client.solrj.impl.Http2SolrClient; import org.apache.solr.client.solrj.impl.SolrClientCloudManager; import org.apache.solr.client.solrj.impl.SolrZkClientTimeout; import org.apache.solr.client.solrj.impl.ZkClientClusterStateProvider; @@ -2306,12 +2306,12 @@ private ZkCoreNodeProps waitForLeaderToSeeDownState( } // short timeouts, we may be in a storm and this is just best effort, and maybe we should be - // the - // leader now + // the leader now + // TODO .withHttpClient(getCoreContainer().getDefaultHttpSolrClient()) try (SolrClient client = - new Builder(leaderBaseUrl) + new Http2SolrClient.Builder(leaderBaseUrl) .withConnectionTimeout(8000, TimeUnit.MILLISECONDS) - .withSocketTimeout(30000, TimeUnit.MILLISECONDS) + .withIdleTimeout(30000, TimeUnit.MILLISECONDS) .build()) { WaitForState prepCmd = new WaitForState(); prepCmd.setCoreName(leaderCoreName); diff --git a/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/sql/DatabaseMetaDataImpl.java b/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/sql/DatabaseMetaDataImpl.java index d5b71d572191..5228f98dae30 100644 --- a/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/sql/DatabaseMetaDataImpl.java +++ b/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/sql/DatabaseMetaDataImpl.java @@ -28,7 +28,7 @@ import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.CloudSolrClient; -import org.apache.solr.client.solrj.impl.HttpSolrClient.Builder; +import org.apache.solr.client.solrj.impl.Http2SolrClient; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.cloud.ClusterState; import org.apache.solr.common.util.SimpleOrderedMap; @@ -124,7 +124,7 @@ public String getDatabaseProductVersion() throws SQLException { for (String node : liveNodes) { try { String nodeURL = Utils.getBaseUrlForNodeName(node, urlScheme); - solrClient = new Builder(nodeURL).build(); + solrClient = new Http2SolrClient.Builder(nodeURL).build(); QueryResponse rsp = solrClient.query(sysQuery); return String.valueOf( 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 58f59eb8eafa..91f57fe55cc6 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 @@ -32,7 +32,6 @@ 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.ConcurrentUpdateSolrClient.Update; import org.apache.solr.client.solrj.request.UpdateRequest; import org.apache.solr.client.solrj.util.ClientUtils; import org.apache.solr.common.SolrException; @@ -177,6 +176,9 @@ protected ConcurrentUpdateHttp2SolrClient(Builder builder) { // processedCount is now managed by StallDetection } + /** Class representing an UpdateRequest and an optional collection. */ + private record Update(UpdateRequest request, String collection) {} + /** Opens a connection and sends everything... */ class Runner implements Runnable { @@ -237,16 +239,16 @@ void sendUpdateStream() throws Exception { InputStreamResponseListener responseListener = null; try (Http2SolrClient.OutStream out = - client.initOutStream(basePath, update.getRequest(), update.getCollection())) { + client.initOutStream(basePath, update.request(), update.collection())) { Update upd = update; while (upd != null) { - UpdateRequest req = upd.getRequest(); - if (!out.belongToThisStream(req, upd.getCollection())) { + UpdateRequest req = upd.request(); + if (!out.belongToThisStream(req, upd.collection())) { // Request has different params or destination core/collection, return to queue queue.add(upd); break; } - client.send(out, upd.getRequest(), upd.getCollection()); + client.send(out, upd.request(), upd.collection()); out.flush(); notifyQueueAndRunnersIfEmptyQueue(); From f48f9a365174e12119aece7161f0b3851230a9d1 Mon Sep 17 00:00:00 2001 From: David Smiley Date: Sun, 19 Oct 2025 09:18:06 -0400 Subject: [PATCH 2/2] Use the built-in client (thus listeners) instead of 8 sec connection timeout --- solr/core/src/java/org/apache/solr/cloud/ZkController.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 d9a6cae4b5e8..4cb6a5984325 100644 --- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java +++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java @@ -2307,10 +2307,11 @@ private ZkCoreNodeProps waitForLeaderToSeeDownState( // short timeouts, we may be in a storm and this is just best effort, and maybe we should be // the leader now - // TODO .withHttpClient(getCoreContainer().getDefaultHttpSolrClient()) + // TODO ideally want 8sec connection timeout but can't easily also share the client + // listeners try (SolrClient client = new Http2SolrClient.Builder(leaderBaseUrl) - .withConnectionTimeout(8000, TimeUnit.MILLISECONDS) + .withHttpClient(getCoreContainer().getDefaultHttpSolrClient()) .withIdleTimeout(30000, TimeUnit.MILLISECONDS) .build()) { WaitForState prepCmd = new WaitForState();