You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by dn...@apache.org on 2021/02/02 17:35:00 UTC

[lucene-solr] branch branch_8_8 updated: LUCENE-9722: Close merged readers on abort (#2288)

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

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


The following commit(s) were added to refs/heads/branch_8_8 by this push:
     new 2e7cfbd  LUCENE-9722: Close merged readers on abort (#2288)
2e7cfbd is described below

commit 2e7cfbd8e60cf8ccb23619db8b20f193546fd1c8
Author: Nhat Nguyen <nh...@elastic.co>
AuthorDate: Tue Feb 2 11:24:10 2021 -0500

    LUCENE-9722: Close merged readers on abort (#2288)
    
    We fail to close the merged readers of an aborted merge if its
    output segment contains no document.
    
    This bug was discovered by a test in Elasticsearch
    (elastic/elasticsearch#67884).
---
 .../java/org/apache/lucene/index/IndexWriter.java  |  3 +-
 .../org/apache/lucene/index/TestIndexWriter.java   | 35 ++++++++++++++++++++++
 2 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java b/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
index 7da8d60..0a8427b 100644
--- a/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
@@ -4801,8 +4801,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit, Accountable,
       if (merger.shouldMerge() == false) {
         // Merge would produce a 0-doc segment, so we do nothing except commit the merge to remove all the 0-doc segments that we "merged":
         assert merge.info.info.maxDoc() == 0;
-        commitMerge(merge, mergeState);
-        success = true;
+        success = commitMerge(merge, mergeState);
         return 0;
       }
 
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java b/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java
index 2eb5e41..b94411b 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java
@@ -3635,6 +3635,41 @@ public class TestIndexWriter extends LuceneTestCase {
     IOUtils.close(writer, dir);
   }
 
+  public void testAbortFullyDeletedSegment() throws Exception {
+    AtomicBoolean abortMergeBeforeCommit = new AtomicBoolean();
+    OneMergeWrappingMergePolicy mergePolicy =
+        new OneMergeWrappingMergePolicy(
+            newMergePolicy(),
+            toWrap ->
+                new MergePolicy.OneMerge(toWrap.segments) {
+                  @Override
+                  void onMergeComplete() throws IOException {
+                    super.onMergeComplete();
+                    if (abortMergeBeforeCommit.get()) {
+                      setAborted();
+                    }
+                  }
+                }) {
+          @Override
+          public boolean keepFullyDeletedSegment(IOSupplier<CodecReader> readerIOSupplier) {
+            return true;
+          }
+        };
+
+    Directory dir = newDirectory();
+    IndexWriterConfig indexWriterConfig =
+        newIndexWriterConfig().setMergePolicy(mergePolicy).setCommitOnClose(false);
+    IndexWriter writer = new IndexWriter(dir, indexWriterConfig);
+    writer.addDocument(Collections.singletonList(new StringField("id", "1", Field.Store.YES)));
+    writer.flush();
+
+    writer.deleteDocuments(new Term("id", "1"));
+    abortMergeBeforeCommit.set(true);
+    writer.flush();
+    writer.forceMerge(1);
+    IOUtils.close(writer, dir);
+  }
+
   private void assertHardLiveDocs(IndexWriter writer, Set<Integer> uniqueDocs) throws IOException {
     try (DirectoryReader reader = DirectoryReader.open(writer)) {
       assertEquals(uniqueDocs.size(), reader.numDocs());