You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by no...@apache.org on 2021/01/18 12:47:25 UTC

[lucene-solr] 01/02: merging with 8x

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

noble pushed a commit to branch jira/solr_13951
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git

commit ff69c0c46c1eb476e6037894e2856ebb6770a574
Author: noblepaul <no...@gmail.com>
AuthorDate: Mon Jan 18 17:00:48 2021 +1100

    merging with 8x
---
 .../java/org/apache/solr/cloud/ZkController.java   |  1 +
 .../apache/solr/cloud/overseer/ZkStateWriter.java  |  6 ++----
 .../solr/handler/admin/CollectionsHandler.java     | 13 ++----------
 .../client/solrj/cloud/DistribStateManager.java    |  7 +++++++
 .../client/solrj/impl/ZkDistribStateManager.java   |  6 ++++++
 .../org/apache/solr/common/cloud/ClusterState.java |  8 +++++---
 .../java/org/apache/solr/common/cloud/Replica.java | 23 +++++++++++++---------
 .../client/solrj/impl/CloudSolrClientTest.java     |  2 +-
 8 files changed, 38 insertions(+), 28 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkController.java b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
index ee4da55..dd55332 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@ -1610,6 +1610,7 @@ public class ZkController implements Closeable {
    */
   static boolean sendToOverseer(DocCollection coll, String replicaName) {
     if (coll == null) return true;
+    if (!coll.isPerReplicaState()) return true;
     Replica r = coll.getReplica(replicaName);
     if (r == null) return true;
     Slice shard = coll.getSlice(r.shard);
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 1ebccd2..2ff739b 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
@@ -148,10 +148,8 @@ public class ZkStateWriter {
     for (ZkWriteCommand cmd : cmds) {
       if (cmd == NO_OP) continue;
       prevState = prevState.copyWith(cmd.name, cmd.collection);
-      if (cmd.collection == null) {
-        updates.put(cmd.name, cmd);
-        numUpdates++;
-      }
+      updates.put(cmd.name, cmd);
+      numUpdates++;
     }
     clusterState = prevState;
 
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
index 974699c..5056b44 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
@@ -19,17 +19,8 @@ package org.apache.solr.handler.admin;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.net.URI;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.stream.Collectors;
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/DistribStateManager.java b/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/DistribStateManager.java
index cac6cd2..feae27f 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/DistribStateManager.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/DistribStateManager.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.NoSuchElementException;
 
 import org.apache.solr.common.SolrCloseable;
+import org.apache.solr.common.cloud.PerReplicaStates;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.Op;
@@ -100,6 +101,12 @@ public interface DistribStateManager extends SolrCloseable {
     return tree;
   }
 
+  default PerReplicaStates getReplicaStates(String path) throws KeeperException, InterruptedException {
+    throw new UnsupportedOperationException("Not implemented");
+
+
+  }
+
   /**
    * Remove data recursively.
    * @param root root path
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ZkDistribStateManager.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ZkDistribStateManager.java
index d2c3f40..fe4b961 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ZkDistribStateManager.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ZkDistribStateManager.java
@@ -27,6 +27,7 @@ import org.apache.solr.client.solrj.cloud.DistribStateManager;
 import org.apache.solr.client.solrj.cloud.NotEmptyException;
 import org.apache.solr.client.solrj.cloud.VersionedData;
 import org.apache.solr.common.AlreadyClosedException;
+import org.apache.solr.common.cloud.PerReplicaStates;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
@@ -181,4 +182,9 @@ public class ZkDistribStateManager implements DistribStateManager {
   public SolrZkClient getZkClient() {
     return zkClient;
   }
+
+  @Override
+  public PerReplicaStates getReplicaStates(String path) throws KeeperException, InterruptedException {
+    return PerReplicaStates.fetch(path, zkClient, null);
+  }
 }
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java
index 5f8ee6b..3f05cee 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java
@@ -248,8 +248,10 @@ public class ClusterState implements JSONWriter.Writable {
     Map<String,Object> props;
     Map<String,Slice> slices;
 
-    if("true".equals(String.valueOf(objs.get(DocCollection.PER_REPLICA_STATE)))) {
-      log.info("a collection {} has per-replica state" , name);
+    if (Boolean.parseBoolean(String.valueOf(objs.get(DocCollection.PER_REPLICA_STATE)))) {
+      if(log.isDebugEnabled()) {
+        log.debug("a collection {} has per-replica state", name);
+      }
       //this collection has replica states stored outside
       ReplicaStatesProvider rsp = REPLICASTATES_PROVIDER.get();
       if (rsp instanceof StatesProvider) ((StatesProvider) rsp).isPerReplicaState = true;
@@ -448,7 +450,7 @@ public class ClusterState implements JSONWriter.Writable {
 
     @Override
     public PerReplicaStates getStates() {
-      if(perReplicaStates == null) perReplicaStates = replicaStatesSupplier.get();
+      if (perReplicaStates == null) perReplicaStates = replicaStatesSupplier.get();
       return perReplicaStates;
     }
 
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/Replica.java b/solr/solrj/src/java/org/apache/solr/common/cloud/Replica.java
index f3253b6..27734db 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/Replica.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/Replica.java
@@ -151,6 +151,7 @@ public class Replica extends ZkNodeProps implements MapWriter {
     this.node = (String) propMap.get(ZkStateReader.NODE_NAME_PROP);
     this.core = (String) propMap.get(ZkStateReader.CORE_NAME_PROP);
     this.type = Type.get((String) propMap.get(ZkStateReader.REPLICA_TYPE));
+    readPrs();
     // default to ACTIVE
     this.state = State.getState(String.valueOf(propMap.getOrDefault(ZkStateReader.STATE_PROP, State.ACTIVE.toString())));
     validate();
@@ -172,6 +173,7 @@ public class Replica extends ZkNodeProps implements MapWriter {
     if (props != null) {
       this.propMap.putAll(props);
     }
+    readPrs();
     validate();
     propMap.put(BASE_URL_PROP, UrlScheme.INSTANCE.getBaseUrlForNodeName(this.node));
   }
@@ -193,6 +195,14 @@ public class Replica extends ZkNodeProps implements MapWriter {
     this.node = String.valueOf(details.get("node_name"));
 
     this.propMap.putAll(details);
+    readPrs();
+    type = Replica.Type.valueOf(String.valueOf(propMap.getOrDefault(ZkStateReader.REPLICA_TYPE, "NRT")));
+    if(state == null) state = State.getState(String.valueOf(propMap.getOrDefault(ZkStateReader.STATE_PROP, "active")));
+    validate();
+    propMap.put(BASE_URL_PROP, UrlScheme.INSTANCE.getBaseUrlForNodeName(this.node));
+  }
+
+  private void readPrs() {
     ClusterState.getReplicaStatesProvider().get().ifPresent(it -> {
       log.debug("A replica  {} state fetched from per-replica state", name);
       replicaState = it.getStates().get(name);
@@ -201,10 +211,6 @@ public class Replica extends ZkNodeProps implements MapWriter {
         if (replicaState.isLeader) propMap.put(Slice.LEADER, "true");
       }
     }) ;
-    type = Replica.Type.valueOf(String.valueOf(propMap.getOrDefault(ZkStateReader.REPLICA_TYPE, "NRT")));
-    if(state == null) state = State.getState(String.valueOf(propMap.getOrDefault(ZkStateReader.STATE_PROP, "active")));
-    validate();
-    propMap.put(BASE_URL_PROP, UrlScheme.INSTANCE.getBaseUrlForNodeName(this.node));
   }
 
   private final void validate() {
@@ -295,11 +301,6 @@ public class Replica extends ZkNodeProps implements MapWriter {
     return this.type;
   }
 
-  public boolean isLeader() {
-    if(replicaState != null) return replicaState.isLeader;
-    return getBool(ZkStateReader.LEADER_PROP, false);
-  }
-
   public Object get(String key, Object defValue) {
     Object o = get(key);
     if (o != null) {
@@ -383,6 +384,10 @@ public class Replica extends ZkNodeProps implements MapWriter {
           .put(ZkStateReader.STATE_PROP, state.toString(), p);
     };
   }
+  public boolean isLeader() {
+    if (replicaState != null) return replicaState.isLeader;
+    return getStr(Slice.LEADER) != null;
+  }
 
   @Override
   public void write(JSONWriter jsonWriter) {
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java
index f655b21..e156607 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java
@@ -1076,7 +1076,7 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
     testCollection = "perReplicaState_testv2";
     new V2Request.Builder("/collections")
         .withMethod(POST)
-        .withPayload("{create: {name: perReplicaState_testv2, config : conf, numShards : 2, nrtReplicas : 2, perReplicaState : true, maxShardsPerNode : 5}}")
+        .withPayload("{create: {name: perReplicaState_testv2, config : conf, numShards : 2, nrtReplicas : 2, perReplicaState : true}}")
         .build()
         .process(cluster.getSolrClient());
     cluster.waitForActiveCollection(testCollection, 2, 4);