From 2b28161cc565f695e0ec0761a0c3b0f4c09074f9 Mon Sep 17 00:00:00 2001 From: Sanjay Dutt Date: Fri, 24 May 2024 11:46:22 +0530 Subject: [PATCH] SOLR-17290: Update SyncStrategy and PeerSyncWithLeader to use the recovery Http2SolrClient (#2460) * Both SyncStrategy and PeerSyncWithLeader now utilize the recovery Http2SolrClient supplied by UpdateShardHandler. * In PeerSyncWithLeader, the unnecessary re-creation of the client has been removed. --------- Co-authored-by: Sanjay Dutt Co-authored-by: David Smiley --- solr/CHANGES.txt | 2 ++ .../org/apache/solr/cloud/SyncStrategy.java | 14 +++++----- .../solr/update/PeerSyncWithLeader.java | 26 +++++++------------ 3 files changed, 17 insertions(+), 25 deletions(-) diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index 1f5ac80cdf9..03506ad15c4 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -155,6 +155,8 @@ Other Changes * GITHUB#2454: Refactor preparePutOrPost method in HttpJdkSolrClient (Andy Webb) +* SOLR-16503: Use Jetty HTTP2 for SyncStrategy and PeerSyncWithLeader for "recovery" operations (Sanjay Dutt, David Smiley) + ================== 9.6.1 ================== Bug Fixes --------------------- diff --git a/solr/core/src/java/org/apache/solr/cloud/SyncStrategy.java b/solr/core/src/java/org/apache/solr/cloud/SyncStrategy.java index f07125cf975..641542038a4 100644 --- a/solr/core/src/java/org/apache/solr/cloud/SyncStrategy.java +++ b/solr/core/src/java/org/apache/solr/cloud/SyncStrategy.java @@ -24,10 +24,9 @@ import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; -import org.apache.http.client.HttpClient; 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.CoreAdminRequest.RequestRecovery; import org.apache.solr.common.cloud.ZkCoreNodeProps; import org.apache.solr.common.cloud.ZkNodeProps; @@ -55,7 +54,7 @@ public class SyncStrategy { private volatile boolean isClosed; - private final HttpClient client; + private final Http2SolrClient solrClient; private final ExecutorService updateExecutor; @@ -69,7 +68,7 @@ private static class RecoveryRequest { public SyncStrategy(CoreContainer cc) { UpdateShardHandler updateShardHandler = cc.getUpdateShardHandler(); - client = updateShardHandler.getDefaultHttpClient(); + solrClient = updateShardHandler.getRecoveryOnlyHttpClient(); shardHandler = cc.getShardHandlerFactory().getShardHandler(); updateExecutor = updateShardHandler.getUpdateExecutor(); } @@ -361,12 +360,11 @@ private void requestRecovery( RequestRecovery recoverRequestCmd = new RequestRecovery(); recoverRequestCmd.setAction(CoreAdminAction.REQUESTRECOVERY); recoverRequestCmd.setCoreName(coreName); - try (SolrClient client = - new HttpSolrClient.Builder(baseUrl) - .withHttpClient(SyncStrategy.this.client) + new Http2SolrClient.Builder(baseUrl) + .withHttpClient(solrClient) .withConnectionTimeout(30000, TimeUnit.MILLISECONDS) - .withSocketTimeout(120000, TimeUnit.MILLISECONDS) + .withIdleTimeout(120000, TimeUnit.MILLISECONDS) .build()) { client.request(recoverRequestCmd); } catch (Throwable t) { 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 c2d98d41ac0..ad7c76d752a 100644 --- a/solr/core/src/java/org/apache/solr/update/PeerSyncWithLeader.java +++ b/solr/core/src/java/org/apache/solr/update/PeerSyncWithLeader.java @@ -28,11 +28,9 @@ import java.lang.invoke.MethodHandles; import java.util.List; import java.util.Set; -import org.apache.http.client.HttpClient; 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.HttpSolrClient; import org.apache.solr.client.solrj.request.QueryRequest; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.cloud.ZkController; @@ -56,7 +54,9 @@ public class PeerSyncWithLeader implements SolrMetricProducer { private UpdateHandler uhandler; private UpdateLog ulog; - private SolrClient clientToLeader; + private final SolrClient clientToLeader; + private final String coreName; + private final String leaderBaseUrl; private boolean doFingerprint; @@ -79,15 +79,10 @@ public PeerSyncWithLeader(SolrCore core, String leaderUrl, int nUpdates) { this.doFingerprint = !"true".equals(System.getProperty("solr.disableFingerprint")); this.uhandler = core.getUpdateHandler(); this.ulog = uhandler.getUpdateLog(); - HttpClient httpClient = core.getCoreContainer().getUpdateShardHandler().getDefaultHttpClient(); - final var leaderBaseUrl = URLUtil.extractBaseUrl(leaderUrl); - final var coreName = URLUtil.extractCoreFromCoreUrl(leaderUrl); - this.clientToLeader = - new HttpSolrClient.Builder(leaderBaseUrl) - .withDefaultCollection(coreName) - .withHttpClient(httpClient) - .build(); + leaderBaseUrl = URLUtil.extractBaseUrl(leaderUrl); + coreName = URLUtil.extractCoreFromCoreUrl(leaderUrl); + clientToLeader = core.getCoreContainer().getUpdateShardHandler().getRecoveryOnlyHttpClient(); this.updater = new PeerSync.Updater(msg(), core); @@ -201,11 +196,6 @@ public PeerSync.PeerSyncResult sync(List startingVersions) { if (timerContext != null) { timerContext.close(); } - try { - clientToLeader.close(); - } catch (IOException e) { - log.warn("{} unable to close client to leader", msg(), e); - } } } @@ -343,7 +333,9 @@ private boolean handleUpdates( private NamedList request(ModifiableSolrParams params, String onFail) { try { - QueryResponse rsp = new QueryRequest(params, SolrRequest.METHOD.POST).process(clientToLeader); + QueryRequest request = new QueryRequest(params, SolrRequest.METHOD.POST); + request.setBasePath(leaderBaseUrl); + QueryResponse rsp = request.process(clientToLeader, coreName); Exception exception = rsp.getException(); if (exception != null) { throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, onFail);