You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by si...@apache.org on 2020/06/27 22:10:00 UTC
[lucene-solr] branch jira/lucene-8962 updated: can it be that
simple?
This is an automated email from the ASF dual-hosted git repository.
simonw pushed a commit to branch jira/lucene-8962
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git
The following commit(s) were added to refs/heads/jira/lucene-8962 by this push:
new b479442 can it be that simple?
b479442 is described below
commit b479442c04849f374899ce057db5b5e8f1a9f4c5
Author: Simon Willnauer <si...@apache.org>
AuthorDate: Sat Jun 27 23:59:11 2020 +0200
can it be that simple?
---
.../java/org/apache/lucene/index/IndexWriter.java | 11 +++
.../java/org/apache/lucene/index/MergeTrigger.java | 4 ++
.../lucene/index/TestIndexWriterMergePolicy.java | 82 ++++++++++++++++------
3 files changed, 77 insertions(+), 20 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 6c97794..cf1bcba 100644
--- a/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
@@ -573,6 +573,16 @@ public class IndexWriter implements Closeable, TwoPhaseCommit, Accountable,
if (applyAllDeletes) {
applyAllDeletesAndUpdates();
}
+ final long maxCommitMergeWaitMillis = config.getMaxCommitMergeWaitMillis();
+ if (maxCommitMergeWaitMillis > 0) {
+ MergePolicy.MergeSpecification onCommitMerges = updatePendingMerges(config.getMergePolicy(),
+ MergeTrigger.GET_READER, UNBOUNDED_MAX_MERGE_SEGMENTS);
+ if (onCommitMerges != null) {
+ mergeScheduler.merge(mergeSource, MergeTrigger.GET_READER);
+ onCommitMerges.await(maxCommitMergeWaitMillis, TimeUnit.MILLISECONDS);
+ }
+ }
+
synchronized(this) {
@@ -2168,6 +2178,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit, Accountable,
}
} else {
switch (trigger) {
+ case GET_READER:
case COMMIT:
spec = mergePolicy.findFullFlushMerges(trigger, segmentInfos, this);
break;
diff --git a/lucene/core/src/java/org/apache/lucene/index/MergeTrigger.java b/lucene/core/src/java/org/apache/lucene/index/MergeTrigger.java
index 01a6b15..f11493f 100644
--- a/lucene/core/src/java/org/apache/lucene/index/MergeTrigger.java
+++ b/lucene/core/src/java/org/apache/lucene/index/MergeTrigger.java
@@ -53,4 +53,8 @@ public enum MergeTrigger {
* Merge was triggered on commit.
*/
COMMIT,
+ /**
+ * Merge was triggered on opening NRT readers.
+ */
+ GET_READER,
}
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterMergePolicy.java b/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterMergePolicy.java
index 12eeb9d..315ae14 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterMergePolicy.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterMergePolicy.java
@@ -38,26 +38,7 @@ import org.apache.lucene.util.LuceneTestCase;
public class TestIndexWriterMergePolicy extends LuceneTestCase {
- private static final MergePolicy MERGE_ON_COMMIT_POLICY = new LogDocMergePolicy() {
- @Override
- public MergeSpecification findFullFlushMerges(MergeTrigger mergeTrigger, SegmentInfos segmentInfos, MergeContext mergeContext) {
- // Optimize down to a single segment on commit
- if (mergeTrigger == MergeTrigger.COMMIT && segmentInfos.size() > 1) {
- List<SegmentCommitInfo> nonMergingSegments = new ArrayList<>();
- for (SegmentCommitInfo sci : segmentInfos) {
- if (mergeContext.getMergingSegments().contains(sci) == false) {
- nonMergingSegments.add(sci);
- }
- }
- if (nonMergingSegments.size() > 1) {
- MergeSpecification mergeSpecification = new MergeSpecification();
- mergeSpecification.add(new OneMerge(nonMergingSegments));
- return mergeSpecification;
- }
- }
- return null;
- }
- };
+ private static final MergePolicy MERGE_ON_COMMIT_POLICY = new MergeOnXMergePolicy(MergeTrigger.COMMIT);
// Test the normal case
public void testNormalCase() throws IOException {
@@ -532,4 +513,65 @@ public class TestIndexWriterMergePolicy extends LuceneTestCase {
}
}
}
+
+ // Test basic semantics of merge on getReader
+ public void testMergeOnGetReader() throws IOException {
+ Directory dir = newDirectory();
+
+ IndexWriter firstWriter = new IndexWriter(dir, newIndexWriterConfig(new MockAnalyzer(random()))
+ .setMergePolicy(NoMergePolicy.INSTANCE));
+ for (int i = 0; i < 5; i++) {
+ TestIndexWriter.addDoc(firstWriter);
+ firstWriter.flush();
+ }
+ DirectoryReader firstReader = DirectoryReader.open(firstWriter);
+ assertEquals(5, firstReader.leaves().size());
+ firstReader.close();
+ firstWriter.close(); // When this writer closes, it does not merge on commit.
+
+ IndexWriterConfig iwc = newIndexWriterConfig(new MockAnalyzer(random()))
+ .setMergePolicy(new MergeOnXMergePolicy(MergeTrigger.GET_READER)).setMaxCommitMergeWaitMillis(Integer.MAX_VALUE);
+
+ IndexWriter writerWithMergePolicy = new IndexWriter(dir, iwc);
+
+ try (DirectoryReader unmergedReader = DirectoryReader.open(dir)) { // No changes. GetReader doesn't trigger a merge.
+ assertEquals(5, unmergedReader.leaves().size());
+ }
+
+ TestIndexWriter.addDoc(writerWithMergePolicy);
+ try (DirectoryReader mergedReader = writerWithMergePolicy.getReader()) {
+ // Doc added, do merge on getReader.
+ assertEquals(1, mergedReader.leaves().size());
+ }
+
+ writerWithMergePolicy.close();
+ dir.close();
+ }
+
+ private static class MergeOnXMergePolicy extends LogDocMergePolicy {
+ private final MergeTrigger trigger;
+
+ private MergeOnXMergePolicy(MergeTrigger trigger) {
+ this.trigger = trigger;
+ }
+
+ @Override
+ public MergeSpecification findFullFlushMerges(MergeTrigger mergeTrigger, SegmentInfos segmentInfos, MergeContext mergeContext) {
+ // Optimize down to a single segment on commit
+ if (mergeTrigger == trigger && segmentInfos.size() > 1) {
+ List<SegmentCommitInfo> nonMergingSegments = new ArrayList<>();
+ for (SegmentCommitInfo sci : segmentInfos) {
+ if (mergeContext.getMergingSegments().contains(sci) == false) {
+ nonMergingSegments.add(sci);
+ }
+ }
+ if (nonMergingSegments.size() > 1) {
+ MergeSpecification mergeSpecification = new MergeSpecification();
+ mergeSpecification.add(new OneMerge(nonMergingSegments));
+ return mergeSpecification;
+ }
+ }
+ return null;
+ }
+ }
}