Skip to content

Commit 47e3d06

Browse files
authored
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).
1 parent 4cb1000 commit 47e3d06

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

lucene/core/src/java/org/apache/lucene/index/IndexWriter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5019,8 +5019,7 @@ public int length() {
50195019
// Merge would produce a 0-doc segment, so we do nothing except commit the merge to remove
50205020
// all the 0-doc segments that we "merged":
50215021
assert merge.info.info.maxDoc() == 0;
5022-
commitMerge(merge, mergeState);
5023-
success = true;
5022+
success = commitMerge(merge, mergeState);
50245023
return 0;
50255024
}
50265025

lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3847,6 +3847,41 @@ public void testSoftAndHardLiveDocs() throws IOException {
38473847
IOUtils.close(writer, dir);
38483848
}
38493849

3850+
public void testAbortFullyDeletedSegment() throws Exception {
3851+
AtomicBoolean abortMergeBeforeCommit = new AtomicBoolean();
3852+
OneMergeWrappingMergePolicy mergePolicy =
3853+
new OneMergeWrappingMergePolicy(
3854+
newMergePolicy(),
3855+
toWrap ->
3856+
new MergePolicy.OneMerge(toWrap.segments) {
3857+
@Override
3858+
void onMergeComplete() throws IOException {
3859+
super.onMergeComplete();
3860+
if (abortMergeBeforeCommit.get()) {
3861+
setAborted();
3862+
}
3863+
}
3864+
}) {
3865+
@Override
3866+
public boolean keepFullyDeletedSegment(IOSupplier<CodecReader> readerIOSupplier) {
3867+
return true;
3868+
}
3869+
};
3870+
3871+
Directory dir = newDirectory();
3872+
IndexWriterConfig indexWriterConfig =
3873+
newIndexWriterConfig().setMergePolicy(mergePolicy).setCommitOnClose(false);
3874+
IndexWriter writer = new IndexWriter(dir, indexWriterConfig);
3875+
writer.addDocument(Collections.singletonList(new StringField("id", "1", Field.Store.YES)));
3876+
writer.flush();
3877+
3878+
writer.deleteDocuments(new Term("id", "1"));
3879+
abortMergeBeforeCommit.set(true);
3880+
writer.flush();
3881+
writer.forceMerge(1);
3882+
IOUtils.close(writer, dir);
3883+
}
3884+
38503885
private void assertHardLiveDocs(IndexWriter writer, Set<Integer> uniqueDocs) throws IOException {
38513886
try (DirectoryReader reader = DirectoryReader.open(writer)) {
38523887
assertEquals(uniqueDocs.size(), reader.numDocs());

0 commit comments

Comments
 (0)