You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ho...@apache.org on 2023/01/07 00:54:19 UTC
[solr] 10/12: Add CloudHttp2SolrClient support and testing, fill in test class jdocs
This is an automated email from the ASF dual-hosted git repository.
hossman pushed a commit to branch jira/SOLR-6312
in repository https://gitbox.apache.org/repos/asf/solr.git
commit a27567f8a92483b2fc20b5a29dbf7fc42d6744d3
Author: Chris Hostetter <ho...@apache.org>
AuthorDate: Fri Jan 6 15:46:45 2023 -0700
Add CloudHttp2SolrClient support and testing, fill in test class jdocs
---
.../client/solrj/impl/CloudHttp2SolrClient.java | 32 ++++++++++++-
.../impl/SendUpdatesToLeadersOverrideTest.java | 53 +++++++++++++++++++---
2 files changed, 78 insertions(+), 7 deletions(-)
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudHttp2SolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudHttp2SolrClient.java
index 391a14b16fd..a41d8cbba64 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudHttp2SolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudHttp2SolrClient.java
@@ -136,7 +136,7 @@ public class CloudHttp2SolrClient extends CloudSolrClient {
protected List<String> solrUrls = new ArrayList<>();
protected String zkChroot;
protected Http2SolrClient httpClient;
- protected boolean shardLeadersOnly = true; // nocommit: use this, add setter
+ protected boolean shardLeadersOnly = true;
protected boolean directUpdatesToLeadersOnly = false;
protected boolean parallelUpdates = true;
protected ClusterStateProvider stateProvider;
@@ -194,12 +194,39 @@ public class CloudHttp2SolrClient extends CloudSolrClient {
if (zkChroot.isPresent()) this.zkChroot = zkChroot.get();
}
+ /**
+ * Tells {@link Builder} that created clients should be configured such that {@link
+ * CloudSolrClient#isUpdatesToLeaders} returns <code>true</code>.
+ *
+ * @see #sendUpdatesToAnyReplica
+ * @see CloudSolrClient#isUpdatesToLeaders
+ */
+ public Builder sendUpdatesOnlyToShardLeaders() {
+ shardLeadersOnly = true;
+ return this;
+ }
+
+ /**
+ * Tells {@link Builder} that created clients should be configured such that {@link
+ * CloudSolrClient#isUpdatesToLeaders} returns <code>false</code>.
+ *
+ * @see #sendUpdatesOnlyToShardLeaders
+ * @see CloudSolrClient#isUpdatesToLeaders
+ */
+ public Builder sendUpdatesToAnyReplica() {
+ shardLeadersOnly = false;
+ return this;
+ }
+
/**
* Tells {@link CloudHttp2SolrClient.Builder} that created clients should send direct updates to
* shard leaders only.
*
* <p>UpdateRequests whose leaders cannot be found will "fail fast" on the client side with a
* {@link SolrException}
+ *
+ * @see #sendDirectUpdatesToAnyShardReplica
+ * @see CloudSolrClient#isDirectUpdatesToLeadersOnly
*/
public Builder sendDirectUpdatesToShardLeadersOnly() {
directUpdatesToLeadersOnly = true;
@@ -212,6 +239,9 @@ public class CloudHttp2SolrClient extends CloudSolrClient {
*
* <p>Shard leaders are still preferred, but the created clients will fallback to using other
* replicas if a leader cannot be found.
+ *
+ * @see #sendDirectUpdatesToShardLeadersOnly
+ * @see CloudSolrClient#isDirectUpdatesToLeadersOnly
*/
public Builder sendDirectUpdatesToAnyShardReplica() {
directUpdatesToLeadersOnly = false;
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/SendUpdatesToLeadersOverrideTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/SendUpdatesToLeadersOverrideTest.java
index c185e1e4d82..9a485a483b3 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/SendUpdatesToLeadersOverrideTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/SendUpdatesToLeadersOverrideTest.java
@@ -34,6 +34,7 @@ import java.util.stream.Collectors;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.request.AbstractUpdateRequest;
import org.apache.solr.client.solrj.request.CollectionAdminRequest;
+import org.apache.solr.client.solrj.request.IsUpdateRequest;
import org.apache.solr.client.solrj.request.UpdateRequest;
import org.apache.solr.cloud.SolrCloudTestCase;
import org.apache.solr.common.cloud.Replica;
@@ -46,9 +47,15 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
- * Test the behavior of {@link CloudSolrClient#isUpdatesToLeaders}
+ * Test the behavior of {@link CloudSolrClient#isUpdatesToLeaders} and {@link
+ * IsUpdateRequest#isSendToLeaders}.
*
- * <p>nocommit: more explanation of how we test this
+ * <p>This class uses {@link TrackingUpdateProcessorFactory} instances (configured both before, and
+ * after the <code>distrib</code> processor) to inspect which replicas recieve various {@link
+ * UpdateRequest}s from variously configured {@link CloudSolrClient}s. In some requests, <code>
+ * shards.preference=replica.type:PULL</code> is specified to confirm that typical routing
+ * prefrences are respected (when the effective value of <code>isSendToLeaders</code> is <code>false
+ * </code>)
*/
public class SendUpdatesToLeadersOverrideTest extends SolrCloudTestCase {
@@ -204,10 +211,22 @@ public class SendUpdatesToLeadersOverrideTest extends SolrCloudTestCase {
return req;
}
- // nocommit: - test CloudHttp2SolrClient as well
+ public void testBuilderImplicitBehavior() throws Exception {
+ try (CloudSolrClient client =
+ new CloudLegacySolrClient.Builder(
+ Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty())
+ .build()) {
+ assertTrue(client.isUpdatesToLeaders());
+ }
+ try (CloudSolrClient client =
+ new CloudHttp2SolrClient.Builder(
+ Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty())
+ .build()) {
+ assertTrue(client.isUpdatesToLeaders());
+ }
+ }
- // basic sanity check of expected default behavior
- public void testClientThatDefaultsToLeaders() throws Exception {
+ public void testLegacyClientThatDefaultsToLeaders() throws Exception {
try (CloudSolrClient client =
new CloudLegacySolrClient.Builder(
Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty())
@@ -218,7 +237,7 @@ public class SendUpdatesToLeadersOverrideTest extends SolrCloudTestCase {
}
}
- public void testClientThatDoesNotDefaultToLeaders() throws Exception {
+ public void testLegacyClientThatDoesNotDefaultToLeaders() throws Exception {
try (CloudSolrClient client =
new CloudLegacySolrClient.Builder(
Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty())
@@ -229,6 +248,28 @@ public class SendUpdatesToLeadersOverrideTest extends SolrCloudTestCase {
}
}
+ public void testHttp2ClientThatDefaultsToLeaders() throws Exception {
+ try (CloudSolrClient client =
+ new CloudHttp2SolrClient.Builder(
+ Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty())
+ .sendUpdatesOnlyToShardLeaders()
+ .build()) {
+ checkUpdatesDefaultToLeaders(client);
+ checkUpdatesWithSendToLeadersFalse(client);
+ }
+ }
+
+ public void testHttp2ClientThatDoesNotDefaultToLeaders() throws Exception {
+ try (CloudSolrClient client =
+ new CloudHttp2SolrClient.Builder(
+ Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty())
+ .sendUpdatesToAnyReplica()
+ .build()) {
+ checkUpdatesWithShardsPrefPull(client);
+ checkUpdatesWithSendToLeadersFalse(client);
+ }
+ }
+
/**
* Given a SolrClient, sends various updates and asserts expecations regarding default behavior:
* that these requests will be initially sent to shard leaders, and "routed" requests will be sent