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/30 06:09:01 UTC

[lucene-solr] branch reference_impl_dev updated (cf647ee -> 5729f9c)

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

markrmiller pushed a change to branch reference_impl_dev
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git.


    from cf647ee  @1080 Harden.
     new 503d050  @1081 Harden.
     new 5729f9c  @1081 Harden.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/solr/cloud/overseer/SliceMutator.java |  8 ++++----
 .../src/java/org/apache/solr/core/CoreContainer.java | 20 +++++++++++++++++++-
 .../solr/handler/admin/DaemonStreamApiTest.java      |  1 -
 .../solr/client/solrj/io/stream/DaemonStream.java    | 20 +++++++++++++-------
 4 files changed, 36 insertions(+), 13 deletions(-)


[lucene-solr] 01/02: @1081 Harden.

Posted by ma...@apache.org.
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

commit 503d050d54247d183f8f012af8c5e3d9735037b6
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Fri Oct 30 00:49:06 2020 -0500

    @1081 Harden.
---
 .../src/java/org/apache/solr/core/CoreContainer.java | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/solr/core/src/java/org/apache/solr/core/CoreContainer.java b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
index 883569d..b77b20c 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@@ -42,6 +42,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
 import com.google.common.collect.ImmutableMap;
@@ -78,6 +79,7 @@ import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Replica.State;
+import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
@@ -1752,7 +1754,6 @@ public class CoreContainer implements Closeable {
     if (name != null) {
       if (isZooKeeperAware() && cd != null && cd.getCloudDescriptor() != null) {
         CloudDescriptor cloudDesc = cd.getCloudDescriptor();
-        cloudDesc.getCoreNodeName();
         try {
           deleteCoreNode(cloudDesc.getCollectionName(), cloudDesc.getCoreNodeName(), getZkController().getNodeName(), getZkController().getBaseUrl(), name);
         } catch (Exception e) {
@@ -1851,6 +1852,23 @@ public class CoreContainer implements Closeable {
           SolrException.log(log, "Failed to delete instance dir for core:" + cd.getName() + " dir:" + cd.getInstanceDir());
         }
       }
+      if (isZooKeeperAware() && cd != null && cd.getCloudDescriptor() != null) {
+        CloudDescriptor cloudDesc = cd.getCloudDescriptor();
+        cloudDesc.getCoreNodeName();
+        try {
+          getZkController().getZkStateReader().waitForState(cloudDesc.getCollectionName(), 5000, TimeUnit.MILLISECONDS, (c) -> {
+            if (c == null)
+              return true;
+            Slice slice = c.getSlice(cloudDesc.getShardId());
+            if(slice == null || slice.getReplica(cloudDesc.getCoreNodeName()) == null) {
+              return true;
+            }
+            return false;
+          });
+        } catch (TimeoutException | InterruptedException e) {
+          ParWork.propagateInterrupt(e);
+        }
+      }
     }
   }
 


[lucene-solr] 02/02: @1081 Harden.

Posted by ma...@apache.org.
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

commit 5729f9c0ed0d931129c2336df8b00aed9579c050
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Fri Oct 30 01:08:43 2020 -0500

    @1081 Harden.
---
 .../org/apache/solr/cloud/overseer/SliceMutator.java |  8 ++++----
 .../solr/handler/admin/DaemonStreamApiTest.java      |  1 -
 .../solr/client/solrj/io/stream/DaemonStream.java    | 20 +++++++++++++-------
 3 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java b/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java
index 47c32ca..61cb5d0 100644
--- a/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java
+++ b/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java
@@ -164,12 +164,12 @@ public class SliceMutator {
       // TODO: this should only be calculated once and cached somewhere?
       if (log.isDebugEnabled()) log.debug("examine for setting or unsetting as leader replica={}", replica);
 
-      if (replica == oldLeader && !coreNodeName.equals(replica.getName())) {
-        if (log.isDebugEnabled()) log.debug("Unset leader");
-        replica = new ReplicaMutator(cloudManager).unsetLeader(replica);
-      } else if (coreNodeName.equals(replica.getName())) {
+      if (coreNodeName.equals(replica.getName())) {
         if (log.isDebugEnabled()) log.debug("Set leader");
         replica = new ReplicaMutator(cloudManager).setLeader(replica);
+      } else if (replica.getBool("leader", false)) {
+        if (log.isDebugEnabled()) log.debug("Unset leader");
+        replica = new ReplicaMutator(cloudManager).unsetLeader(replica);
       }
 
       newReplicas.put(replica.getName(), replica);
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/DaemonStreamApiTest.java b/solr/core/src/test/org/apache/solr/handler/admin/DaemonStreamApiTest.java
index 74f7be3..77c0d43 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/DaemonStreamApiTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/DaemonStreamApiTest.java
@@ -42,7 +42,6 @@ import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
 
-@ThreadLeakLingering(linger = 2000) // allow a small linger for daemon streams to stop
 //@Ignore // nocommit - need to fix the driver and this test again
 public class DaemonStreamApiTest extends SolrTestCaseJ4 {
 
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/DaemonStream.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/DaemonStream.java
index 0692bc2..c5d7a2a 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/DaemonStream.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/DaemonStream.java
@@ -26,6 +26,7 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.ExecutorService;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.solr.client.solrj.io.Tuple;
@@ -41,6 +42,8 @@ import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
 import org.apache.solr.common.ParWork;
 import org.apache.solr.common.util.ExecutorUtil;
 import org.apache.solr.common.util.SolrNamedThreadFactory;
+import org.apache.solr.common.util.TimeOut;
+import org.apache.solr.common.util.TimeSource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -288,7 +291,7 @@ public class DaemonStream extends TupleStream implements Expressible {
 
     // a reference to the Thread that is executing the stream to track its state
     private volatile Thread executingThread;
-    private boolean shutdown;
+    private volatile boolean shutdown;
 
     public StreamRunner(long runInterval, String id) {
       this.runInterval = runInterval;
@@ -391,12 +394,15 @@ public class DaemonStream extends TupleStream implements Expressible {
         }
         iterations.incrementAndGet();
 
-        if (sleepMillis > 0) {
-          try {
-            Thread.sleep(sleepMillis);
-          } catch (InterruptedException e) {
-            log.error("Error in DaemonStream:{}", id, e);
-            break OUTER;
+        if (sleepMillis > 0 && !getShutdown()) {
+          TimeOut timeout = new TimeOut(sleepMillis, TimeUnit.MILLISECONDS, TimeSource.NANO_TIME);
+          while (!timeout.hasTimedOut() && !getShutdown()) {
+            try {
+              Thread.sleep(250);
+            } catch (InterruptedException e) {
+              log.error("Error in DaemonStream:{}", id, e);
+              break;
+            }
           }
         }
       }