You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by no...@apache.org on 2022/12/05 12:26:44 UTC

[solr] 01/01: splitshard should honour createNodeSet

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

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

commit a1de6101d6ae96b205cf62cb66feab37662d3e1e
Author: Noble Paul <no...@gmail.com>
AuthorDate: Mon Dec 5 23:26:25 2022 +1100

    splitshard should honour createNodeSet
---
 .../solr/cloud/api/collections/SplitShardCmd.java  |  8 ++-
 .../solr/handler/admin/CollectionsHandler.java     |  4 +-
 .../test/org/apache/solr/cloud/SplitShardTest.java | 72 ++++++++++++++++++++++
 .../solrj/request/CollectionAdminRequest.java      |  9 +++
 4 files changed, 91 insertions(+), 2 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/SplitShardCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/SplitShardCmd.java
index 0193e0b1939..087e2bb6970 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/SplitShardCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/SplitShardCmd.java
@@ -18,6 +18,7 @@
 package org.apache.solr.cloud.api.collections;
 
 import static org.apache.solr.client.solrj.impl.SolrClientNodeStateProvider.Variable.CORE_IDX;
+import static org.apache.solr.cloud.api.collections.CollectionHandlingUtils.RANDOM;
 import static org.apache.solr.common.cloud.ZkStateReader.COLLECTION_PROP;
 import static org.apache.solr.common.cloud.ZkStateReader.REPLICA_TYPE;
 import static org.apache.solr.common.cloud.ZkStateReader.SHARD_ID_PROP;
