You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ab...@apache.org on 2019/08/14 16:51:29 UTC

[lucene-solr] branch master updated: SOLR-13694: IndexSizeEstimator NullPointerException.

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 7c2d45d  SOLR-13694: IndexSizeEstimator NullPointerException.
7c2d45d is described below

commit 7c2d45d53ecb2adeaccac9c81a4d195109fcb65f
Author: Andrzej Bialecki <ab...@apache.org>
AuthorDate: Wed Aug 14 17:57:13 2019 +0200

    SOLR-13694: IndexSizeEstimator NullPointerException.
---
 solr/CHANGES.txt                                   |  2 ++
 .../solr/handler/admin/IndexSizeEstimator.java     |  8 ++++---
 .../solr/handler/admin/IndexSizeEstimatorTest.java | 25 ++++++++++++++++++++++
 3 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index cff9eb2..a5cfc9d 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -149,6 +149,8 @@ Bug Fixes
 * SOLR-13141: CDCR bootstrap does not replicate index to the replicas of target cluster.
   (Krzysztof Watral, Amrit Sarkar, Tim, Tdspringsteen, shalin)
 
+* SOLR-13694: IndexSizeEstimator NullPointerException. (ab, hossman)
+
 Other Changes
 ----------------------
 
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/IndexSizeEstimator.java b/solr/core/src/java/org/apache/solr/handler/admin/IndexSizeEstimator.java
index 5ef02ff..be25029 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/IndexSizeEstimator.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/IndexSizeEstimator.java
@@ -505,14 +505,16 @@ public class IndexSizeEstimator {
         CodecReader codecReader = (CodecReader)leafReader;
         StoredFieldsReader storedFieldsReader = codecReader.getFieldsReader();
         // this instance may be faster for a full sequential pass
-        storedFieldsReader = storedFieldsReader.getMergeInstance();
+        StoredFieldsReader mergeInstance = storedFieldsReader.getMergeInstance();
         for (int docId = 0; docId < leafReader.maxDoc(); docId += samplingStep) {
           if (liveDocs != null && !liveDocs.get(docId)) {
             continue;
           }
-          storedFieldsReader.visitDocument(docId, visitor);
+          mergeInstance.visitDocument(docId, visitor);
+        }
+        if (mergeInstance != storedFieldsReader) {
+          mergeInstance.close();
         }
-        storedFieldsReader.close();
       } else {
         for (int docId = 0; docId < leafReader.maxDoc(); docId += samplingStep) {
           if (liveDocs != null && !liveDocs.get(docId)) {
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/IndexSizeEstimatorTest.java b/solr/core/src/test/org/apache/solr/handler/admin/IndexSizeEstimatorTest.java
index 16cf270..2ad9b87 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/IndexSizeEstimatorTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/IndexSizeEstimatorTest.java
@@ -23,6 +23,14 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.lucene.codecs.StoredFieldsReader;
+import org.apache.lucene.document.DocumentStoredFieldVisitor;
+import org.apache.lucene.index.CodecReader;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.LeafReader;
+import org.apache.lucene.index.LeafReaderContext;
+import org.apache.lucene.index.StoredFieldVisitor;
+import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.RamUsageEstimator;
 import org.apache.lucene.util.TestUtil;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -124,6 +132,23 @@ public class IndexSizeEstimatorTest extends SolrCloudTestCase {
         double delta = (double) size * 0.5;
         assertEquals("sampled size of " + field + " is wildly off", (double)size, (double)sampledSize, delta);
       });
+      // verify the reader is still usable - SOLR-13694
+      IndexReader reader = searcher.getRawReader();
+      for (LeafReaderContext context : reader.leaves()) {
+        LeafReader leafReader = context.reader();
+        assertTrue("unexpected LeafReader class: " + leafReader.getClass().getName(), leafReader instanceof CodecReader);
+        Bits liveDocs = leafReader.getLiveDocs();
+        CodecReader codecReader = (CodecReader) leafReader;
+        StoredFieldsReader storedFieldsReader = codecReader.getFieldsReader();
+        StoredFieldVisitor visitor = new DocumentStoredFieldVisitor();
+        assertNotNull(storedFieldsReader);
+        for (int docId = 0; docId < leafReader.maxDoc(); docId++) {
+          if (liveDocs != null && !liveDocs.get(docId)) {
+            continue;
+          }
+          storedFieldsReader.visitDocument(docId, visitor);
+        }
+      }
     } finally {
       searcherRef.decref();
       core.close();