You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ab...@apache.org on 2018/02/20 19:15:38 UTC

lucene-solr:master: SOLR-11407: Make sure that the .system collection is not affected by cluster changes. Wait specifically for listeners to run.

Repository: lucene-solr
Updated Branches:
  refs/heads/master ca22f1766 -> 26e7af101


SOLR-11407: Make sure that the .system collection is not affected by cluster changes.
Wait specifically for listeners to run.


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/26e7af10
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/26e7af10
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/26e7af10

Branch: refs/heads/master
Commit: 26e7af10158071a3b6abdc29a75435144958006f
Parents: ca22f17
Author: Andrzej Bialecki <ab...@apache.org>
Authored: Tue Feb 20 20:13:20 2018 +0100
Committer: Andrzej Bialecki <ab...@apache.org>
Committed: Tue Feb 20 20:15:32 2018 +0100

----------------------------------------------------------------------
 .../admin/AutoscalingHistoryHandlerTest.java    | 138 ++++++++++++++++---
 1 file changed, 117 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/26e7af10/solr/core/src/test/org/apache/solr/handler/admin/AutoscalingHistoryHandlerTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/AutoscalingHistoryHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/AutoscalingHistoryHandlerTest.java
index 1122952..5e44ee0 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/AutoscalingHistoryHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/AutoscalingHistoryHandlerTest.java
@@ -18,10 +18,13 @@ package org.apache.solr.handler.admin;
 
 import java.lang.invoke.MethodHandles;
 import java.util.Collection;
+import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 import org.apache.solr.client.solrj.SolrRequest;
+import org.apache.solr.client.solrj.cloud.autoscaling.TriggerEventProcessorStage;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
@@ -31,6 +34,7 @@ import org.apache.solr.cloud.autoscaling.ActionContext;
 import org.apache.solr.cloud.autoscaling.SystemLogListener;
 import org.apache.solr.cloud.autoscaling.TriggerActionBase;
 import org.apache.solr.cloud.autoscaling.TriggerEvent;
+import org.apache.solr.cloud.autoscaling.TriggerListenerBase;
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrDocumentList;
 import org.apache.solr.common.cloud.ClusterState;
@@ -50,30 +54,53 @@ import org.slf4j.LoggerFactory;
 
 import static org.apache.solr.cloud.autoscaling.AutoScalingHandlerTest.createAutoScalingRequest;
 
-@LogLevel("org.apache.solr.cloud.autoscaling=DEBUG;org.apache.solr.cloud.Overseer=DEBUG;org.apache.solr.cloud.overseer=DEBUG;org.apache.solr.client.solrj.cloud.autoscaling.PolicyHelper=DEBUG")
+@LogLevel("org.apache.solr.cloud.autoscaling=DEBUG;org.apache.solr.cloud.Overseer=DEBUG;org.apache.solr.cloud.overseer=DEBUG;org.apache.solr.client.solrj.cloud.autoscaling=DEBUG")
 public class AutoscalingHistoryHandlerTest extends SolrCloudTestCase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private static CountDownLatch actionFiredLatch;
+  private static CountDownLatch listenerFiredLatch;
   private static CloudSolrClient solrClient;
   private static String PREFIX = AutoscalingHistoryHandlerTest.class.getSimpleName();
+  private static String COLL_NAME = PREFIX + "_collection";
+  private static String systemCollNode;
 
   private static CountDownLatch getActionFiredLatch() {
     return actionFiredLatch;
   }
 
+  private static CountDownLatch getListenerFiredLatch() {
+    return listenerFiredLatch;
+  }
+
   @BeforeClass
   public static void setupCluster() throws Exception {
-    configureCluster(3)
+    configureCluster(4)
         .addConfig("conf", configset("cloud-minimal"))
         .configure();
     solrClient = cluster.getSolrClient();
-    CollectionAdminRequest.createCollection(PREFIX + "_collection", null, 1, 3)
+    // create the system collection and test collection on different nodes, to avoid
+    // any interference from .system replicas being moved around.
+    systemCollNode = cluster.getJettySolrRunner(0).getNodeName();
+    CollectionAdminRequest.createCollection(CollectionAdminParams.SYSTEM_COLL, null, 1, 1)
+        .setCreateNodeSet(systemCollNode)
         .process(solrClient);
-    CollectionAdminRequest.createCollection(CollectionAdminParams.SYSTEM_COLL, null, 1, 3)
+    Set<String> otherNodes = cluster.getJettySolrRunners().stream().map(JettySolrRunner::getNodeName)
+        .collect(Collectors.toSet());
+    otherNodes.remove(systemCollNode);
+    CollectionAdminRequest.createCollection(COLL_NAME, null, 1, 3)
+        .setCreateNodeSet(String.join(",", otherNodes))
         .process(solrClient);
   }
 
