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