Skip to content

Commit d3e57aa

Browse files
authored
SOLR-17541: LBSolrClient implementations should agree on 'getClient()' semantics (#2899)
1 parent a40826e commit d3e57aa

19 files changed

+344
-348
lines changed

solr/CHANGES.txt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ Improvements
3434

3535
* SOLR-17516: `LBHttp2SolrClient` is now generic, adding support for `HttpJdkSolrClient`. (James Dyer)
3636

37+
* SOLR-17541: `LBHttp2SolrClient` now maintains a separate internal/delegate client per Solr Base URL. Both `LBHttp2SolrClient` and `CloudHttp2SolrClient`
38+
always create and manage these internal clients. The ability for callers to provide a pre-built client is removed. Callers may specify the internal client
39+
details by providing an instance of either `Http2SolrClient.Builder` or `HttpJdkSolrClient.Builder`. (James Dyer)
40+
3741
Optimizations
3842
---------------------
3943
* SOLR-17568: The CLI bin/solr export tool now contacts the appropriate nodes directly for data instead of proxying through one.
@@ -102,6 +106,11 @@ Deprecation Removals
102106

103107
* SOLR-17540: Removed the Hadoop Auth module, and thus Kerberos authentication and other exotic options. (Eric Pugh)
104108

109+
* SOLR-17541: Removed `CloudHttp2SolrClient.Builder#withHttpClient` in favor of `CloudHttp2SolrClient.Builder#withInternalClientBuilder`.
110+
The constructor on `LBHttp2SolrClient.Builder` that took an instance of `HttpSolrClientBase` is updated to instead take an instance of
111+
`HttpSolrClientBuilderBase`. Renamed `LBHttp2SolrClient.Builder#withListenerFactory` to `LBHttp2SolrClient.Builder#withListenerFactories`
112+
(James Dyer)
113+
105114
Dependency Upgrades
106115
---------------------
107116
(No changes)
@@ -150,7 +159,10 @@ New Features
150159

151160
Improvements
152161
---------------------
153-
(No changes)
162+
* SOLR-17541: Deprecate `CloudHttp2SolrClient.Builder#withHttpClient` in favor of
163+
`CloudHttp2SolrClient.Builder#withInternalClientBuilder`.
164+
Deprecate `LBHttp2SolrClient.Builder#withListenerFactory` in favor of
165+
`LBHttp2SolrClient.Builder#withListenerFactories` (James Dyer)
154166

155167
Optimizations
156168
---------------------

solr/core/src/java/org/apache/solr/cloud/ZkController.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -197,9 +197,6 @@ public String toString() {
197197
public final ZkStateReader zkStateReader;
198198
private SolrCloudManager cloudManager;
199199

200-
// only for internal usage
201-
private Http2SolrClient http2SolrClient;
202-
203200
private CloudHttp2SolrClient cloudSolrClient;
204201

205202
private final String zkServerAddress; // example: 127.0.0.1:54062/solr
@@ -754,7 +751,6 @@ public void close() {
754751
sysPropsCacher.close();
755752
customThreadPool.execute(() -> IOUtils.closeQuietly(cloudManager));
756753
customThreadPool.execute(() -> IOUtils.closeQuietly(cloudSolrClient));
757-
customThreadPool.execute(() -> IOUtils.closeQuietly(http2SolrClient));
758754

759755
try {
760756
try {
@@ -850,15 +846,14 @@ public SolrCloudManager getSolrCloudManager() {
850846
if (cloudManager != null) {
851847
return cloudManager;
852848
}
853-
http2SolrClient =
849+
var httpSolrClientBuilder =
854850
new Http2SolrClient.Builder()
855851
.withHttpClient(cc.getDefaultHttpSolrClient())
856852
.withIdleTimeout(30000, TimeUnit.MILLISECONDS)
857-
.withConnectionTimeout(15000, TimeUnit.MILLISECONDS)
858-
.build();
853+
.withConnectionTimeout(15000, TimeUnit.MILLISECONDS);
859854
cloudSolrClient =
860855
new CloudHttp2SolrClient.Builder(new ZkClientClusterStateProvider(zkStateReader))
861-
.withHttpClient(http2SolrClient)
856+
.withInternalClientBuilder(httpSolrClientBuilder)
862857
.build();
863858
cloudManager = new SolrClientCloudManager(cloudSolrClient, cc.getObjectCache());
864859
cloudManager.getClusterStateProvider().connect();

solr/core/src/java/org/apache/solr/core/HttpSolrClientProvider.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
*/
1717
package org.apache.solr.core;
1818

19-
import java.util.List;
2019
import java.util.concurrent.TimeUnit;
2120
import org.apache.solr.client.solrj.impl.Http2SolrClient;
2221
import org.apache.solr.common.util.IOUtils;
@@ -37,22 +36,24 @@ final class HttpSolrClientProvider implements AutoCloseable {
3736

3837
private final Http2SolrClient httpSolrClient;
3938

39+
private final Http2SolrClient.Builder httpSolrClientBuilder;
40+
4041
private final InstrumentedHttpListenerFactory trackHttpSolrMetrics;
4142

4243
HttpSolrClientProvider(UpdateShardHandlerConfig cfg, SolrMetricsContext parentContext) {
4344
trackHttpSolrMetrics = new InstrumentedHttpListenerFactory(getNameStrategy(cfg));
4445
initializeMetrics(parentContext);
4546

46-
Http2SolrClient.Builder httpClientBuilder =
47-
new Http2SolrClient.Builder().withListenerFactory(List.of(trackHttpSolrMetrics));
47+
this.httpSolrClientBuilder =
48+
new Http2SolrClient.Builder().addListenerFactory(trackHttpSolrMetrics);
4849

4950
if (cfg != null) {
50-
httpClientBuilder
51+
httpSolrClientBuilder
5152
.withConnectionTimeout(cfg.getDistributedConnectionTimeout(), TimeUnit.MILLISECONDS)
5253
.withIdleTimeout(cfg.getDistributedSocketTimeout(), TimeUnit.MILLISECONDS)
5354
.withMaxConnectionsPerHost(cfg.getMaxUpdateConnectionsPerHost());
5455
}
55-
httpSolrClient = httpClientBuilder.build();
56+
httpSolrClient = httpSolrClientBuilder.build();
5657
}
5758

5859
private InstrumentedHttpListenerFactory.NameStrategy getNameStrategy(
@@ -76,7 +77,7 @@ Http2SolrClient getSolrClient() {
7677
}
7778

7879
void setSecurityBuilder(HttpClientBuilderPlugin builder) {
79-
builder.setup(httpSolrClient);
80+
builder.setup(httpSolrClientBuilder, httpSolrClient);
8081
}
8182

8283
@Override

solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ public class HttpShardHandler extends ShardHandler {
114114
protected AtomicInteger pending;
115115

116116
private final Map<String, List<String>> shardToURLs;
117-
protected LBHttp2SolrClient<Http2SolrClient> lbClient;
117+
protected LBHttp2SolrClient<Http2SolrClient.Builder> lbClient;
118118

119119
public HttpShardHandler(HttpShardHandlerFactory httpShardHandlerFactory) {
120120
this.httpShardHandlerFactory = httpShardHandlerFactory;

solr/core/src/java/org/apache/solr/handler/component/HttpShardHandlerFactory.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,9 @@ public class HttpShardHandlerFactory extends ShardHandlerFactory
8383
protected ExecutorService commExecutor;
8484

8585
protected volatile Http2SolrClient defaultClient;
86+
protected Http2SolrClient.Builder httpSolrClientBuilder;
8687
protected InstrumentedHttpListenerFactory httpListenerFactory;
87-
protected LBHttp2SolrClient<Http2SolrClient> loadbalancer;
88+
protected LBHttp2SolrClient<Http2SolrClient.Builder> loadbalancer;
8889

8990
int corePoolSize = 0;
9091
int maximumPoolSize = Integer.MAX_VALUE;
@@ -305,16 +306,16 @@ public void init(PluginInfo info) {
305306
sb);
306307
int soTimeout =
307308
getParameter(args, HttpClientUtil.PROP_SO_TIMEOUT, HttpClientUtil.DEFAULT_SO_TIMEOUT, sb);
308-
309-
this.defaultClient =
309+
this.httpSolrClientBuilder =
310310
new Http2SolrClient.Builder()
311311
.withConnectionTimeout(connectionTimeout, TimeUnit.MILLISECONDS)
312312
.withIdleTimeout(soTimeout, TimeUnit.MILLISECONDS)
313313
.withExecutor(commExecutor)
314314
.withMaxConnectionsPerHost(maxConnectionsPerHost)
315-
.build();
316-
this.defaultClient.addListenerFactory(this.httpListenerFactory);
317-
this.loadbalancer = new LBHttp2SolrClient.Builder<Http2SolrClient>(defaultClient).build();
315+
.addListenerFactory(this.httpListenerFactory);
316+
this.defaultClient = httpSolrClientBuilder.build();
317+
318+
this.loadbalancer = new LBHttp2SolrClient.Builder<>(httpSolrClientBuilder).build();
318319

319320
initReplicaListTransformers(getParameter(args, "replicaRouting", null, sb));
320321

@@ -324,7 +325,7 @@ public void init(PluginInfo info) {
324325
@Override
325326
public void setSecurityBuilder(HttpClientBuilderPlugin clientBuilderPlugin) {
326327
if (clientBuilderPlugin != null) {
327-
clientBuilderPlugin.setup(defaultClient);
328+
clientBuilderPlugin.setup(httpSolrClientBuilder, defaultClient);
328329
}
329330
}
330331

solr/core/src/java/org/apache/solr/security/HttpClientBuilderPlugin.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,9 @@ public interface HttpClientBuilderPlugin {
3434
public SolrHttpClientBuilder getHttpClientBuilder(SolrHttpClientBuilder builder);
3535

3636
public default void setup(Http2SolrClient client) {}
37+
38+
/** TODO: Ideally, we only pass the builder here. */
39+
public default void setup(Http2SolrClient.Builder builder, Http2SolrClient client) {
40+
setup(client);
41+
}
3742
}

solr/core/src/java/org/apache/solr/security/PKIAuthenticationPlugin.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,11 @@ PublicKey fetchPublicKeyFromRemote(String nodename) {
376376

377377
@Override
378378
public void setup(Http2SolrClient client) {
379+
setup(null, client);
380+
}
381+
382+
@Override
383+
public void setup(Http2SolrClient.Builder builder, Http2SolrClient client) {
379384
final HttpListenerFactory.RequestResponseListener listener =
380385
new HttpListenerFactory.RequestResponseListener() {
381386
private static final String CACHED_REQUEST_USER_KEY = "cachedRequestUser";
@@ -431,7 +436,12 @@ private Optional<String> getUserFromJettyRequest(Request request) {
431436
(String) request.getAttributes().get(CACHED_REQUEST_USER_KEY));
432437
}
433438
};
434-
client.addListenerFactory(() -> listener);
439+
if (client != null) {
440+
client.addListenerFactory(() -> listener);
441+
}
442+
if (builder != null) {
443+
builder.addListenerFactory(() -> listener);
444+
}
435445
}
436446

437447
@Override

solr/core/src/test/org/apache/solr/cli/PostToolTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ public void testBasicRun() throws Exception {
7676

7777
withBasicAuth(CollectionAdminRequest.createCollection(collection, "conf1", 1, 1, 0, 0))
7878
.processAndWait(cluster.getSolrClient(), 10);
79+
waitForState("creating", collection, activeClusterShape(1, 1));
7980

8081
File jsonDoc = File.createTempFile("temp", ".json");
8182

solr/core/src/test/org/apache/solr/cloud/OverseerTest.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1945,17 +1945,16 @@ public Void answer(InvocationOnMock invocation) {
19451945
}
19461946

19471947
private SolrCloudManager getCloudDataProvider(ZkStateReader zkStateReader) {
1948-
var httpSolrClient =
1948+
var httpSolrClientBuilder =
19491949
new Http2SolrClient.Builder()
19501950
.withIdleTimeout(30000, TimeUnit.MILLISECONDS)
1951-
.withConnectionTimeout(15000, TimeUnit.MILLISECONDS)
1952-
.build();
1951+
.withConnectionTimeout(15000, TimeUnit.MILLISECONDS);
19531952
var cloudSolrClient =
19541953
new CloudHttp2SolrClient.Builder(new ZkClientClusterStateProvider(zkStateReader))
1955-
.withHttpClient(httpSolrClient)
1954+
.withInternalClientBuilder(httpSolrClientBuilder)
19561955
.build();
19571956
solrClients.add(cloudSolrClient);
1958-
solrClients.add(httpSolrClient);
1957+
solrClients.add(httpSolrClientBuilder.build());
19591958
SolrClientCloudManager sccm = new SolrClientCloudManager(cloudSolrClient, null);
19601959
sccm.getClusterStateProvider().connect();
19611960
return sccm;

solr/solrj/src/java/org/apache/solr/client/solrj/SolrClientFunction.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@
1818

1919
import java.io.IOException;
2020

21-
/** A lambda intended for invoking SolrClient operations */
21+
/**
22+
* A lambda intended for invoking SolrClient operations
23+
*
24+
* @lucene.experimental
25+
*/
2226
@FunctionalInterface
2327
public interface SolrClientFunction<C extends SolrClient, R> {
2428
R apply(C c) throws IOException, SolrServerException;

0 commit comments

Comments
 (0)