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/09/06 02:13:22 UTC

[lucene-solr] 01/03: @752 Try this fix for very rare loss of replica(s) instead.

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 b23c3da9b0f2d7f34a5fd4c10b8a1e0bd30f65ba
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Sat Sep 5 20:43:23 2020 -0500

    @752 Try this fix for very rare loss of replica(s) instead.
---
 .../core/src/java/org/apache/solr/cloud/Overseer.java | 19 ++++++++++++++++++-
 .../org/apache/solr/cloud/overseer/ZkStateWriter.java |  8 --------
 2 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/cloud/Overseer.java b/solr/core/src/java/org/apache/solr/cloud/Overseer.java
index 0de28c8..32d1954 100644
--- a/solr/core/src/java/org/apache/solr/cloud/Overseer.java
+++ b/solr/core/src/java/org/apache/solr/cloud/Overseer.java
@@ -40,6 +40,7 @@ import org.apache.solr.common.SolrException;
 import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.ConnectionManager;
 import org.apache.solr.common.cloud.DocCollection;
+import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkNodeProps;
@@ -66,8 +67,10 @@ import static org.apache.solr.common.params.CommonParams.ID;
 import java.io.Closeable;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
@@ -425,10 +428,24 @@ public class Overseer implements SolrCloseable {
       Map<String,DocCollection> updatesToWrite = zkStateWriter
           .getUpdatesToWrite();
       for (DocCollection docCollection : updatesToWrite.values()) {
-        collStates.put(docCollection.getName(), new ClusterState.CollectionRef(docCollection));
+        Map<String,Slice> slicesMap = docCollection.getSlicesMap();
+        for (Slice slice : slicesMap.values()) {
+          Collection<Replica> existingReplicas = slice.getReplicas();
+          for (Replica ereplica : existingReplicas) {
+            if (!docCollection.getReplicas().contains(ereplica)) {
+              Map<String,Replica> replicas = new HashMap<>(slice.getReplicasMap());
+              replicas.put(ereplica.getName(), ereplica);
+              slicesMap.put(slice.getName(), new Slice(slice.getName(), replicas, slice.getProperties(), docCollection.getName()));
+            }
+          }
+
+          collStates.put(docCollection.getName(), new ClusterState.CollectionRef(new DocCollection(docCollection.getName(), slicesMap, docCollection.getProperties(), docCollection.getRouter())));
+        }
       }
+
       ClusterState prevState = new ClusterState(state.getLiveNodes(),
           collStates, state.getZNodeVersion());
+
         List<ZkWriteCommand> zkWriteOps = processMessage(updatesToWrite.isEmpty() ? state : prevState, message, operation);
 
         cs = zkStateWriter.enqueueUpdate(clusterState, zkWriteOps,
diff --git a/solr/core/src/java/org/apache/solr/cloud/overseer/ZkStateWriter.java b/solr/core/src/java/org/apache/solr/cloud/overseer/ZkStateWriter.java
index 6cfecb5..4e76974 100644
--- a/solr/core/src/java/org/apache/solr/cloud/overseer/ZkStateWriter.java
+++ b/solr/core/src/java/org/apache/solr/cloud/overseer/ZkStateWriter.java
@@ -179,14 +179,6 @@ public class ZkStateWriter {
             c.getSlicesMap().forEach((sliceId, slice) -> {
               if (finalColl.getSlice(sliceId) != null) {
                 Map<String,Replica> newReplicas = new HashMap<>();
-
-                // start with existing state unless it's a replica that has been removed
-                Collection<Replica> nReplicas = finalC.getSlice(sliceId).getReplicas();
-                for (Replica oReplica : slice.getReplicas()) {
-                  if (nReplicas.contains(oReplica)) {
-                    newReplicas.put(oReplica.getName(), oReplica);
-                  }
-                }
                 
                 finalC.getSlice(sliceId).getReplicas().forEach((replica) -> {
                   newReplicas.put(replica.getName(), replica);