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"})