Skip to content

Commit 1962fc6

Browse files
SOLR-18056: CloudSolrClient better urlScheme detection (from URL or solr.ssl.enabled) (apache#4162)
Improved CloudSolrClient's urlScheme detection by using the scheme of provided Solr URLs, or looking at "solr.ssl.enabled". Co-authored-by: David Smiley <dsmiley@apache.org>
1 parent 6473e2a commit 1962fc6

File tree

7 files changed

+108
-3
lines changed

7 files changed

+108
-3
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# See https://github.com/apache/solr/blob/main/dev-docs/changelog.adoc
2+
title: Improved CloudSolrClient's urlScheme detection by using the scheme of provided Solr URLs, or looking at "solr.ssl.enabled".
3+
type: changed
4+
authors:
5+
- name: Vishnu Priya Chandra Sekar
6+
links:
7+
- name: SOLR-18056
8+
url: https://issues.apache.org/jira/browse/SOLR-18056

solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/ZkClientClusterStateProvider.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.apache.solr.common.cloud.ZkNodeProps;
3636
import org.apache.solr.common.cloud.ZkStateReader;
3737
import org.apache.solr.common.cloud.ZooKeeperException;
38+
import org.apache.solr.common.util.EnvUtils;
3839
import org.apache.solr.common.util.Utils;
3940
import org.apache.zookeeper.KeeperException;
4041
import org.noggit.JSONWriter;
@@ -45,7 +46,7 @@
4546
public class ZkClientClusterStateProvider
4647
implements ClusterStateProvider, SolrZkClientTimeoutAware {
4748
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
48-
49+
private static final String SOLR_SSL_ENABLED = "solr.ssl.enabled";
4950
volatile ZkStateReader zkStateReader;
5051
private boolean closeZkStateReader = true;
5152
private final String zkHost;
@@ -339,4 +340,20 @@ public int getZkClientTimeout() {
339340
public void setZkClientTimeout(int zkClientTimeout) {
340341
this.zkClientTimeout = zkClientTimeout;
341342
}
343+
344+
/**
345+
* @return url scheme with the help of cluster property or environment variable.
346+
*/
347+
@Override
348+
public String getUrlScheme() {
349+
final Boolean isSolrSslEnabled = EnvUtils.getPropertyAsBool(SOLR_SSL_ENABLED);
350+
if (isSolrSslEnabled != null) {
351+
return isSolrSslEnabled ? "https" : "http";
352+
}
353+
final Object urlSchemeClusterProperty = getClusterProperty(ClusterState.URL_SCHEME);
354+
if (urlSchemeClusterProperty != null) {
355+
return urlSchemeClusterProperty.toString();
356+
}
357+
return "http";
358+
}
342359
}

solr/solrj/src/java/org/apache/solr/client/solrj/impl/BaseHttpClusterStateProvider.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,12 @@ public abstract class BaseHttpClusterStateProvider implements ClusterStateProvid
7373
Executors.newSingleThreadScheduledExecutor(
7474
new SolrNamedThreadFactory("liveNodeReloadingExecutor"));
7575

76-
protected void initConfiguredNodes(List<String> solrUrls) throws Exception {
76+
protected void initConfiguredNodes(List<String> solrUrls) {
7777
this.configuredNodes =
7878
solrUrls.stream()
7979
.map(BaseHttpClusterStateProvider::stringToUrl)
8080
.collect(Collectors.toList());
81+
this.urlScheme = this.configuredNodes.get(0).getProtocol();
8182
}
8283

8384
private static URL stringToUrl(String solrUrl) {
@@ -445,6 +446,11 @@ public void close() throws IOException {
445446
liveNodeReloadingService.shutdown();
446447
}
447448

449+
@Override
450+
public String getUrlScheme() {
451+
return this.urlScheme;
452+
}
453+
448454
private enum ClusterStateRequestType {
449455
FETCH_LIVE_NODES,
450456
FETCH_CLUSTER_PROP,

solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1452,7 +1452,7 @@ protected NamedList<Object> sendRequest(SolrRequest<?> request, List<String> inp
14521452
requestRLTGenerator.getReplicaListTransformer(reqParams);
14531453

14541454
final ClusterStateProvider provider = getClusterStateProvider();
1455-
final String urlScheme = provider.getClusterProperty(ClusterState.URL_SCHEME, "http");
1455+
final String urlScheme = provider.getUrlScheme();
14561456
final Set<String> liveNodes = provider.getLiveNodes();
14571457

14581458
final List<LBSolrClient.Endpoint> requestEndpoints =

solr/solrj/src/java/org/apache/solr/client/solrj/impl/ClusterStateProvider.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,7 @@ default <T> T getClusterProperty(String key, T defaultValue) {
127127
void connect();
128128

129129
String getQuorumHosts();
130+
131+
/** Get url scheme like http or https but never null. */
132+
String getUrlScheme();
130133
}

solr/solrj/src/java/org/apache/solr/client/solrj/impl/DelegatingClusterStateProvider.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,4 +140,12 @@ public String getQuorumHosts() {
140140
}
141141
return null;
142142
}
143+
144+
@Override
145+
public String getUrlScheme() {
146+
if (delegate != null) {
147+
return delegate.getUrlScheme();
148+
}
149+
return null;
150+
}
143151
}

solr/solrj/src/test/org/apache/solr/client/solrj/impl/ClusterStateProviderTest.java

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.io.IOException;
2828
import java.lang.invoke.MethodHandles;
2929
import java.lang.reflect.InvocationTargetException;
30+
import java.nio.file.Path;
3031
import java.time.Instant;
3132
import java.util.List;
3233
import java.util.Map;
@@ -39,8 +40,13 @@
3940
import org.apache.solr.client.solrj.request.CollectionAdminRequest;
4041
import org.apache.solr.client.solrj.response.CollectionAdminResponse;
4142
import org.apache.solr.cloud.SolrCloudTestCase;
43+
import org.apache.solr.cloud.ZkController;
44+
import org.apache.solr.cloud.ZkTestServer;
45+
import org.apache.solr.common.cloud.ClusterProperties;
4246
import org.apache.solr.common.cloud.ClusterState;
4347
import org.apache.solr.common.cloud.DocCollection;
48+
import org.apache.solr.common.cloud.SolrZkClient;
49+
import org.apache.solr.common.cloud.ZkStateReader;
4450
import org.apache.solr.common.util.NamedList;
4551
import org.eclipse.jetty.http.HttpField;
4652
import org.eclipse.jetty.http.HttpHeader;
@@ -54,6 +60,7 @@
5460
public class ClusterStateProviderTest extends SolrCloudTestCase {
5561

5662
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
63+
private static final String SOLR_SSL_ENABLED = "solr.ssl.enabled";
5764

5865
static class UserAgentChangingJdkClient extends HttpJdkSolrClient {
5966

@@ -435,6 +442,62 @@ public void testClusterStateProviderLiveNodesWithNewNode() throws Exception {
435442
}
436443
}
437444

445+
@Test
446+
public void testHttpClusterStateProviderUrlScheme() throws Exception {
447+
final List<String> solrUrls =
448+
List.of("https://localhost:8983/solr", "https://localhost:8984/solr");
449+
try (var httpClient = new HttpJettySolrClient.Builder().build();
450+
ClusterStateProvider clusterStateProvider =
451+
new HttpClusterStateProvider<>(solrUrls, httpClient)) {
452+
assertEquals("https", clusterStateProvider.getUrlScheme());
453+
}
454+
}
455+
456+
@Test
457+
public void testZkClusterStateProviderUrlScheme() throws Exception {
458+
final Path zkDir = createTempDir("zkData");
459+
460+
final ZkTestServer server = new ZkTestServer(zkDir);
461+
try {
462+
server.run();
463+
SolrZkClient client = new SolrZkClient.Builder().withUrl(server.getZkAddress()).build();
464+
ZkController.createClusterZkNodes(client);
465+
testUrlSchemeWithClusterProperties(client);
466+
testUrlSchemeDefault(client);
467+
testUrlSchemeWithSystemProperties(client);
468+
client.close();
469+
} finally {
470+
server.shutdown();
471+
}
472+
}
473+
474+
private void testUrlSchemeDefault(SolrZkClient client) throws Exception {
475+
try (var zkStateReader = new ZkStateReader(client);
476+
var clusterStateProvider = new ZkClientClusterStateProvider(zkStateReader)) {
477+
assertEquals("http", clusterStateProvider.getUrlScheme());
478+
}
479+
}
480+
481+
private void testUrlSchemeWithSystemProperties(SolrZkClient client) throws Exception {
482+
System.setProperty(SOLR_SSL_ENABLED, "true");
483+
try (var zkStateReader = new ZkStateReader(client);
484+
var clusterStateProvider = new ZkClientClusterStateProvider(zkStateReader)) {
485+
assertEquals("https", clusterStateProvider.getUrlScheme());
486+
} finally {
487+
System.clearProperty(SOLR_SSL_ENABLED);
488+
}
489+
}
490+
491+
private void testUrlSchemeWithClusterProperties(SolrZkClient client) throws Exception {
492+
ClusterProperties cp = new ClusterProperties(client);
493+
cp.setClusterProperty("urlScheme", "ftp");
494+
try (var zkStateReader = new ZkStateReader(client);
495+
var clusterStateProvider = new ZkClientClusterStateProvider(zkStateReader)) {
496+
zkStateReader.createClusterStateWatchersAndUpdate();
497+
assertEquals("ftp", clusterStateProvider.getUrlScheme());
498+
}
499+
}
500+
438501
private void waitForCSPCacheTimeout() throws InterruptedException {
439502
Thread.sleep(2000);
440503
}

0 commit comments

Comments
 (0)