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