Skip to content

Commit 1ed3f01

Browse files
committed
SOLR-18130: Replace ZooKeeper solr client builder usage with connection string in SolrClientCache
1 parent 26591e1 commit 1ed3f01

2 files changed

Lines changed: 41 additions & 13 deletions

File tree

solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/SolrClientCache.java

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@
1818

1919
import java.io.Closeable;
2020
import java.util.HashMap;
21-
import java.util.List;
2221
import java.util.Map;
2322
import java.util.Objects;
2423
import java.util.Optional;
2524
import java.util.concurrent.TimeUnit;
2625
import java.util.concurrent.atomic.AtomicBoolean;
2726
import java.util.concurrent.atomic.AtomicReference;
2827
import org.apache.solr.client.solrj.SolrClient;
28+
import org.apache.solr.client.solrj.impl.CloudClientConnectionString;
2929
import org.apache.solr.client.solrj.impl.CloudSolrClient;
3030
import org.apache.solr.client.solrj.impl.HttpSolrClientBase;
3131
import org.apache.solr.client.solrj.impl.HttpSolrClientBuilderBase;
@@ -77,29 +77,33 @@ public void setDefaultZKHost(String zkHost) {
7777
}
7878
}
7979

80-
public synchronized CloudSolrClient getCloudSolrClient(String zkHost) {
80+
public synchronized CloudSolrClient getCloudSolrClient(String connectionString) {
8181
ensureOpen();
82-
Objects.requireNonNull(zkHost, "ZooKeeper host cannot be null!");
83-
if (solrClients.containsKey(zkHost)) {
84-
return (CloudSolrClient) solrClients.get(zkHost);
82+
Objects.requireNonNull(connectionString, "Connection string cannot be null!");
83+
if (solrClients.containsKey(connectionString)) {
84+
return (CloudSolrClient) solrClients.get(connectionString);
8585
}
8686
// Can only use ZK ACLs if there is a default ZK Host, and the given ZK host contains that
8787
// default.
8888
// Basically the ZK ACLs are assumed to be only used for the default ZK host,
8989
// thus we should only provide the ACLs to that Zookeeper instance.
90-
String zkHostNoChroot = zkHost.split("/")[0];
91-
boolean canUseACLs =
92-
Optional.ofNullable(defaultZkHost.get()).map(zkHostNoChroot::equals).orElse(false);
90+
boolean canUseACLs = false;
91+
CloudClientConnectionString cloudClientConnectionString =
92+
CloudClientConnectionString.parse(connectionString);
93+
if (cloudClientConnectionString.isZk()) {
94+
String zkHostNoChroot = connectionString.split("/")[0];
95+
canUseACLs =
96+
Optional.ofNullable(defaultZkHost.get()).map(zkHostNoChroot::equals).orElse(false);
97+
}
9398

94-
final var client = newCloudSolrClient(zkHost, httpSolrClient, canUseACLs);
95-
solrClients.put(zkHost, client);
99+
final var client = newCloudSolrClient(connectionString, httpSolrClient, canUseACLs);
100+
solrClients.put(connectionString, client);
96101
return client;
97102
}
98103

99104
protected CloudSolrClient newCloudSolrClient(
100-
String zkHost, HttpSolrClientBase httpSolrClient, boolean canUseACLs) {
101-
final List<String> hosts = List.of(zkHost);
102-
var builder = new CloudSolrClient.Builder(hosts, Optional.empty());
105+
String connectionString, HttpSolrClientBase httpSolrClient, boolean canUseACLs) {
106+
var builder = new CloudSolrClient.Builder(connectionString);
103107
builder.canUseZkACLs(canUseACLs);
104108
// using internal builder to ensure the internal client gets closed
105109
builder = builder.withHttpClientBuilder(newHttpSolrClientBuilder(null, httpSolrClient));

solr/solrj-streaming/src/test/org/apache/solr/client/solrj/io/SolrClientCacheTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,16 @@
1717
package org.apache.solr.client.solrj.io;
1818

1919
import java.util.Map;
20+
import org.apache.solr.client.solrj.impl.CloudSolrClient;
2021
import org.apache.solr.cloud.SolrCloudTestCase;
2122
import org.apache.solr.common.SolrException;
23+
import org.apache.solr.common.cloud.ClusterState;
2224
import org.apache.solr.common.cloud.DigestZkACLProvider;
2325
import org.apache.solr.common.cloud.DigestZkCredentialsProvider;
2426
import org.apache.solr.common.cloud.SolrZkClient;
2527
import org.apache.solr.common.cloud.VMParamsZkCredentialsInjector;
2628
import org.junit.AfterClass;
29+
import org.junit.Assert;
2730
import org.junit.BeforeClass;
2831
import org.junit.Test;
2932

@@ -66,6 +69,27 @@ public void testZkACLsNotUsedWithDifferentZkHost() {
6669
}
6770
}
6871

72+
@Test
73+
public void testGetClientWithHttp() {
74+
String solrUrl = cluster.getJettySolrRunner(0).getBaseUrl().toString();
75+
try (SolrClientCache cache = new SolrClientCache()) {
76+
CloudSolrClient cloudSolrClient = cache.getCloudSolrClient(solrUrl);
77+
ClusterState clusterState = cloudSolrClient.getClusterStateProvider().getClusterState();
78+
Assert.assertEquals(1, clusterState.getLiveNodes().size());
79+
}
80+
}
81+
82+
@Test
83+
public void testGetClientWithZookeeper() {
84+
String zkConnectionString = zkClient().getZkServerAddress();
85+
try (SolrClientCache cache = new SolrClientCache()) {
86+
cache.setDefaultZKHost(zkClient().getZkServerAddress());
87+
CloudSolrClient cloudSolrClient = cache.getCloudSolrClient(zkConnectionString);
88+
ClusterState clusterState = cloudSolrClient.getClusterStateProvider().getClusterState();
89+
Assert.assertEquals(1, clusterState.getLiveNodes().size());
90+
}
91+
}
92+
6993
@Test
7094
public void testZkACLsUsedWithDifferentChroot() {
7195
try (SolrClientCache cache = new SolrClientCache()) {

0 commit comments

Comments
 (0)