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");