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

sanjaydutt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new d0000b4f98f Switched from HTTP1 to HTTP2 in SolrClientCloudManager 
(#2751)
d0000b4f98f is described below

commit d0000b4f98fd5e2de04ca9f148bdbc5e2351e499
Author: Sanjay Dutt <[email protected]>
AuthorDate: Thu Oct 24 20:25:27 2024 +0530

    Switched from HTTP1 to HTTP2 in SolrClientCloudManager (#2751)
    
    * Replaced CloudLegacySolrClient with CloudHttp2SolrClient in 
SolrClientCloudManager and updated all internal classes accordingly.
    * SolrCloudManager#httpRequest is removed.
    * Removed dependencies on Apache httpclient and httpcore from 
solrj-zookeeper
    
    ---------
    
    Co-authored-by: David Smiley <[email protected]>
---
 solr/CHANGES.txt                                   |  2 +
 .../java/org/apache/solr/cloud/ZkController.java   | 25 ++++--
 .../test/org/apache/solr/cloud/OverseerTest.java   | 21 +++--
 .../org/apache/solr/cloud/ZkControllerTest.java    |  9 +++
 solr/solrj-zookeeper/build.gradle                  |  2 -
 .../client/solrj/cloud/DelegatingCloudManager.java | 13 ---
 .../solr/client/solrj/cloud/SolrCloudManager.java  | 10 ---
 .../client/solrj/impl/SolrClientCloudManager.java  | 94 ++--------------------
 .../solrj/impl/SolrClientNodeStateProvider.java    | 26 +++---
 .../client/solrj/impl/NodeValueFetcherTest.java    | 49 ++++++-----
 10 files changed, 88 insertions(+), 163 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 36923970e5e..9e8f5e7615a 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -170,6 +170,8 @@ Optimizations
 
 * SOLR-17441: Improve system metrics collection by skipping unreadable MXBean 
properties, making /admin/info/system calls faster (Haythem Khiri)
 
+* SOLR-16503: Switched from HTTP1 to HTTP2 in SolrClientCloudManager by 
replacing CloudLegacySolrClient with CloudHttp2SolrClient. (Sanjay Dutt, David 
Smiley)
+
 Bug Fixes
 ---------------------
 * SOLR-12429: Uploading a configset with a symbolic link produces a 
IOException. Now a error message to user generated instead. (Eric Pugh)
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 a1ebe69374c..33732ea0a94 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@ -54,11 +54,11 @@ import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.cloud.SolrCloudManager;
-import org.apache.solr.client.solrj.impl.CloudLegacySolrClient;
+import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
+import org.apache.solr.client.solrj.impl.Http2SolrClient;
 import org.apache.solr.client.solrj.impl.HttpSolrClient.Builder;
 import org.apache.solr.client.solrj.impl.SolrClientCloudManager;
 import org.apache.solr.client.solrj.impl.SolrZkClientTimeout;
-import org.apache.solr.client.solrj.impl.ZkClientClusterStateProvider;
 import org.apache.solr.client.solrj.request.CoreAdminRequest.WaitForState;
 import org.apache.solr.cloud.overseer.ClusterStateMutator;
 import org.apache.solr.cloud.overseer.OverseerAction;
@@ -199,7 +199,11 @@ public class ZkController implements Closeable {
   private final SolrZkClient zkClient;
   public final ZkStateReader zkStateReader;
   private SolrCloudManager cloudManager;
-  private CloudLegacySolrClient cloudSolrClient;
+
+  // only for internal usage
+  private Http2SolrClient http2SolrClient;
+
+  private CloudHttp2SolrClient cloudSolrClient;
 
   private final String zkServerAddress; // example: 127.0.0.1:54062/solr
 
@@ -768,8 +772,9 @@ public class ZkController implements Closeable {
     } finally {
 
       sysPropsCacher.close();
-      customThreadPool.execute(() -> IOUtils.closeQuietly(cloudSolrClient));
       customThreadPool.execute(() -> IOUtils.closeQuietly(cloudManager));
+      customThreadPool.execute(() -> IOUtils.closeQuietly(cloudSolrClient));
+      customThreadPool.execute(() -> IOUtils.closeQuietly(http2SolrClient));
 
       try {
         try {
@@ -865,11 +870,15 @@ public class ZkController implements Closeable {
       if (cloudManager != null) {
         return cloudManager;
       }
-      cloudSolrClient =
-          new CloudLegacySolrClient.Builder(new 
ZkClientClusterStateProvider(zkStateReader))
-              
.withHttpClient(cc.getUpdateShardHandler().getDefaultHttpClient())
+      http2SolrClient =
+          new Http2SolrClient.Builder()
+              .withHttpClient(cc.getDefaultHttpSolrClient())
+              .withIdleTimeout(30000, TimeUnit.MILLISECONDS)
               .withConnectionTimeout(15000, TimeUnit.MILLISECONDS)
-              .withSocketTimeout(30000, TimeUnit.MILLISECONDS)
+              .build();
+      cloudSolrClient =
+          new CloudHttp2SolrClient.Builder(List.of(getZkServerAddress()), 
Optional.empty())
+              .withHttpClient(http2SolrClient)
               .build();
       cloudManager = new SolrClientCloudManager(cloudSolrClient, 
cc.getObjectCache());
       cloudManager.getClusterStateProvider().connect();
diff --git a/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java 
b/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
index 8d3b94071d8..6c5af8facd9 100644
--- a/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
@@ -52,8 +52,8 @@ import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.cloud.DistributedQueue;
 import org.apache.solr.client.solrj.cloud.SolrCloudManager;
-import org.apache.solr.client.solrj.impl.CloudLegacySolrClient;
-import org.apache.solr.client.solrj.impl.CloudSolrClient;
+import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
+import org.apache.solr.client.solrj.impl.Http2SolrClient;
 import org.apache.solr.client.solrj.impl.SolrClientCloudManager;
 import org.apache.solr.cloud.overseer.NodeMutator;
 import org.apache.solr.cloud.overseer.OverseerAction;
@@ -127,7 +127,7 @@ public class OverseerTest extends SolrTestCaseJ4 {
       Collections.synchronizedList(new ArrayList<>());
   private final List<UpdateShardHandler> updateShardHandlers =
       Collections.synchronizedList(new ArrayList<>());
-  private final List<CloudSolrClient> solrClients = 
Collections.synchronizedList(new ArrayList<>());
+  private final List<SolrClient> solrClients = 
Collections.synchronizedList(new ArrayList<>());
   private static final String COLLECTION = 
SolrTestCaseJ4.DEFAULT_TEST_COLLECTION_NAME;
 
   public static class MockZKController {
@@ -1948,13 +1948,18 @@ public class OverseerTest extends SolrTestCaseJ4 {
   }
 
   private SolrCloudManager getCloudDataProvider(String zkAddress) {
-    var client =
-        new 
CloudLegacySolrClient.Builder(Collections.singletonList(zkAddress), 
Optional.empty())
-            .withSocketTimeout(30000, TimeUnit.MILLISECONDS)
+    var httpSolrClient =
+        new Http2SolrClient.Builder()
+            .withIdleTimeout(30000, TimeUnit.MILLISECONDS)
             .withConnectionTimeout(15000, TimeUnit.MILLISECONDS)
             .build();
-    solrClients.add(client);
-    SolrClientCloudManager sccm = new SolrClientCloudManager(client);
+    var cloudSolrClient =
+        new CloudHttp2SolrClient.Builder(Collections.singletonList(zkAddress), 
Optional.empty())
+            .withHttpClient(httpSolrClient)
+            .build();
+    solrClients.add(cloudSolrClient);
+    solrClients.add(httpSolrClient);
+    SolrClientCloudManager sccm = new SolrClientCloudManager(cloudSolrClient, 
null);
     sccm.getClusterStateProvider().connect();
     return sccm;
   }
diff --git a/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java 
b/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
index d7f5d041ef4..6bda0dd6b53 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
@@ -36,6 +36,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.client.solrj.impl.Http2SolrClient;
 import org.apache.solr.common.MapWriter;
 import org.apache.solr.common.cloud.ClusterProperties;
 import org.apache.solr.common.cloud.ClusterState;
@@ -514,6 +515,7 @@ public class ZkControllerTest extends SolrCloudTestCase {
   private static class MockCoreContainer extends CoreContainer {
     UpdateShardHandler updateShardHandler =
         new UpdateShardHandler(UpdateShardHandlerConfig.DEFAULT);
+    Http2SolrClient solrClient;
 
     public MockCoreContainer() {
       super(SolrXmlConfig.fromString(TEST_PATH(), "<solr/>"));
@@ -522,6 +524,7 @@ public class ZkControllerTest extends SolrCloudTestCase {
       this.shardHandlerFactory = httpShardHandlerFactory;
       this.coreAdminHandler = new CoreAdminHandler();
       this.metricManager = mock(SolrMetricManager.class);
+      this.solrClient = new Http2SolrClient.Builder().build();
     }
 
     @Override
@@ -535,9 +538,15 @@ public class ZkControllerTest extends SolrCloudTestCase {
     @Override
     public void shutdown() {
       updateShardHandler.close();
+      solrClient.close();
       super.shutdown();
     }
 
+    @Override
+    public Http2SolrClient getDefaultHttpSolrClient() {
+      return solrClient;
+    }
+
     @Override
     public SolrMetricManager getMetricManager() {
       return metricManager;
diff --git a/solr/solrj-zookeeper/build.gradle 
b/solr/solrj-zookeeper/build.gradle
index a8dccd8b7bc..2e03d9fed3c 100644
--- a/solr/solrj-zookeeper/build.gradle
+++ b/solr/solrj-zookeeper/build.gradle
@@ -34,8 +34,6 @@ dependencies {
 
     // declare dependencies we use even though already declared by solrj-core
     implementation 'org.slf4j:slf4j-api'
-    implementation 'org.apache.httpcomponents:httpclient'
-    implementation 'org.apache.httpcomponents:httpcore'
 
     api('org.apache.zookeeper:zookeeper', {
         exclude group: "org.apache.yetus", module: "audience-annotations"
diff --git 
a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/cloud/DelegatingCloudManager.java
 
b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/cloud/DelegatingCloudManager.java
index cc8c265692f..c259ac3a29c 100644
--- 
a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/cloud/DelegatingCloudManager.java
+++ 
b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/cloud/DelegatingCloudManager.java
@@ -17,7 +17,6 @@
 package org.apache.solr.client.solrj.cloud;
 
 import java.io.IOException;
-import java.util.Map;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrResponse;
 import org.apache.solr.client.solrj.impl.ClusterStateProvider;
@@ -69,18 +68,6 @@ public class DelegatingCloudManager implements 
SolrCloudManager {
     return delegate.request(req);
   }
 
-  @Override
-  public byte[] httpRequest(
-      String url,
-      SolrRequest.METHOD method,
-      Map<String, String> headers,
-      String payload,
-      int timeout,
-      boolean followRedirects)
-      throws IOException {
-    return delegate.httpRequest(url, method, headers, payload, timeout, 
followRedirects);
-  }
-
   @Override
   public void close() throws IOException {
     delegate.close();
diff --git 
a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/cloud/SolrCloudManager.java
 
b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/cloud/SolrCloudManager.java
index f169bbc3443..d244addd952 100644
--- 
a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/cloud/SolrCloudManager.java
+++ 
b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/cloud/SolrCloudManager.java
@@ -18,7 +18,6 @@
 package org.apache.solr.client.solrj.cloud;
 
 import java.io.IOException;
-import java.util.Map;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrResponse;
 import org.apache.solr.client.solrj.impl.ClusterStateProvider;
@@ -53,13 +52,4 @@ public interface SolrCloudManager extends SolrCloseable {
   // Solr-like methods
 
   <T extends SolrResponse> T request(SolrRequest<T> req) throws IOException;
-
-  byte[] httpRequest(
-      String url,
-      SolrRequest.METHOD method,
-      Map<String, String> headers,
-      String payload,
-      int timeout,
-      boolean followRedirects)
-      throws IOException;
 }
diff --git 
a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/SolrClientCloudManager.java
 
b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/SolrClientCloudManager.java
index 626a917e7ed..3dca5176aa1 100644
--- 
a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/SolrClientCloudManager.java
+++ 
b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/SolrClientCloudManager.java
@@ -19,20 +19,6 @@ package org.apache.solr.client.solrj.impl;
 
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
-import java.nio.charset.StandardCharsets;
-import java.util.Map;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.HttpDelete;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpPut;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.util.EntityUtils;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrResponse;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -51,7 +37,7 @@ import org.slf4j.LoggerFactory;
 public class SolrClientCloudManager implements SolrCloudManager {
   private static final Logger log = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-  protected final CloudLegacySolrClient solrClient;
+  private final CloudHttp2SolrClient cloudSolrClient;
   private final ZkDistribStateManager stateManager;
   private final ZkStateReader zkStateReader;
   private final SolrZkClient zkClient;
@@ -59,13 +45,9 @@ public class SolrClientCloudManager implements 
SolrCloudManager {
   private final boolean closeObjectCache;
   private volatile boolean isClosed;
 
-  public SolrClientCloudManager(CloudLegacySolrClient solrClient) {
-    this(solrClient, null);
-  }
-
-  public SolrClientCloudManager(CloudLegacySolrClient solrClient, ObjectCache 
objectCache) {
-    this.solrClient = solrClient;
-    this.zkStateReader = ZkStateReader.from(solrClient);
+  public SolrClientCloudManager(CloudHttp2SolrClient client, ObjectCache 
objectCache) {
+    this.cloudSolrClient = client;
+    this.zkStateReader = ZkStateReader.from(client);
     this.zkClient = zkStateReader.getZkClient();
     this.stateManager = new ZkDistribStateManager(zkClient);
     this.isClosed = false;
@@ -103,12 +85,12 @@ public class SolrClientCloudManager implements 
SolrCloudManager {
 
   @Override
   public ClusterStateProvider getClusterStateProvider() {
-    return solrClient.getClusterStateProvider();
+    return cloudSolrClient.getClusterStateProvider();
   }
 
   @Override
   public NodeStateProvider getNodeStateProvider() {
-    return new SolrClientNodeStateProvider(solrClient);
+    return new SolrClientNodeStateProvider(cloudSolrClient);
   }
 
   @Override
@@ -119,7 +101,7 @@ public class SolrClientCloudManager implements 
SolrCloudManager {
   @Override
   public <T extends SolrResponse> T request(SolrRequest<T> req) throws 
IOException {
     try {
-      return req.process(solrClient);
+      return req.process(cloudSolrClient);
     } catch (SolrServerException e) {
       throw new IOException(e);
     }
@@ -127,68 +109,6 @@ public class SolrClientCloudManager implements 
SolrCloudManager {
 
   private static final byte[] EMPTY = new byte[0];
 
-  @Override
-  public byte[] httpRequest(
-      String url,
-      SolrRequest.METHOD method,
-      Map<String, String> headers,
-      String payload,
-      int timeout,
-      boolean followRedirects)
-      throws IOException {
-    HttpClient client = solrClient.getHttpClient();
-    final HttpRequestBase req;
-    HttpEntity entity = null;
-    if (payload != null) {
-      entity = new StringEntity(payload, StandardCharsets.UTF_8);
-    }
-    switch (method) {
-      case GET:
-        req = new HttpGet(url);
-        break;
-      case POST:
-        req = new HttpPost(url);
-        if (entity != null) {
-          ((HttpPost) req).setEntity(entity);
-        }
-        break;
-      case PUT:
-        req = new HttpPut(url);
-        if (entity != null) {
-          ((HttpPut) req).setEntity(entity);
-        }
-        break;
-      case DELETE:
-        req = new HttpDelete(url);
-        break;
-      default:
-        throw new IOException("Unsupported method " + method);
-    }
-    if (headers != null) {
-      headers.forEach((k, v) -> req.addHeader(k, v));
-    }
-    RequestConfig.Builder requestConfigBuilder = 
HttpClientUtil.createDefaultRequestConfigBuilder();
-    if (timeout > 0) {
-      requestConfigBuilder.setSocketTimeout(timeout);
-      requestConfigBuilder.setConnectTimeout(timeout);
-    }
-    requestConfigBuilder.setRedirectsEnabled(followRedirects);
-    req.setConfig(requestConfigBuilder.build());
-    HttpClientContext httpClientRequestContext = 
HttpClientUtil.createNewHttpClientRequestContext();
-    HttpResponse rsp = client.execute(req, httpClientRequestContext);
-    int statusCode = rsp.getStatusLine().getStatusCode();
-    if (statusCode != 200) {
-      throw new IOException(
-          "Error sending request to " + url + ", HTTP response: " + 
rsp.toString());
-    }
-    HttpEntity responseEntity = rsp.getEntity();
-    if (responseEntity != null && responseEntity.getContent() != null) {
-      return EntityUtils.toByteArray(responseEntity);
-    } else {
-      return EMPTY;
-    }
-  }
-
   public SolrZkClient getZkClient() {
     return zkClient;
   }
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 7e70378c582..984e1b7a18f 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
@@ -54,14 +54,14 @@ import org.slf4j.LoggerFactory;
 public class SolrClientNodeStateProvider implements NodeStateProvider, 
MapWriter {
   private static final Logger log = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-  private final CloudLegacySolrClient solrClient;
+  private final CloudHttp2SolrClient solrClient;
   protected final Map<String, Map<String, Map<String, List<Replica>>>>
       nodeVsCollectionVsShardVsReplicaInfo = new HashMap<>();
 
   @SuppressWarnings({"rawtypes"})
   private Map<String, Map> nodeVsTags = new HashMap<>();
 
-  public SolrClientNodeStateProvider(CloudLegacySolrClient solrClient) {
+  public SolrClientNodeStateProvider(CloudHttp2SolrClient solrClient) {
     this.solrClient = solrClient;
     try {
       readReplicaDetails();
@@ -226,7 +226,7 @@ public class SolrClientNodeStateProvider implements 
NodeStateProvider, MapWriter
   static class RemoteCallCtx {
 
     ZkClientClusterStateProvider zkClientClusterStateProvider;
-    CloudLegacySolrClient solrClient;
+    CloudHttp2SolrClient cloudSolrClient;
     public final Map<String, Object> tags = new HashMap<>();
     private final String node;
     public Map<String, Object> session;
@@ -238,11 +238,11 @@ public class SolrClientNodeStateProvider implements 
NodeStateProvider, MapWriter
       return true;
     }
 
-    public RemoteCallCtx(String node, CloudLegacySolrClient solrClient) {
+    public RemoteCallCtx(String node, CloudHttp2SolrClient cloudSolrClient) {
       this.node = node;
-      this.solrClient = solrClient;
+      this.cloudSolrClient = cloudSolrClient;
       this.zkClientClusterStateProvider =
-          (ZkClientClusterStateProvider) solrClient.getClusterStateProvider();
+          (ZkClientClusterStateProvider) 
cloudSolrClient.getClusterStateProvider();
     }
 
     /**
@@ -290,15 +290,15 @@ public class SolrClientNodeStateProvider implements 
NodeStateProvider, MapWriter
       String url = 
zkClientClusterStateProvider.getZkStateReader().getBaseUrlForNodeName(solrNode);
 
       GenericSolrRequest request = new 
GenericSolrRequest(SolrRequest.METHOD.POST, path, params);
-      try (var client =
-          new HttpSolrClient.Builder()
-              .withHttpClient(solrClient.getHttpClient())
-              .withBaseSolrUrl(url)
-              .withResponseParser(new BinaryResponseParser())
-              .build()) {
-        NamedList<Object> rsp = client.request(request);
+      request.setResponseParser(new BinaryResponseParser());
+
+      try {
+        NamedList<Object> rsp =
+            cloudSolrClient.getHttpClient().requestWithBaseUrl(url, 
request::process).getResponse();
         request.response.setResponse(rsp);
         return request.response;
+      } catch (SolrServerException | IOException e) {
+        throw new SolrException(ErrorCode.SERVER_ERROR, "Fetching replica 
metrics failed", e);
       }
     }
 
diff --git 
a/solr/solrj-zookeeper/src/test/org/apache/solr/client/solrj/impl/NodeValueFetcherTest.java
 
b/solr/solrj-zookeeper/src/test/org/apache/solr/client/solrj/impl/NodeValueFetcherTest.java
index 5f521dbb20c..29edd771b43 100644
--- 
a/solr/solrj-zookeeper/src/test/org/apache/solr/client/solrj/impl/NodeValueFetcherTest.java
+++ 
b/solr/solrj-zookeeper/src/test/org/apache/solr/client/solrj/impl/NodeValueFetcherTest.java
@@ -16,6 +16,8 @@
  */
 package org.apache.solr.client.solrj.impl;
 
+import java.util.Collections;
+import java.util.Optional;
 import java.util.Set;
 import 
org.apache.solr.client.solrj.impl.SolrClientNodeStateProvider.RemoteCallCtx;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
@@ -62,28 +64,31 @@ public class NodeValueFetcherTest extends SolrCloudTestCase 
{
   }
 
   @Test
-  public void testGetTags() {
-
-    CloudLegacySolrClient solrClient = (CloudLegacySolrClient) 
cluster.getSolrClient();
-    int totalCores = 0;
-
-    // Sum all the cores of the collection by fetching tags of all nodes.
-    // We should get same number than when we created the collection
-    for (JettySolrRunner runner : cluster.getJettySolrRunners()) {
-      String node = runner.getNodeName();
-      RemoteCallCtx ctx = new RemoteCallCtx(node, solrClient);
-      NodeValueFetcher fetcher = new NodeValueFetcher();
-
-      Set<String> requestedTags = Set.of("cores");
-      fetcher.getTags(requestedTags, ctx);
-
-      // make sure we only get the tag we asked
-      assertEquals(1, ctx.tags.size());
-
-      int coresOnNode = (Integer) ctx.tags.get("cores");
-      totalCores += coresOnNode;
+  public void testGetTags() throws Exception {
+    try (var cloudHttp2SolrClient =
+        new CloudHttp2SolrClient.Builder(
+                
Collections.singletonList(cluster.getZkServer().getZkAddress()), 
Optional.empty())
+            .build()) {
+      int totalCores = 0;
+
+      // Sum all the cores of the collection by fetching tags of all nodes.
+      // We should get same number than when we created the collection
+      for (JettySolrRunner runner : cluster.getJettySolrRunners()) {
+        String node = runner.getNodeName();
+        RemoteCallCtx ctx = new RemoteCallCtx(node, cloudHttp2SolrClient);
+        NodeValueFetcher fetcher = new NodeValueFetcher();
+
+        Set<String> requestedTags = Set.of("cores");
+        fetcher.getTags(requestedTags, ctx);
+
+        // make sure we only get the tag we asked
+        assertEquals(1, ctx.tags.size());
+
+        int coresOnNode = (Integer) ctx.tags.get("cores");
+        totalCores += coresOnNode;
+      }
+
+      assertEquals(numShards * numReplicas, totalCores);
     }
-
-    assertEquals(numShards * numReplicas, totalCores);
   }
 }

Reply via email to