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;
+    }
+  }
 }