@@ -576,7 +577,12 @@ public class SplitShardCmd implements CollApiCmds.CollectionApiCommand {
               .assignNrtReplicas(numNrt.get())
               .assignTlogReplicas(numTlog.get())
               .assignPullReplicas(numPull.get())
-              .onNodes(new ArrayList<>(clusterState.getLiveNodes()))
+              .onNodes(
+                  Assign.getLiveOrLiveAndCreateNodeSetList(
+                      clusterState.getLiveNodes(),
+                      message,
+                      RANDOM,
+                      ccc.getSolrCloudManager().getDistribStateManager()))
               .build();
       Assign.AssignStrategy assignStrategy = Assign.createAssignStrategy(ccc.getCoreContainer());
       List<ReplicaPosition> replicaPositions =
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 84f397b0e52..a3c00dd29de 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
@@ -47,6 +47,7 @@ import static org.apache.solr.common.params.CollectionAdminParams.ALIAS;
 import static org.apache.solr.common.params.CollectionAdminParams.COLLECTION;
 import static org.apache.solr.common.params.CollectionAdminParams.COLL_CONF;
 import static org.apache.solr.common.params.CollectionAdminParams.COUNT_PROP;
+import static org.apache.solr.common.params.CollectionAdminParams.CREATE_NODE_SET_PARAM;
 import static org.apache.solr.common.params.CollectionAdminParams.FOLLOW_ALIASES;
 import static org.apache.solr.common.params.CollectionAdminParams.PER_REPLICA_STATE;
 import static org.apache.solr.common.params.CollectionAdminParams.PROPERTY_NAME;
@@ -933,7 +934,8 @@ public class CollectionsHandler extends RequestHandlerBase implements Permission
                   NUM_SUB_SHARDS,
                   SPLIT_FUZZ,
                   SPLIT_BY_PREFIX,
-                  FOLLOW_ALIASES);
+                  FOLLOW_ALIASES,
+                  CREATE_NODE_SET_PARAM);
           return copyPropertiesWithPrefix(req.getParams(), map, PROPERTY_PREFIX);
         }),
     DELETESHARD_OP(
diff --git a/solr/core/src/test/org/apache/solr/cloud/SplitShardTest.java b/solr/core/src/test/org/apache/solr/cloud/SplitShardTest.java
index 1d8cd1bd092..2943dcfc14e 100644
--- a/solr/core/src/test/org/apache/solr/cloud/SplitShardTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/SplitShardTest.java
@@ -23,8 +23,11 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.solr.client.solrj.SolrClient;
@@ -41,6 +44,8 @@ import org.apache.solr.common.SolrException;
 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.util.NamedList;
+import org.apache.solr.embedded.JettySolrRunner;
 import org.hamcrest.MatcherAssert;
 import org.junit.After;
 import org.junit.Before;
@@ -310,6 +315,73 @@ public class SplitShardTest extends SolrCloudTestCase {
     log.info("Number of documents indexed and queried : {}", numDocs);
   }
 
+  public void testShardSplitWithNodeset() throws Exception {
+    String COLL = "shard_split_nodeset";
+    MiniSolrCloudCluster cluster =
+        configureCluster(2)
+            .withJettyConfig(jetty -> jetty.enableV2(true))
+            .addConfig("conf", configset("conf2"))
+            .configure();
+
+    try {
+      CollectionAdminRequest.createCollection(COLL, "conf", 2, 2).process(cluster.getSolrClient());
+      cluster.waitForActiveCollection(COLL, 2, 4);
+
+      JettySolrRunner jetty = cluster.startJettySolrRunner();
+
+      CollectionAdminRequest.SplitShard splitShard =
+          CollectionAdminRequest.splitShard(COLL)
+              .setCreateNodeSet(jetty.getNodeName())
+              .setShardName("shard1");
+      NamedList<Object> response = splitShard.process(cluster.getSolrClient()).getResponse();
+      assertNotNull(response.get("success"));
+
+      cluster
+          .getZkStateReader()
+          .waitForState(
+              COLL,
+              10,
+              TimeUnit.SECONDS,
+              (liveNodes, collectionState) ->
+                  testColl(jetty, collectionState, List.of("shard1_0", "shard1_1")));
+
+      JettySolrRunner randomJetty = cluster.getRandomJetty(random());
+      splitShard =
+          CollectionAdminRequest.splitShard(COLL)
+              .setCreateNodeSet(randomJetty.getNodeName())
+              .setShardName("shard2");
+      response = splitShard.process(cluster.getSolrClient()).getResponse();
+      assertNotNull(response.get("success"));
+
+      cluster
+          .getZkStateReader()
+          .waitForState(
+              COLL,
+              10,
+              TimeUnit.SECONDS,
+              (liveNodes, collectionState) ->
+                  testColl(randomJetty, collectionState, List.of("shard2_0", "shard2_1")));
+
+    } finally {
+      cluster.shutdown();
+    }
+  }
+
+  private boolean testColl(
+      JettySolrRunner jetty, DocCollection collectionState, Collection<String> sh) {
+    Collection<String> set = new HashSet<>(sh);
+    collectionState.forEachReplica(
+        (s, replica) -> {
+          if (replica.getNodeName().equals(jetty.getNodeName())
+              && !replica.isLeader()
+              && set.contains(replica.shard)) {
+            set.remove(replica.shard);
+          }
+        });
+
+    return set.isEmpty();
+  }
+
   @Test
   public void testLiveSplit() throws Exception {
     // Debugging tips: if this fails, it may be easier to debug by lowering the number fo threads to
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
index 3cc4700cfa8..0a41b2c782a 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
@@ -1569,6 +1569,7 @@ public abstract class CollectionAdminRequest<T extends CollectionAdminResponse>
     protected Float splitFuzz;
 
     private Properties properties;
+    protected String createNodeSet;
 
     private SplitShard(String collection) {
       super(CollectionAction.SPLITSHARD);
@@ -1580,6 +1581,11 @@ public abstract class CollectionAdminRequest<T extends CollectionAdminResponse>
       return this;
     }
 
+    public SplitShard setCreateNodeSet(String nodeset) {
+      this.createNodeSet = nodeset;
+      return this;
+    }
+
     public String getRanges() {
       return ranges;
     }
@@ -1671,6 +1677,9 @@ public abstract class CollectionAdminRequest<T extends CollectionAdminResponse>
       if (properties != null) {
         addProperties(params, properties);
       }
+      if (createNodeSet != null) {
+        params.set(CREATE_NODE_SET_PARAM, createNodeSet);
+      }
       return params;
     }
   }