You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ge...@apache.org on 2024/10/30 10:11:23 UTC
(solr) 01/02: SOLR-17464: Fixed Http2SolrClient bug in that 'requestAsync' triggered NPE when using a shared Jetty client (#2733)
This is an automated email from the ASF dual-hosted git repository.
gerlowskija pushed a commit to branch branch_9_7
in repository https://gitbox.apache.org/repos/asf/solr.git
commit f19981143abe05682a9a20b6c3c87b5923fba8d8
Author: James Dyer <jd...@apache.org>
AuthorDate: Thu Oct 3 08:21:16 2024 -0500
SOLR-17464: Fixed Http2SolrClient bug in that 'requestAsync' triggered NPE when using a shared Jetty client (#2733)
---
solr/CHANGES.txt | 2 ++
.../solr/client/solrj/impl/Http2SolrClient.java | 6 ++++
.../client/solrj/impl/Http2SolrClientTest.java | 40 ++++++++++++++++++++--
.../client/solrj/impl/HttpJdkSolrClientTest.java | 24 +++++++++++--
.../client/solrj/impl/HttpSolrClientTestBase.java | 9 ++---
5 files changed, 71 insertions(+), 10 deletions(-)
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 4433e61626f..81f5884a95b 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -9,6 +9,8 @@ Bug Fixes
---------------------
(No changes)
+* SOLR-17464: Fixed Http2SolrClient bug in that 'requestAsync' triggered NPE when using a shared Jetty client (Jason Gerlowski, James Dyer)
+
Dependency Upgrades
---------------------
(No changes)
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java
index d5e5367a2bc..0def45620e4 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java
@@ -132,6 +132,9 @@ public class Http2SolrClient extends HttpSolrClientBase {
if (builder.httpClient != null) {
this.httpClient = builder.httpClient;
+ if (this.executor == null) {
+ this.executor = builder.executor;
+ }
this.closeClient = false;
} else {
this.httpClient = createHttpClient(builder);
@@ -1129,6 +1132,9 @@ public class Http2SolrClient extends HttpSolrClientBase {
this.listenerFactory = new ArrayList<HttpListenerFactory>();
http2SolrClient.listenerFactory.forEach(this.listenerFactory::add);
}
+ if (this.executor == null) {
+ this.executor = http2SolrClient.executor;
+ }
return this;
}
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/Http2SolrClientTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/Http2SolrClientTest.java
index e84abb1218c..7217969ce76 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/Http2SolrClientTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/Http2SolrClientTest.java
@@ -20,6 +20,7 @@ package org.apache.solr.client.solrj.impl;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
+import java.util.Collections;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;
import org.apache.solr.client.solrj.ResponseParser;
@@ -265,17 +266,37 @@ public class Http2SolrClientTest extends HttpSolrClientTestBase {
@Test
public void testDeprecatedAsyncGet() throws Exception {
- super.testQueryAsync(true);
+ HttpSolrClientBuilderBase<?, ?> b =
+ builder(
+ getBaseUrl() + DEBUG_SERVLET_PATH,
+ DEFAULT_CONNECTION_TIMEOUT,
+ DEFAULT_CONNECTION_TIMEOUT)
+ .withResponseParser(new XMLResponseParser());
+ super.testQueryAsync(b, true);
}
@Test
public void testAsyncGet() throws Exception {
- super.testQueryAsync(false);
+ HttpSolrClientBuilderBase<?, ?> b =
+ builder(
+ getBaseUrl() + DEBUG_SERVLET_PATH,
+ DEFAULT_CONNECTION_TIMEOUT,
+ DEFAULT_CONNECTION_TIMEOUT)
+ .withResponseParser(new XMLResponseParser());
+ super.testQueryAsync(b, false);
}
@Test
public void testDeprecatedAsyncPost() throws Exception {
super.testUpdateAsync(true);
+
+ HttpSolrClientBuilderBase<?, ?> b =
+ builder(
+ getBaseUrl() + DEBUG_SERVLET_PATH,
+ DEFAULT_CONNECTION_TIMEOUT,
+ DEFAULT_CONNECTION_TIMEOUT)
+ .withResponseParser(new XMLResponseParser());
+ super.testQueryAsync(b, true);
}
@Test
@@ -293,6 +314,21 @@ public class Http2SolrClientTest extends HttpSolrClientTestBase {
super.testAsyncExceptionBase(false);
}
+ @Test
+ public void testAsyncQueryWithSharedClient() throws Exception {
+ DebugServlet.clear();
+ final var url = getBaseUrl() + DEBUG_SERVLET_PATH;
+ ResponseParser rp = new XMLResponseParser();
+ final var queryParams = new MapSolrParams(Collections.singletonMap("q", "*:*"));
+ final var builder =
+ new Http2SolrClient.Builder(url).withDefaultCollection(DEFAULT_CORE).withResponseParser(rp);
+ try (Http2SolrClient originalClient = builder.build()) {
+ final var derivedBuilder = builder.withHttpClient(originalClient);
+ super.testQueryAsync(derivedBuilder, false);
+ }
+ }
+
+ @Test
public void testFollowRedirect() throws Exception {
final String clientUrl = getBaseUrl() + REDIRECT_SERVLET_PATH;
try (Http2SolrClient client =
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpJdkSolrClientTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpJdkSolrClientTest.java
index 12115983b9a..294b6ae9a48 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpJdkSolrClientTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpJdkSolrClientTest.java
@@ -200,17 +200,37 @@ public class HttpJdkSolrClientTest extends HttpSolrClientTestBase {
@Test
public void testDeprecatedAsyncGet() throws Exception {
- super.testQueryAsync(true);
+ HttpSolrClientBuilderBase<?, ?> b =
+ builder(
+ getBaseUrl() + DEBUG_SERVLET_PATH,
+ DEFAULT_CONNECTION_TIMEOUT,
+ DEFAULT_CONNECTION_TIMEOUT)
+ .withResponseParser(new XMLResponseParser());
+ super.testQueryAsync(b, true);
}
@Test
public void testAsyncGet() throws Exception {
- super.testQueryAsync(false);
+ HttpSolrClientBuilderBase<?, ?> b =
+ builder(
+ getBaseUrl() + DEBUG_SERVLET_PATH,
+ DEFAULT_CONNECTION_TIMEOUT,
+ DEFAULT_CONNECTION_TIMEOUT)
+ .withResponseParser(new XMLResponseParser());
+ super.testQueryAsync(b, false);
}
@Test
public void testDeprecatedAsyncPost() throws Exception {
super.testUpdateAsync(true);
+
+ HttpSolrClientBuilderBase<?, ?> b =
+ builder(
+ getBaseUrl() + DEBUG_SERVLET_PATH,
+ DEFAULT_CONNECTION_TIMEOUT,
+ DEFAULT_CONNECTION_TIMEOUT)
+ .withResponseParser(new XMLResponseParser());
+ super.testQueryAsync(b, true);
}
@Test
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpSolrClientTestBase.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpSolrClientTestBase.java
index b545a83adf0..d74177a9e2a 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpSolrClientTestBase.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpSolrClientTestBase.java
@@ -608,13 +608,10 @@ public abstract class HttpSolrClientTestBase extends SolrJettyTestBase {
}
}
- protected void testQueryAsync(boolean useDeprecatedApi) throws Exception {
- ResponseParser rp = new XMLResponseParser();
+ protected void testQueryAsync(HttpSolrClientBuilderBase<?, ?> builder, boolean useDeprecatedApi)
+ throws Exception {
DebugServlet.clear();
DebugServlet.addResponseHeader("Content-Type", "application/xml; charset=UTF-8");
- String url = getBaseUrl() + DEBUG_SERVLET_PATH;
- HttpSolrClientBuilderBase<?, ?> b =
- builder(url, DEFAULT_CONNECTION_TIMEOUT, DEFAULT_CONNECTION_TIMEOUT).withResponseParser(rp);
int limit = 10;
CountDownLatch latch = new CountDownLatch(limit); // Deprecated API use
@@ -623,7 +620,7 @@ public abstract class HttpSolrClientTestBase extends SolrJettyTestBase {
List<CompletableFuture<NamedList<Object>>> futures = new ArrayList<>();
- try (HttpSolrClientBase client = b.build()) {
+ try (HttpSolrClientBase client = builder.build()) {
for (int i = 0; i < limit; i++) {
DebugServlet.responseBodyByQueryFragment.put(
("id=KEY-" + i),