You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by th...@apache.org on 2020/09/10 20:59:40 UTC
[lucene-solr] branch reference_impl_dev updated: Switch to using
ZkClusterStateProvider with MockZkStateReader
This is an automated email from the ASF dual-hosted git repository.
thelabdude pushed a commit to branch reference_impl_dev
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git
The following commit(s) were added to refs/heads/reference_impl_dev by this push:
new 54455ac Switch to using ZkClusterStateProvider with MockZkStateReader
54455ac is described below
commit 54455aca46dcb21139e5f734e05e18f686f4f9f7
Author: Timothy Potter <th...@gmail.com>
AuthorDate: Thu Sep 10 14:59:21 2020 -0600
Switch to using ZkClusterStateProvider with MockZkStateReader
---
.../solrj/impl/BaseSolrClientWireMockTest.java | 34 +++++++--
.../impl/CloudHttp2SolrClientWireMockTest.java | 84 +++++++++++++++++++++-
2 files changed, 113 insertions(+), 5 deletions(-)
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/BaseSolrClientWireMockTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/BaseSolrClientWireMockTest.java
index 50b3423..0874927 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/BaseSolrClientWireMockTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/BaseSolrClientWireMockTest.java
@@ -42,10 +42,12 @@ import com.github.tomakehurst.wiremock.http.HttpServerFactory;
import com.github.tomakehurst.wiremock.http.StubRequestHandler;
import com.github.tomakehurst.wiremock.jetty94.Jetty94HttpServer;
import org.apache.lucene.util.QuickPatchThreadsFilter;
-import org.apache.lucene.util.TestUtil;
import org.apache.solr.SolrIgnoredThreadsFilter;
import org.apache.solr.SolrTestCase;
import org.apache.solr.client.solrj.request.UpdateRequest;
+import org.apache.solr.cloud.MockZkStateReader;
+import org.apache.solr.common.SolrDocument;
+import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.cloud.ClusterState;
import org.apache.solr.common.cloud.DocCollection;
@@ -68,9 +70,6 @@ import org.slf4j.LoggerFactory;
import static com.github.tomakehurst.wiremock.client.WireMock.configureFor;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
@ThreadLeakFilters(filters = {
SolrIgnoredThreadsFilter.class,
@@ -190,6 +189,7 @@ public abstract class BaseSolrClientWireMockTest extends SolrTestCase {
protected static void updateReplicaBaseUrl(JsonNode json, String shard, String replica, String baseUrl) {
ObjectNode replicaNode = (ObjectNode) json.get(shard).get("replicas").get(replica);
replicaNode.put("base_url", baseUrl + "/solr");
+ replicaNode.put("node_name", baseUrl);
}
protected CloudHttp2SolrClient testClient = null;
@@ -198,12 +198,21 @@ public abstract class BaseSolrClientWireMockTest extends SolrTestCase {
@Before
public void createTestClient() throws TimeoutException, InterruptedException, IOException {
final String baseUrl = mockSolr.baseUrl();
+
+ Map<String, ClusterState.CollectionRef> collectionStates =
+ Collections.singletonMap(BUILT_IN_MOCK_COLLECTION, new ClusterState.CollectionRef(mockDocCollection));
+ ClusterState clusterState = new ClusterState(Collections.singleton(baseUrl), collectionStates, 1);
+ MockZkStateReader zkStateReader = new MockZkStateReader(clusterState, Collections.singleton(BUILT_IN_MOCK_COLLECTION));
+ stateProvider = new ZkClientClusterStateProvider(zkStateReader, true);
+
+ /*
stateProvider = mock(ClusterStateProvider.class);
when(stateProvider.getLiveNodes()).thenReturn(Collections.singleton(baseUrl));
when(stateProvider.resolveAlias(anyString())).thenReturn(Collections.singletonList(BUILT_IN_MOCK_COLLECTION));
when(stateProvider.getCollection(BUILT_IN_MOCK_COLLECTION)).thenReturn(mockDocCollection);
when(stateProvider.getState(BUILT_IN_MOCK_COLLECTION)).thenReturn(new ClusterState.CollectionRef(mockDocCollection));
+ */
List<String> solrUrls = Collections.singletonList(baseUrl);
testClient = new CloudHttp2SolrClient.Builder(solrUrls).sendDirectUpdatesToShardLeadersOnly().withClusterStateProvider(stateProvider).build();
@@ -221,6 +230,23 @@ public abstract class BaseSolrClientWireMockTest extends SolrTestCase {
mockSolr.resetAll();
}
+ protected byte[] queryResponseOk() throws IOException {
+ NamedList<Object> rh = new NamedList<>();
+ rh.add("status", 0);
+ rh.add("QTime", 10);
+
+ SolrDocumentList rs = new SolrDocumentList();
+ rs.setNumFound(1);
+ rs.setMaxScore(1f);
+ rs.setNumFoundExact(true);
+ rs.add(new SolrDocument(Collections.singletonMap("id", "test")));
+
+ NamedList<Object> nl = new NamedList<>();
+ nl.add("responseHeader", rh);
+ nl.add("response", rs);
+ return toJavabin(nl);
+ }
+
protected byte[] updateRequestOk() throws IOException {
NamedList<Object> rh = new NamedList<>();
rh.add("rf", 1);
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientWireMockTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientWireMockTest.java
index 145d9e7..7bad820 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientWireMockTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientWireMockTest.java
@@ -19,18 +19,24 @@ package org.apache.solr.client.solrj.impl;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import com.github.tomakehurst.wiremock.stubbing.ServeEvent;
+import org.apache.solr.client.solrj.SolrQuery;
+import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.request.UpdateRequest;
+import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
+import org.apache.solr.client.solrj.routing.ShufflingReplicaListTransformer;
import org.apache.solr.common.util.NamedList;
import org.junit.Test;
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+import static com.github.tomakehurst.wiremock.client.WireMock.get;
import static com.github.tomakehurst.wiremock.client.WireMock.ok;
import static com.github.tomakehurst.wiremock.client.WireMock.post;
import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
@@ -38,6 +44,82 @@ import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
public class CloudHttp2SolrClientWireMockTest extends BaseSolrClientWireMockTest {
+ @Test
+ public void testQueryRequest() throws Exception {
+ stubFor(get(urlPathEqualTo("/solr/wireMock/select"))
+ .willReturn(ok()
+ .withLogNormalRandomDelay(10, 0.1)
+ .withHeader("Content-Type", RESPONSE_CONTENT_TYPE)
+ .withBody(queryResponseOk())));
+
+ QueryResponse response = testClient.query(BUILT_IN_MOCK_COLLECTION, new SolrQuery("*:*"));
+ assertEquals(1L, response.getResults().getNumFound());
+ }
+
+ @Test(expected = SolrServerException.class)
+ public void testQueryRequestErrorHandling() throws Exception {
+ stubFor(get(urlPathEqualTo("/solr/wireMock/select"))
+ .willReturn(aResponse().withStatus(500)));
+
+ testClient.query(BUILT_IN_MOCK_COLLECTION, new SolrQuery("*:*"));
+ }
+
+ @Test
+ public void testUpdateRequestErrorHandling() throws Exception {
+ stubFor(post(urlPathEqualTo(SHARD1_PATH+"/update"))
+ .willReturn(aResponse().withStatus(404)));
+
+ stubFor(post(urlPathEqualTo(SHARD2_PATH+"/update"))
+ .willReturn(ok()
+ .withHeader("Content-Type", RESPONSE_CONTENT_TYPE)
+ .withBody(updateRequestOk())));
+
+ UpdateRequest req = buildUpdateRequest(10);
+ try {
+ req.process(testClient, BUILT_IN_MOCK_COLLECTION);
+ } catch (BaseCloudSolrClient.RouteException re) {
+ assertEquals(404, re.code());
+ }
+ }
+
+ // Basic regression test for route logic, should expand to encompass
+ // ReplicaListTransformer logic and more complex collection layouts
+ @Test
+ public void testUpdateRequestRouteLogic() {
+ final String shard1Route = mockSolr.baseUrl()+SHARD1_PATH+"/";
+ final String shard2Route = mockSolr.baseUrl()+SHARD2_PATH+"/";
+
+ UpdateRequest ur = buildUpdateRequest(10);
+ Map<String,List<String>> urlMap = testClient.buildUrlMap(mockDocCollection, new ShufflingReplicaListTransformer(random()));
+ assertEquals(2, urlMap.size());
+ List<String> shard1 = urlMap.get("shard1");
+ assertEquals(1, shard1.size());
+ assertEquals(shard1Route, shard1.get(0));
+ List<String> shard2 = urlMap.get("shard2");
+ assertEquals(1, shard2.size());
+ assertEquals(shard2Route, shard2.get(0));
+
+ Map<String, LBSolrClient.Req> routes =
+ ur.getRoutesToCollection(mockDocCollection.getRouter(), mockDocCollection, urlMap, ur.getParams(), "id");
+ assertEquals(2, routes.size());
+ assertNotNull(routes.get(shard1Route));
+ assertNotNull(routes.get(shard1Route).getRequest());
+ assertNotNull(routes.get(shard2Route));
+ assertNotNull(routes.get(shard2Route).getRequest());
+
+ final String threadName = Thread.currentThread().getName();
+ ur = new UpdateRequest();
+ for (int i=0; i < 10; i++) {
+ ur.deleteById(threadName+1000+i);
+ }
+ routes = ur.getRoutesToCollection(mockDocCollection.getRouter(), mockDocCollection, urlMap, ur.getParams(), "id");
+ assertEquals(2, routes.size());
+ assertNotNull(routes.get(shard1Route));
+ assertNotNull(routes.get(shard1Route).getRequest());
+ assertNotNull(routes.get(shard2Route));
+ assertNotNull(routes.get(shard2Route).getRequest());
+ }
+
@SuppressWarnings({"rawtypes", "unchecked"})
@Test
public void testParallelUpdates() throws Exception {
@@ -84,7 +166,7 @@ public class CloudHttp2SolrClientWireMockTest extends BaseSolrClientWireMockTest
.withBody(updateRequestOk())));
// should fail with a RouteException
- buildUpdateRequest(40).process(testClient, BUILT_IN_MOCK_COLLECTION);
+ buildUpdateRequest(20).process(testClient, BUILT_IN_MOCK_COLLECTION);
}
@SuppressWarnings({"rawtypes", "unchecked"})