+  public static class TesterListener extends TriggerListenerBase {
+
+    @Override
+    public void onEvent(TriggerEvent event, TriggerEventProcessorStage stage, String actionName, ActionContext context, Throwable error, String message) throws Exception {
+      getListenerFiredLatch().countDown();
+    }
+  }
+
   public static class TesterAction extends TriggerActionBase {
 
     @Override
@@ -85,6 +112,7 @@ public class AutoscalingHistoryHandlerTest extends SolrCloudTestCase {
   @Before
   public void setupTest() throws Exception {
     actionFiredLatch = new CountDownLatch(1);
+    listenerFiredLatch = new CountDownLatch(1);
 
     // first trigger
     String setTriggerCommand = "{" +
@@ -155,6 +183,19 @@ public class AutoscalingHistoryHandlerTest extends SolrCloudTestCase {
     setListenerCommand = "{" +
         "'set-listener' : " +
         "{" +
+        "'name' : 'node_added1'," +
+        "'trigger' : '" + PREFIX + "_node_added_trigger'," +
+        "'afterAction' : ['test']," +
+        "'class' : '" + TesterListener.class.getName() + "'" +
+        "}" +
+        "}";
+    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setListenerCommand);
+    response = solrClient.request(req);
+    assertEquals(response.get("result").toString(), "success");
+
+    setListenerCommand = "{" +
+        "'set-listener' : " +
+        "{" +
         "'name' : 'node_lost'," +
         "'trigger' : '" + PREFIX + "_node_lost_trigger'," +
         "'stage' : ['STARTED','ABORTED','SUCCEEDED', 'FAILED']," +
@@ -166,19 +207,32 @@ public class AutoscalingHistoryHandlerTest extends SolrCloudTestCase {
     req = createAutoScalingRequest(SolrRequest.METHOD.POST, setListenerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
+    setListenerCommand = "{" +
+        "'set-listener' : " +
+        "{" +
+        "'name' : 'node_lost1'," +
+        "'trigger' : '" + PREFIX + "_node_lost_trigger'," +
+        "'afterAction' : ['test']," +
+        "'class' : '" + TesterListener.class.getName() + "'" +
+        "}" +
+        "}";
+    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setListenerCommand);
+    response = solrClient.request(req);
+    assertEquals(response.get("result").toString(), "success");
 
   }
 
-  private void resetLatch() {
+  private void resetLatches() {
     actionFiredLatch = new CountDownLatch(1);
+    listenerFiredLatch = new CountDownLatch(1);
   }
 
   @Test
   public void testHistory() throws Exception {
-    waitForState("Timed out wait for collection be active", PREFIX + "_collection",
+    waitForState("Timed out wait for collection be active", COLL_NAME,
         clusterShape(1, 3));
     waitForState("Timed out wait for collection be active", CollectionAdminParams.SYSTEM_COLL,
-        clusterShape(1, 3));
+        clusterShape(1, 1));
 
     log.info("### Start add node...");
     JettySolrRunner jetty = cluster.startJettySolrRunner();
@@ -186,11 +240,18 @@ public class AutoscalingHistoryHandlerTest extends SolrCloudTestCase {
     log.info("### Added node " + nodeAddedName);
     boolean await = actionFiredLatch.await(60, TimeUnit.SECONDS);
     assertTrue("action did not execute", await);
+
+    await = listenerFiredLatch.await(60, TimeUnit.SECONDS);
+    assertTrue("listener did not execute", await);
+
+    waitForRecovery(COLL_NAME);
+
     // commit on the history collection
-    Thread.sleep(2000);
+    Thread.sleep(5000);
     log.info("### Commit .system");
     solrClient.commit(CollectionAdminParams.SYSTEM_COLL);
-    Thread.sleep(2000);
+    Thread.sleep(5000);
+
     // verify that new docs exist
     ModifiableSolrParams query = params(CommonParams.Q, "type:" + SystemLogListener.DOC_TYPE,
       CommonParams.FQ, "event.source_s:" + PREFIX + "_node_added_trigger");
@@ -239,29 +300,56 @@ public class AutoscalingHistoryHandlerTest extends SolrCloudTestCase {
     assertEquals("AFTER_ACTION", docs.get(1).getFieldValue("stage_s"));
 
     query = params(CommonParams.QT, CommonParams.AUTOSCALING_HISTORY_PATH,
-        AutoscalingHistoryHandler.COLLECTION_PARAM, CollectionAdminParams.SYSTEM_COLL);
-    docs = solrClient.query(query).getResults();
+        AutoscalingHistoryHandler.COLLECTION_PARAM, COLL_NAME);
+    rsp = solrClient.query(query);
+    docs = rsp.getResults();
+    if (docs.size() != 5) {
+      log.info("Cluster state: " + solrClient.getZkStateReader().getClusterState());
+      query = params(CommonParams.QT, CommonParams.AUTOSCALING_HISTORY_PATH);
+      log.info("Wrong response: ", rsp);
+      log.info("Full response: " + solrClient.query(query));
+    }
     assertEquals(5, docs.size());
     assertEquals("AFTER_ACTION", docs.get(0).getFieldValue("stage_s"));
     assertEquals("compute_plan", docs.get(0).getFieldValue("action_s"));
 
-    // reset latch
-    resetLatch();
+    // reset latches
+    resetLatches();
 
-    // kill a node
-    String node0Name = cluster.getJettySolrRunner(0).getNodeName();
-    log.info("### Stopping node " + node0Name);
-    cluster.stopJettySolrRunner(0);
-    log.info("### Stopped node " + node0Name);
+    // kill a node where a replica exists
+    ClusterState state = cluster.getSolrClient().getZkStateReader().getClusterState();
+    DocCollection coll = state.getCollection(COLL_NAME);
+    String nodeToKill = null;
+    for (Replica r : coll.getReplicas()) {
+      if (r.isActive(state.getLiveNodes())) {
+        nodeToKill = r.getNodeName();
+        break;
+      }
+    }
+    assertNotNull("no suitable node found", nodeToKill);
+    log.info("### Stopping node " + nodeToKill);
+    for (int i = 0; i < cluster.getJettySolrRunners().size(); i++) {
+      if (cluster.getJettySolrRunner(i).getNodeName().equals(nodeToKill)) {
+        cluster.stopJettySolrRunner(i);
+        break;
+      }
+    }
+    log.info("### Stopped node " + nodeToKill);
     await = actionFiredLatch.await(60, TimeUnit.SECONDS);
     assertTrue("action did not execute", await);
 
+    await = listenerFiredLatch.await(60, TimeUnit.SECONDS);
+    assertTrue("listener did not execute", await);
+
     // wait for recovery
-    waitForRecovery(PREFIX + "_collection");
+    waitForRecovery(COLL_NAME);
+
     Thread.sleep(5000);
     // commit on the history collection
     log.info("### Commit .system");
     solrClient.commit(CollectionAdminParams.SYSTEM_COLL);
+    Thread.sleep(5000);
+
     query = params(CommonParams.QT, CommonParams.AUTOSCALING_HISTORY_PATH,
         AutoscalingHistoryHandler.TRIGGER_PARAM, PREFIX + "_node_lost_trigger");
     docs = solrClient.query(query).getResults();
@@ -269,8 +357,16 @@ public class AutoscalingHistoryHandlerTest extends SolrCloudTestCase {
 
     query = params(CommonParams.QT, CommonParams.AUTOSCALING_HISTORY_PATH,
         AutoscalingHistoryHandler.TRIGGER_PARAM, PREFIX + "_node_lost_trigger",
-        AutoscalingHistoryHandler.COLLECTION_PARAM, PREFIX + "_collection");
-    docs = solrClient.query(query).getResults();
+        AutoscalingHistoryHandler.COLLECTION_PARAM, COLL_NAME);
+    rsp = solrClient.query(query);
+    docs = rsp.getResults();
+    if (docs.size() != 5) {
+      log.info("Cluster state: " + solrClient.getZkStateReader().getClusterState());
+      query = params(CommonParams.QT, CommonParams.AUTOSCALING_HISTORY_PATH);
+      log.info("Wrong response: ", rsp);
+      log.info("Full response: " + solrClient.query(query));
+    }
+
     assertEquals(5, docs.size());
   }