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 <[email protected]> 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
