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