You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2020/10/29 14:26:52 UTC

[lucene-solr] branch reference_impl_dev updated: @1068 Harden.

This is an automated email from the ASF dual-hosted git repository.

markrmiller 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 835c060  @1068 Harden.
835c060 is described below

commit 835c0607a7f5b71ca07bd3cb6caa2487897a7123
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Thu Oct 29 09:25:23 2020 -0500

    @1068 Harden.
---
 .../org/apache/solr/cloud/RecoveryStrategy.java    |  2 +-
 .../OverseerCollectionMessageHandler.java          | 83 +++++++++++++---------
 .../solr/backcompat/TestLuceneIndexBackCompat.java |  2 +
 .../solr/cloud/TestQueryingOnDownCollection.java   | 14 ++++
 .../apache/solr/client/solrj/StartSolrJetty.java   |  2 +-
 5 files changed, 67 insertions(+), 36 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java b/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java
index 47ae202..25dea01 100644
--- a/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java
+++ b/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java
@@ -196,7 +196,7 @@ public class RecoveryStrategy implements Runnable, Closeable {
     }
 
     try {
-      try (ParWork closer = new ParWork(this, true)) {
+      try (ParWork closer = new ParWork(this, true, true)) {
         closer.collect("prevSendPreRecoveryHttpUriRequestAbort", () -> {
           try {
             prevSendPreRecoveryHttpUriRequest.cancel();
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/OverseerCollectionMessageHandler.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/OverseerCollectionMessageHandler.java
index 46b7fd8..8f8de2c 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/OverseerCollectionMessageHandler.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/OverseerCollectionMessageHandler.java
@@ -28,6 +28,7 @@ import java.util.Map;
 import java.util.Random;
 import java.util.Set;
 import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.TimeUnit;
@@ -57,6 +58,7 @@ import org.apache.solr.cloud.OverseerTaskProcessor;
 import org.apache.solr.cloud.Stats;
 import org.apache.solr.cloud.ZkController;
 import org.apache.solr.cloud.overseer.OverseerAction;
+import org.apache.solr.common.AlreadyClosedException;
 import org.apache.solr.common.ParWork;
 import org.apache.solr.common.PerThreadExecService;
 import org.apache.solr.common.SolrCloseable;
@@ -779,6 +781,8 @@ public class OverseerCollectionMessageHandler implements OverseerMessageHandler,
     success.add(key, value);
   }
 
+  private static Set<CountDownLatch> latches = ConcurrentHashMap.newKeySet();
+
   private static NamedList<Object> waitForCoreAdminAsyncCallToComplete(String nodeName, String requestId, String adminPath, ZkStateReader zkStateReader, HttpShardHandlerFactory shardHandlerFactory,
                                                                        Overseer overseer) throws KeeperException, InterruptedException {
     ShardHandler shardHandler = shardHandlerFactory.getShardHandler(overseer.overseerLbClient);
@@ -796,49 +800,58 @@ public class OverseerCollectionMessageHandler implements OverseerMessageHandler,
     sreq.actualShards = sreq.shards;
     sreq.params = params;
     CountDownLatch latch = new CountDownLatch(1);
+    latches.add(latch);
+    try {
+      // mn- from DistributedMap
+      final String asyncPathToWaitOn = Overseer.OVERSEER_ASYNC_IDS + "/mn-" + requestId;
+
+      Watcher waitForAsyncId = new Watcher() {
+        @Override
+        public void process(WatchedEvent event) {
+          if (Watcher.Event.EventType.None.equals(event.getType())) {
+            return;
+          }
+          if (event.getType().equals(Watcher.Event.EventType.NodeCreated)) {
+            latch.countDown();
+          } else if (event.getType().equals(Event.EventType.NodeDeleted)) {
+            latch.countDown();
+            return;
+          }
 
-    // mn- from DistributedMap
-    final String asyncPathToWaitOn = Overseer.OVERSEER_ASYNC_IDS + "/mn-" + requestId;
+          Stat rstats2 = null;
+          try {
+            rstats2 = zkStateReader.getZkClient().exists(asyncPathToWaitOn, this);
+          } catch (KeeperException e) {
+            log.error("ZooKeeper exception", e);
+            return;
+          } catch (InterruptedException e) {
+            log.info("interrupted");
+            return;
+          }
+          if (rstats2 != null) {
+            latch.countDown();
+          }
 
-    Watcher waitForAsyncId = new Watcher() {
-      @Override
-      public void process(WatchedEvent event) {
-        if (Watcher.Event.EventType.None.equals(event.getType())) {
-          return;
-        }
-        if (event.getType().equals(Watcher.Event.EventType.NodeCreated)) {
-          latch.countDown();
-        } else if (event.getType().equals(Event.EventType.NodeDeleted)) {
-          latch.countDown();
-          return;
         }
+      };
 
-        Stat rstats2 = null;
-        try {
-          rstats2 = zkStateReader.getZkClient().exists(asyncPathToWaitOn, this);
-        } catch (KeeperException e) {
-          log.error("ZooKeeper exception", e);
-          return;
-        } catch (InterruptedException e) {
-          log.info("interrupted");
-          return;
-        }
-        if (rstats2 != null) {
-          latch.countDown();
-        }
+      Stat rstats = zkStateReader.getZkClient().exists(asyncPathToWaitOn, waitForAsyncId);
 
+      if (rstats != null) {
+        latch.countDown();
       }
-    };
 
-    Stat rstats = zkStateReader.getZkClient().exists(asyncPathToWaitOn, waitForAsyncId);
+      if (overseer.isClosed()) {
+        throw new AlreadyClosedException();
+      }
 
-    if (rstats != null) {
-      latch.countDown();
-    }
+      boolean success = latch.await(15, TimeUnit.SECONDS); // nocommit - still need a central timeout strat
+      if (!success) {
+        throw new SolrException(ErrorCode.SERVER_ERROR, "Timeout waiting to see async zk node " + asyncPathToWaitOn);
+      }
 
-    boolean success = latch.await(15, TimeUnit.SECONDS); // nocommit - still need a central timeout strat
-    if (!success) {
-      throw new SolrException(ErrorCode.SERVER_ERROR, "Timeout waiting to see async zk node " + asyncPathToWaitOn);
+    } finally {
+      latches.remove(latch);
     }
 
     shardHandler.submit(sreq, replica, sreq.params);
@@ -929,6 +942,8 @@ public class OverseerCollectionMessageHandler implements OverseerMessageHandler,
     } catch (NullPointerException e) {
       // okay
     } finally {
+      latches.forEach(countDownLatch -> countDownLatch.countDown());
+
       if (tpe != null) {
         if (!tpe.isShutdown()) {
           tpe.shutdownNow();
diff --git a/solr/core/src/test/org/apache/solr/backcompat/TestLuceneIndexBackCompat.java b/solr/core/src/test/org/apache/solr/backcompat/TestLuceneIndexBackCompat.java
index 9e69c25..7d390f1 100644
--- a/solr/core/src/test/org/apache/solr/backcompat/TestLuceneIndexBackCompat.java
+++ b/solr/core/src/test/org/apache/solr/backcompat/TestLuceneIndexBackCompat.java
@@ -31,6 +31,7 @@ import java.util.Properties;
 import org.apache.commons.io.FileUtils;
 import org.apache.lucene.index.TestBackwardsCompatibility;
 import org.apache.lucene.search.TimeLimitingCollector;
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.TestUtil;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.params.CommonParams;
@@ -41,6 +42,7 @@ import org.junit.Ignore;
 import org.junit.Test;
 
 /** Verify we can read/write previous versions' Lucene indexes. */
+@LuceneTestCase.Nightly
 public class TestLuceneIndexBackCompat extends SolrTestCaseJ4 {
   private static final String[] oldNames = TestBackwardsCompatibility.getOldNames();
   private static final String[] oldSingleSegmentNames = TestBackwardsCompatibility.getOldSingleSegmentNames();
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestQueryingOnDownCollection.java b/solr/core/src/test/org/apache/solr/cloud/TestQueryingOnDownCollection.java
index a82ba6b..cdfc073 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestQueryingOnDownCollection.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestQueryingOnDownCollection.java
@@ -19,6 +19,7 @@ package org.apache.solr.cloud;
 import java.lang.invoke.MethodHandles;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
@@ -29,6 +30,7 @@ import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.cloud.Replica;
+import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.util.Utils;
 import org.junit.BeforeClass;
 import org.junit.Ignore;
@@ -121,6 +123,18 @@ public class TestQueryingOnDownCollection extends SolrCloudTestCase {
 
     cluster.getZkClient().setData("/collections/" + COLLECTION_NAME + "/state.json", Utils.toJSON(infectedState)
         , true);
+
+    cluster.getSolrClient().getZkStateReader().waitForState(COLLECTION_NAME, 10, TimeUnit.SECONDS, (l, c) -> {
+      if (c == null) return false;
+      for (Slice slice : c.getSlices()) {
+        for (Replica replica : slice.getReplicas()) {
+          if (replica.getState() != Replica.State.DOWN) {
+            return false;
+          }
+        }
+      }
+      return true;
+    });
   }
 
   protected static final String STD_CONF = "{\n" +
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/StartSolrJetty.java b/solr/solrj/src/test/org/apache/solr/client/solrj/StartSolrJetty.java
index feabba3..cff42cb 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/StartSolrJetty.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/StartSolrJetty.java
@@ -32,7 +32,7 @@ import java.lang.invoke.MethodHandles;
 public class StartSolrJetty
 {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-  
+
   public static void main( String[] args )
   {
     //System.setProperty("solr.solr.home", "../../../example/solr");