You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ds...@apache.org on 2020/05/15 18:37:57 UTC

[lucene-solr] branch branch_8x updated: SOLR-8394: /admin/luke didn't computeindexHeapUsageBytes (#1497)

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

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


The following commit(s) were added to refs/heads/branch_8x by this push:
     new 6a33ce9  SOLR-8394: /admin/luke didn't computeindexHeapUsageBytes (#1497)
6a33ce9 is described below

commit 6a33ce96f6b33661fb57dfd3ece322fc57bcdaca
Author: David Smiley <ds...@apache.org>
AuthorDate: Fri May 15 14:02:49 2020 -0400

    SOLR-8394: /admin/luke didn't computeindexHeapUsageBytes (#1497)
    
    Needed to call FilterLeafReader.unwrap.
    
    Co-authored-by: igiguere <ig...@opentext.com>
    (cherry picked from commit 803aad91757be4140c6f96f12e3cf74f5c6e3a87)
---
 solr/CHANGES.txt                                   |  3 +++
 .../solr/handler/admin/LukeRequestHandler.java     | 29 ++++++++++++----------
 .../handler/admin/SegmentsInfoRequestHandler.java  |  5 +---
 .../solr/handler/admin/LukeRequestHandlerTest.java | 15 +++++++++++
 4 files changed, 35 insertions(+), 17 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 59f9004..8bf55c1 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -105,6 +105,9 @@ Bug Fixes
 * SOLR-14471: Fix bug in shards.preference behavior, base replica selection strategy not applied to the last group of
   equivalent replicas. (Michael Gibney via Tomás Fernández Löbbe)
 
+* SOLR-8394: /admin/luke was always showing 0 for indexHeapUsageBytes. It should work now.
+  (Steve Molloy, Isabelle Giguere, David Smiley)
+
 Other Changes
 ---------------------
 * SOLR-14197: SolrResourceLoader: marked many methods as deprecated, and in some cases rerouted exiting logic to avoid
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java
index 1ed694b..49f0b28 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java
@@ -17,8 +17,8 @@
 package org.apache.solr.handler.admin;
 
 import java.io.IOException;
-import java.nio.file.NoSuchFileException;
 import java.lang.invoke.MethodHandles;
+import java.nio.file.NoSuchFileException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
@@ -39,6 +39,7 @@ import org.apache.lucene.document.Field;
 import org.apache.lucene.index.DirectoryReader;
 import org.apache.lucene.index.DocValuesType;
 import org.apache.lucene.index.FieldInfo;
+import org.apache.lucene.index.FilterLeafReader;
 import org.apache.lucene.index.IndexCommit;
 import org.apache.lucene.index.IndexOptions;
 import org.apache.lucene.index.IndexReader;
@@ -47,7 +48,6 @@ import org.apache.lucene.index.LeafReader;
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.MultiTerms;
 import org.apache.lucene.index.PostingsEnum;
-import org.apache.lucene.index.SegmentReader;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.index.Terms;
 import org.apache.lucene.index.TermsEnum;
@@ -55,6 +55,7 @@ import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.search.similarities.Similarity;
 import org.apache.lucene.store.AlreadyClosedException;
 import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.Accountable;
 import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.CharsRefBuilder;
@@ -634,17 +635,19 @@ public class LukeRequestHandler extends RequestHandlerBase
 
   /** Returns the sum of RAM bytes used by each segment */
   private static long getIndexHeapUsed(DirectoryReader reader) {
-    long indexHeapRamBytesUsed = 0;
-    for(LeafReaderContext leafReaderContext : reader.leaves()) {
-      LeafReader leafReader = leafReaderContext.reader();
-      if (leafReader instanceof SegmentReader) {
-        indexHeapRamBytesUsed += ((SegmentReader) leafReader).ramBytesUsed();
-      } else {
-        // Not supported for any reader that is not a SegmentReader
-        return -1;
-      }
-    }
-    return indexHeapRamBytesUsed;
+    return reader.leaves().stream()
+        .map(LeafReaderContext::reader)
+        .map(FilterLeafReader::unwrap)
+        .map(leafReader -> {
+          if (leafReader instanceof Accountable) {
+            return ((Accountable) leafReader).ramBytesUsed();
+          } else {
+            return -1L; // unsupported
+          }
+        })
+        .mapToLong(Long::longValue)
+        .reduce(0, (left, right) -> left == -1 || right == -1 ? -1 : left + right);
+    // if any leaves are unsupported (-1), we ultimately return -1.
   }
 
   // Get terribly detailed information about a particular field. This is a very expensive call, use it with caution
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/SegmentsInfoRequestHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/SegmentsInfoRequestHandler.java
index 9183dcf..cbc7ed4 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/SegmentsInfoRequestHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/SegmentsInfoRequestHandler.java
@@ -238,10 +238,7 @@ public class SegmentsInfoRequestHandler extends RequestHandlerBase {
     SegmentReader seg = null;
     for (LeafReaderContext lrc : leafContexts) {
       LeafReader leafReader = lrc.reader();
-      // unwrap
-      while (leafReader instanceof FilterLeafReader) {
-        leafReader = ((FilterLeafReader)leafReader).getDelegate();
-      }
+      leafReader = FilterLeafReader.unwrap(leafReader);
       if (leafReader instanceof SegmentReader) {
         SegmentReader sr = (SegmentReader)leafReader;
         if (sr.getSegmentInfo().info.equals(segmentCommitInfo.info)) {
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/LukeRequestHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/LukeRequestHandlerTest.java
index df043c1..8065f55 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/LukeRequestHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/LukeRequestHandlerTest.java
@@ -19,12 +19,15 @@ package org.apache.solr.handler.admin;
 import java.util.Arrays;
 import java.util.EnumSet;
 
+import javax.xml.xpath.XPathConstants;
+
 import org.apache.solr.common.luke.FieldFlag;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.schema.CustomAnalyzerStrField; // jdoc
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.util.TestHarness;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -142,6 +145,18 @@ public class LukeRequestHandlerTest extends SolrTestCaseJ4 {
   private static String dynfield(String field) {
     return "//lst[@name='dynamicFields']/lst[@name='"+field+"']/";
   }
+  
+  @Test
+  public void testIndexHeapUsageBytes() throws Exception {
+    try (SolrQueryRequest req = req("qt", "/admin/luke")) {
+      String response = h.query(req);
+      String xpath = "//long[@name='indexHeapUsageBytes']";
+      Double num = (Double) TestHarness.evaluateXPath(response, xpath, XPathConstants.NUMBER);
+      //with docs in the index, indexHeapUsageBytes should be greater than 0
+      Assert.assertTrue("indexHeapUsageBytes should be > 0, but was " + num.intValue(), num.intValue() > 0);
+    }
+  }
+
   @Test
   public void testFlParam() {
     SolrQueryRequest req = req("qt", "/admin/luke", "fl", "solr_t solr_s", "show", "all");