You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ds...@apache.org on 2023/03/31 18:48:30 UTC
[solr] branch main updated: SOLR-16507: SplitShardCmd shouldn't use NodeStateProvider (#1485)
This is an automated email from the ASF dual-hosted git repository.
dsmiley pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/main by this push:
new 9fa1eba9a3a SOLR-16507: SplitShardCmd shouldn't use NodeStateProvider (#1485)
9fa1eba9a3a is described below
commit 9fa1eba9a3ae204d0540d6fbc97a0b185d2ae385
Author: vinayak hegde <vi...@gmail.com>
AuthorDate: Sat Apr 1 00:18:23 2023 +0530
SOLR-16507: SplitShardCmd shouldn't use NodeStateProvider (#1485)
Objective is to limit use of NodeStateProvider to where it's best.
---
solr/CHANGES.txt | 5 ++
.../solr/cloud/api/collections/SplitShardCmd.java | 57 ++++++++++------------
2 files changed, 31 insertions(+), 31 deletions(-)
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index fb2c9233f94..6be7a124916 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -107,6 +107,11 @@ Other Changes
* SOLR-16604: Use Solr Client Builders directly in unit tests instead of delegating to SolrTestCaseJ4. (Eric Pugh, David Smiley)
+Other Changes
+---------------------
+
+* SOLR-16507: Change SplitShardCmd to not use NodeStateProvider (Vinayak Hegde, David Smiley)
+
================== 9.2.0 ==================
New Features
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 23473694b59..0060eb676af 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
@@ -17,7 +17,6 @@
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;
@@ -29,6 +28,7 @@ import static org.apache.solr.common.params.CollectionParams.CollectionAction.DE
import static org.apache.solr.common.params.CommonAdminParams.ASYNC;
import static org.apache.solr.common.params.CommonAdminParams.NUM_SUB_SHARDS;
+import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.util.ArrayList;
import java.util.Collection;
@@ -42,11 +42,13 @@ import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
+import org.apache.solr.client.solrj.SolrRequest;
+import org.apache.solr.client.solrj.SolrResponse;
import org.apache.solr.client.solrj.cloud.DistribStateManager;
-import org.apache.solr.client.solrj.cloud.NodeStateProvider;
import org.apache.solr.client.solrj.cloud.SolrCloudManager;
import org.apache.solr.client.solrj.cloud.VersionedData;
import org.apache.solr.client.solrj.request.CoreAdminRequest;
+import org.apache.solr.client.solrj.request.GenericSolrRequest;
import org.apache.solr.cloud.DistributedClusterStateUpdater;
import org.apache.solr.cloud.Overseer;
import org.apache.solr.cloud.api.collections.CollectionHandlingUtils.ShardRequestTracker;
@@ -65,7 +67,6 @@ import org.apache.solr.common.cloud.ReplicaPosition;
import org.apache.solr.common.cloud.Slice;
import org.apache.solr.common.cloud.ZkNodeProps;
import org.apache.solr.common.cloud.ZkStateReader;
-import org.apache.solr.common.cloud.rule.ImplicitSnitch;
import org.apache.solr.common.params.CollectionAdminParams;
import org.apache.solr.common.params.CommonAdminParams;
import org.apache.solr.common.params.CommonParams;
@@ -872,43 +873,37 @@ public class SplitShardCmd implements CollApiCmds.CollectionApiCommand {
Replica parentShardLeader,
SolrIndexSplitter.SplitMethod method,
SolrCloudManager cloudManager)
- throws SolrException {
+ throws SolrException, IOException {
+
// check that enough disk space is available on the parent leader node
// otherwise the actual index splitting will always fail
- NodeStateProvider nodeStateProvider = cloudManager.getNodeStateProvider();
- Map<String, Object> nodeValues =
- nodeStateProvider.getNodeValues(
- parentShardLeader.getNodeName(), Collections.singletonList(ImplicitSnitch.DISK));
- Map<String, Map<String, List<Replica>>> infos =
- nodeStateProvider.getReplicaInfo(
- parentShardLeader.getNodeName(), Collections.singletonList(CORE_IDX.metricsAttribute));
- if (infos.get(collection) == null || infos.get(collection).get(shard) == null) {
+
+ String replicaName = Utils.parseMetricsReplicaName(collection, parentShardLeader.getCoreName());
+ String indexSizeMetricName =
+ "solr.core." + collection + "." + shard + "." + replicaName + ":INDEX.sizeInBytes";
+ String freeDiskSpaceMetricName = "solr.node:CONTAINER.fs.usableSpace";
+
+ ModifiableSolrParams params =
+ new ModifiableSolrParams()
+ .add("key", indexSizeMetricName)
+ .add("key", freeDiskSpaceMetricName);
+ SolrResponse rsp =
+ cloudManager.request(
+ new GenericSolrRequest(SolrRequest.METHOD.GET, "/admin/metrics", params));
+
+ Number size = (Number) rsp.getResponse().findRecursive("metrics", indexSizeMetricName);
+ if (size == null) {
log.warn("cannot verify information for parent shard leader");
return;
}
- // find the leader
- List<Replica> lst = infos.get(collection).get(shard);
- Double indexSize = null;
- for (Replica info : lst) {
- if (info.getCoreName().equals(parentShardLeader.getCoreName())) {
- Number size = (Number) info.get(CORE_IDX.metricsAttribute);
- if (size == null) {
- log.warn("cannot verify information for parent shard leader");
- return;
- }
- indexSize = (Double) CORE_IDX.convertVal(size);
- break;
- }
- }
- if (indexSize == null) {
- log.warn("missing replica information for parent shard leader");
- return;
- }
- Number freeSize = (Number) nodeValues.get(ImplicitSnitch.DISK);
+ double indexSize = size.doubleValue();
+
+ Number freeSize = (Number) rsp.getResponse().findRecursive("metrics", freeDiskSpaceMetricName);
if (freeSize == null) {
log.warn("missing node disk space information for parent shard leader");
return;
}
+
// 100% more for REWRITE, 5% more for LINK
double neededSpace =
method == SolrIndexSplitter.SplitMethod.REWRITE ? 2.0 * indexSize : 1.05 * indexSize;