Skip to content

Commit da6f631

Browse files
committed
Run merge-on-full-flush even though no changes got flushed. (#12549)
Currently, merge-on-full-flush only checks if merges need to run if changes have been flushed to disk. This prevents from having different merging logic for refreshes and commits, since the merge policy would not be checked upon commit if no new documents got indexed since the previous refresh.
1 parent 1cb1a14 commit da6f631

File tree

7 files changed

+21
-17
lines changed

7 files changed

+21
-17
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
@@ -3681,7 +3681,7 @@ private long prepareCommitInternal() throws IOException {
36813681
// merge completes which would otherwise have
36823682
// removed the files we are now syncing.
36833683
deleter.incRef(toCommit.files(false));
3684-
if (anyChanges && maxCommitMergeWaitMillis > 0) {
3684+
if (maxCommitMergeWaitMillis > 0) {
36853685
// we can safely call preparePointInTimeMerge since writeReaderPool(true) above
36863686
// wrote all
36873687
// necessary files to disk and checkpointed them.
@@ -4233,7 +4233,6 @@ private boolean doFlush(boolean applyAllDeletes) throws IOException {
42334233
flushSuccess = true;
42344234
} finally {
42354235
assert Thread.holdsLock(fullFlushLock);
4236-
;
42374236
docWriter.finishFullFlush(flushSuccess);
42384237
processEvents(false);
42394238
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -654,7 +654,8 @@ public void testOpenIfChangedNRTToCommit() throws Exception {
654654
public void testOverDecRefDuringReopen() throws Exception {
655655
MockDirectoryWrapper dir = newMockDirectory();
656656

657-
IndexWriterConfig iwc = new IndexWriterConfig(new MockAnalyzer(random()));
657+
IndexWriterConfig iwc =
658+
new IndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(NoMergePolicy.INSTANCE);
658659
iwc.setCodec(TestUtil.getDefaultCodec());
659660
IndexWriter w = new IndexWriter(dir, iwc);
660661
Document doc = new Document();

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -519,11 +519,10 @@ public void testFlushWithNoMerging() throws IOException {
519519
doc.add(newField("field", "aaa", customType));
520520
for (int i = 0; i < 19; i++) writer.addDocument(doc);
521521
writer.flush(false, true);
522-
writer.close();
523-
SegmentInfos sis = SegmentInfos.readLatestCommit(dir);
524522
// Since we flushed w/o allowing merging we should now
525523
// have 10 segments
526-
assertEquals(10, sis.size());
524+
assertEquals(10, writer.getSegmentCount());
525+
writer.close();
527526
dir.close();
528527
}
529528

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1314,7 +1314,7 @@ public void testTryDeleteDocument() throws Exception {
13141314
w.addDocument(doc);
13151315
w.close();
13161316

1317-
iwc = new IndexWriterConfig(new MockAnalyzer(random()));
1317+
iwc = new IndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(NoMergePolicy.INSTANCE);
13181318
iwc.setOpenMode(IndexWriterConfig.OpenMode.APPEND);
13191319
w = new IndexWriter(d, iwc);
13201320
IndexReader r = DirectoryReader.open(w, false, false);

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

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -394,14 +394,13 @@ public void testMergeOnCommit() throws IOException {
394394
.setMaxFullFlushMergeWaitMillis(Integer.MAX_VALUE);
395395

396396
IndexWriter writerWithMergePolicy = new IndexWriter(dir, iwc);
397-
writerWithMergePolicy.commit(); // No changes. Commit doesn't trigger a merge.
398397

398+
// No changes. Refresh doesn't trigger a merge.
399399
DirectoryReader unmergedReader = DirectoryReader.open(writerWithMergePolicy);
400400
assertEquals(5, unmergedReader.leaves().size());
401401
unmergedReader.close();
402402

403-
TestIndexWriter.addDoc(writerWithMergePolicy);
404-
writerWithMergePolicy.commit(); // Doc added, do merge on commit.
403+
writerWithMergePolicy.commit(); // Do merge on commit.
405404
assertEquals(1, writerWithMergePolicy.getSegmentCount()); //
406405

407406
DirectoryReader mergedReader = DirectoryReader.open(writerWithMergePolicy);
@@ -410,8 +409,8 @@ public void testMergeOnCommit() throws IOException {
410409

411410
try (IndexReader reader = DirectoryReader.open(writerWithMergePolicy)) {
412411
IndexSearcher searcher = new IndexSearcher(reader);
413-
assertEquals(6, reader.numDocs());
414-
assertEquals(6, searcher.count(new MatchAllDocsQuery()));
412+
assertEquals(5, reader.numDocs());
413+
assertEquals(5, searcher.count(new MatchAllDocsQuery()));
415414
}
416415

417416
writerWithMergePolicy.close();
@@ -445,16 +444,14 @@ public void testMergeOnCommitWithEventListener() throws IOException {
445444
.setIndexWriterEventListener(eventListener);
446445

447446
IndexWriter writerWithMergePolicy = new IndexWriter(dir, iwc);
448-
writerWithMergePolicy.commit(); // No changes. Commit doesn't trigger a merge.
449447

448+
// No changes. Refresh doesn't trigger a merge.
450449
DirectoryReader unmergedReader = DirectoryReader.open(writerWithMergePolicy);
451450
assertEquals(5, unmergedReader.leaves().size());
452451
unmergedReader.close();
453452

454-
TestIndexWriter.addDoc(writerWithMergePolicy);
455-
456453
assertFalse(eventListener.isEventsRecorded());
457-
writerWithMergePolicy.commit(); // Doc added, do merge on commit.
454+
writerWithMergePolicy.commit(); // Do merge on commit.
458455
assertEquals(1, writerWithMergePolicy.getSegmentCount()); //
459456
assertTrue(eventListener.isEventsRecorded());
460457

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ public void testUpdateAppliedOnlyOnce() throws IOException {
263263
newIndexWriterConfig()
264264
.setSoftDeletesField("_soft_deletes")
265265
.setMaxBufferedDocs(3) // make sure we write one segment
266+
.setMergePolicy(NoMergePolicy.INSTANCE) // prevent deletes from triggering merges
266267
.setRAMBufferSizeMB(IndexWriterConfig.DISABLE_AUTO_FLUSH));
267268
Document doc = new Document();
268269
doc.add(new StringField("id", "1", Field.Store.YES));
@@ -331,6 +332,7 @@ public void testResetOnUpdate() throws IOException {
331332
newIndexWriterConfig()
332333
.setSoftDeletesField("_soft_deletes")
333334
.setMaxBufferedDocs(3) // make sure we write one segment
335+
.setMergePolicy(NoMergePolicy.INSTANCE) // prevent deletes from triggering merges
334336
.setRAMBufferSizeMB(IndexWriterConfig.DISABLE_AUTO_FLUSH));
335337
Document doc = new Document();
336338
doc.add(new StringField("id", "1", Field.Store.YES));

lucene/test-framework/src/java/org/apache/lucene/tests/store/MockDirectoryWrapper.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import org.apache.lucene.index.IndexWriterConfig;
4747
import org.apache.lucene.index.NoDeletionPolicy;
4848
import org.apache.lucene.index.SegmentInfos;
49+
import org.apache.lucene.index.SerialMergeScheduler;
4950
import org.apache.lucene.store.AlreadyClosedException;
5051
import org.apache.lucene.store.ChecksumIndexInput;
5152
import org.apache.lucene.store.Directory;
@@ -970,7 +971,12 @@ public synchronized void close() throws IOException {
970971
DirectoryReader ir1 = DirectoryReader.open(this);
971972
int numDocs1 = ir1.numDocs();
972973
ir1.close();
973-
new IndexWriter(this, new IndexWriterConfig(null)).close();
974+
// Use a serial merge scheduler, otherwise merges may be scheduled on a different thread
975+
// and will deadlock since the lock on `this` is already taken by close(), so
976+
// createOutput() won't be able to take it.
977+
new IndexWriter(
978+
this, new IndexWriterConfig(null).setMergeScheduler(new SerialMergeScheduler()))
979+
.close();
974980
DirectoryReader ir2 = DirectoryReader.open(this);
975981
int numDocs2 = ir2.numDocs();
976982
ir2.close();

0 commit comments

Comments
 (0)