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

dsmiley pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/branch_9x by this push:
     new 559daafa950 SOLR-17408: COLSTATUS shouldn't talk to replicas if not 
needed (#2645)
559daafa950 is described below

commit 559daafa950124a46fa0b1277501fd092be37d77
Author: mariemat <[email protected]>
AuthorDate: Thu Aug 22 04:53:59 2024 +0200

    SOLR-17408: COLSTATUS shouldn't talk to replicas if not needed (#2645)
    
    Was always talking to replicas to gather segment info, even if not needed.
    
    (cherry picked from commit bc8dcd5ffd02709875ff39b0aff3c27cc04845b1)
---
 solr/CHANGES.txt                                   |  3 +
 .../org/apache/solr/handler/admin/ColStatus.java   | 86 ++++++++++++----------
 2 files changed, 50 insertions(+), 39 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 0262d787ad4..a07e060c70c 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -27,6 +27,9 @@ Optimizations
 
 * SOLR-17396: Reduce thread contention in 
ZkStateReader.getCollectionProperties(). (Aparna Suresh, David Smiley, Paul 
McArthur)
 
+* SOLR-17408: COLSTATUS command was fetching details remotely from replicas 
when this information
+  wasn't asked for. (Mathieu Marie)
+
 Bug Fixes
 ---------------------
 (No changes)
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/ColStatus.java 
b/solr/core/src/java/org/apache/solr/handler/admin/ColStatus.java
index 6befd13b192..5bc0884a144 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/ColStatus.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/ColStatus.java
@@ -93,8 +93,14 @@ public class ColStatus {
     if (withRawSizeSummary || withRawSizeDetails) {
       withRawSizeInfo = true;
     }
-    if (withFieldInfo || withSizeInfo) {
-      withSegments = true;
+    boolean getSegments = false;
+    if (withFieldInfo
+        || withSizeInfo
+        || withCoreInfo
+        || withRawSizeInfo
+        || withRawSizeDetails
+        || withRawSizeSummary) {
+      getSegments = true;
     }
     for (String collection : collections) {
       DocCollection coll = clusterState.getCollectionOrNull(collection);
@@ -176,48 +182,50 @@ public class ColStatus {
         if (url == null) {
           continue;
         }
-        try (SolrClient client = solrClientCache.getHttpSolrClient(url)) {
-          ModifiableSolrParams params = new ModifiableSolrParams();
-          params.add(CommonParams.QT, "/admin/segments");
-          params.add(FIELD_INFO_PROP, "true");
-          params.add(CORE_INFO_PROP, String.valueOf(withCoreInfo));
-          params.add(SIZE_INFO_PROP, String.valueOf(withSizeInfo));
-          params.add(RAW_SIZE_PROP, String.valueOf(withRawSizeInfo));
-          params.add(RAW_SIZE_SUMMARY_PROP, 
String.valueOf(withRawSizeSummary));
-          params.add(RAW_SIZE_DETAILS_PROP, 
String.valueOf(withRawSizeDetails));
-          if (samplingPercent != null) {
-            params.add(RAW_SIZE_SAMPLING_PERCENT_PROP, 
String.valueOf(samplingPercent));
-          }
-          QueryRequest req = new QueryRequest(params);
-          NamedList<Object> rsp = client.request(req);
-          rsp.remove("responseHeader");
-          leaderMap.add("segInfos", rsp);
-          NamedList<?> segs = (NamedList<?>) rsp.get("segments");
-          if (segs != null) {
-            for (Map.Entry<String, ?> entry : segs) {
-              NamedList<Object> fields =
-                  (NamedList<Object>) ((NamedList<Object>) 
entry.getValue()).get("fields");
-              if (fields != null) {
-                for (Map.Entry<String, Object> fEntry : fields) {
-                  Object nc = ((NamedList<Object>) 
fEntry.getValue()).get("nonCompliant");
-                  if (nc != null) {
-                    nonCompliant.add(fEntry.getKey());
+        if (getSegments) {
+          try (SolrClient client = solrClientCache.getHttpSolrClient(url)) {
+            ModifiableSolrParams params = new ModifiableSolrParams();
+            params.add(CommonParams.QT, "/admin/segments");
+            params.add(FIELD_INFO_PROP, "true");
+            params.add(CORE_INFO_PROP, String.valueOf(withCoreInfo));
+            params.add(SIZE_INFO_PROP, String.valueOf(withSizeInfo));
+            params.add(RAW_SIZE_PROP, String.valueOf(withRawSizeInfo));
+            params.add(RAW_SIZE_SUMMARY_PROP, 
String.valueOf(withRawSizeSummary));
+            params.add(RAW_SIZE_DETAILS_PROP, 
String.valueOf(withRawSizeDetails));
+            if (samplingPercent != null) {
+              params.add(RAW_SIZE_SAMPLING_PERCENT_PROP, 
String.valueOf(samplingPercent));
+            }
+            QueryRequest req = new QueryRequest(params);
+            NamedList<Object> rsp = client.request(req);
+            rsp.remove("responseHeader");
+            leaderMap.add("segInfos", rsp);
+            NamedList<?> segs = (NamedList<?>) rsp.get("segments");
+            if (segs != null) {
+              for (Map.Entry<String, ?> entry : segs) {
+                NamedList<Object> fields =
+                    (NamedList<Object>) ((NamedList<Object>) 
entry.getValue()).get("fields");
+                if (fields != null) {
+                  for (Map.Entry<String, Object> fEntry : fields) {
+                    Object nc = ((NamedList<Object>) 
fEntry.getValue()).get("nonCompliant");
+                    if (nc != null) {
+                      nonCompliant.add(fEntry.getKey());
+                    }
                   }
                 }
-              }
-              if (!withFieldInfo) {
-                ((NamedList<Object>) entry.getValue()).remove("fields");
+                if (!withFieldInfo) {
+                  ((NamedList<Object>) entry.getValue()).remove("fields");
+                }
               }
             }
+            if (!withSegments) {
+              rsp.remove("segments");
+            }
+            if (!withFieldInfo) {
+              rsp.remove("fieldInfoLegend");
+            }
+          } catch (SolrServerException | IOException e) {
+            log.warn("Error getting details of replica segments from {}", url, 
e);
           }
-          if (!withSegments) {
-            rsp.remove("segments");
-          }
-          if (!withFieldInfo) {
-            rsp.remove("fieldInfoLegend");
-          }
-        } catch (SolrServerException | IOException e) {
-          log.warn("Error getting details of replica segments from {}", url, 
e);
         }
       }
       if (nonCompliant.isEmpty()) {

Reply via email to