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