Skip to content

Commit

Permalink
Run merge-on-full-flush even though no changes got flushed. (#12549)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
jpountz committed Oct 24, 2023
1 parent 5461d1a commit 71c4ea7
Show file tree
Hide file tree
Showing 6 changed files with 14 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3680,7 +3680,7 @@ private long prepareCommitInternal() throws IOException {
// merge completes which would otherwise have
// removed the files we are now syncing.
deleter.incRef(toCommit.files(false));
if (anyChanges && maxCommitMergeWaitMillis > 0) {
if (maxCommitMergeWaitMillis > 0) {
// we can safely call preparePointInTimeMerge since writeReaderPool(true) above
// wrote all
// necessary files to disk and checkpointed them.
Expand Down Expand Up @@ -4232,7 +4232,6 @@ private boolean doFlush(boolean applyAllDeletes) throws IOException {
flushSuccess = true;
} finally {
assert Thread.holdsLock(fullFlushLock);
;
docWriter.finishFullFlush(flushSuccess);
processEvents(false);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -654,7 +654,8 @@ public void testOpenIfChangedNRTToCommit() throws Exception {
public void testOverDecRefDuringReopen() throws Exception {
MockDirectoryWrapper dir = newMockDirectory();

IndexWriterConfig iwc = new IndexWriterConfig(new MockAnalyzer(random()));
IndexWriterConfig iwc =
new IndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(NoMergePolicy.INSTANCE);
iwc.setCodec(TestUtil.getDefaultCodec());
IndexWriter w = new IndexWriter(dir, iwc);
Document doc = new Document();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -519,11 +519,10 @@ public void testFlushWithNoMerging() throws IOException {
doc.add(newField("field", "aaa", customType));
for (int i = 0; i < 19; i++) writer.addDocument(doc);
writer.flush(false, true);
writer.close();
SegmentInfos sis = SegmentInfos.readLatestCommit(dir);
// Since we flushed w/o allowing merging we should now
// have 10 segments
assertEquals(10, sis.size());
assertEquals(10, writer.getSegmentCount());
writer.close();
dir.close();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1314,7 +1314,7 @@ public void testTryDeleteDocument() throws Exception {
w.addDocument(doc);
w.close();

iwc = new IndexWriterConfig(new MockAnalyzer(random()));
iwc = new IndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(NoMergePolicy.INSTANCE);
iwc.setOpenMode(IndexWriterConfig.OpenMode.APPEND);
w = new IndexWriter(d, iwc);
IndexReader r = DirectoryReader.open(w, false, false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -394,14 +394,13 @@ public void testMergeOnCommit() throws IOException {
.setMaxFullFlushMergeWaitMillis(Integer.MAX_VALUE);

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

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

TestIndexWriter.addDoc(writerWithMergePolicy);
writerWithMergePolicy.commit(); // Doc added, do merge on commit.
writerWithMergePolicy.commit(); // Do merge on commit.
assertEquals(1, writerWithMergePolicy.getSegmentCount()); //

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

try (IndexReader reader = DirectoryReader.open(writerWithMergePolicy)) {
IndexSearcher searcher = new IndexSearcher(reader);
assertEquals(6, reader.numDocs());
assertEquals(6, searcher.count(new MatchAllDocsQuery()));
assertEquals(5, reader.numDocs());
assertEquals(5, searcher.count(new MatchAllDocsQuery()));
}

writerWithMergePolicy.close();
Expand Down Expand Up @@ -445,16 +444,14 @@ public void testMergeOnCommitWithEventListener() throws IOException {
.setIndexWriterEventListener(eventListener);

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

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

TestIndexWriter.addDoc(writerWithMergePolicy);

assertFalse(eventListener.isEventsRecorded());
writerWithMergePolicy.commit(); // Doc added, do merge on commit.
writerWithMergePolicy.commit(); // Do merge on commit.
assertEquals(1, writerWithMergePolicy.getSegmentCount()); //
assertTrue(eventListener.isEventsRecorded());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,7 @@ public void testUpdateAppliedOnlyOnce() throws IOException {
newIndexWriterConfig()
.setSoftDeletesField("_soft_deletes")
.setMaxBufferedDocs(3) // make sure we write one segment
.setMergePolicy(NoMergePolicy.INSTANCE) // prevent deletes from triggering merges
.setRAMBufferSizeMB(IndexWriterConfig.DISABLE_AUTO_FLUSH));
Document doc = new Document();
doc.add(new StringField("id", "1", Field.Store.YES));
Expand Down Expand Up @@ -331,6 +332,7 @@ public void testResetOnUpdate() throws IOException {
newIndexWriterConfig()
.setSoftDeletesField("_soft_deletes")
.setMaxBufferedDocs(3) // make sure we write one segment
.setMergePolicy(NoMergePolicy.INSTANCE) // prevent deletes from triggering merges
.setRAMBufferSizeMB(IndexWriterConfig.DISABLE_AUTO_FLUSH));
Document doc = new Document();
doc.add(new StringField("id", "1", Field.Store.YES));
Expand Down

0 comments on commit 71c4ea7

Please sign in to comment.