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/24 20:11:06 UTC

[lucene-solr] 01/02: Merge branch 'master' into jira/lucene-8962

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

commit 09187e8b305c195e57ff81a174cefa548669c70f
Merge: 2aa937e f47de19
Author: Simon Willnauer <si...@apache.org>
AuthorDate: Wed Jun 24 21:33:40 2020 +0200

    Merge branch 'master' into jira/lucene-8962

 .../java/org/apache/lucene/index/IndexWriter.java  | 48 ++++++++++++----------
 .../java/org/apache/lucene/index/MergePolicy.java  | 10 ++---
 .../org/apache/lucene/index/TestMergePolicy.java   |  1 -
 .../src/java/org/apache/solr/search/JoinQuery.java |  2 +-
 4 files changed, 32 insertions(+), 29 deletions(-)

diff --cc lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
index 911852a,fd17220..44d65c9
--- a/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
@@@ -4361,30 -4286,32 +4362,35 @@@ public class IndexWriter implements Clo
    }
  
    @SuppressWarnings("try")
 -  private synchronized void closeMergeReaders(MergePolicy.OneMerge merge, boolean suppressExceptions) throws IOException {
 +  private synchronized void closeMergeReaders(MergePolicy.OneMerge merge, boolean suppressExceptions, boolean droppedSegment) throws IOException {
-     final boolean drop = suppressExceptions == false;
-     try {
-       // first call mergeFinished before we potentially drop the reader and the last reference.
-       merge.mergeFinished(suppressExceptions == false, droppedSegment);
-     } finally {
-       IOUtils.applyToAll(merge.clearMergeReader(), mr -> {
-         final SegmentReader sr = mr.reader;
-         final ReadersAndUpdates rld = getPooledInstance(sr.getOriginalSegmentInfo(), false);
-         // We still hold a ref so it should not have been removed:
-         assert rld != null;
-         if (drop) {
-           rld.dropChanges();
-         } else {
-           rld.dropMergingUpdates();
-         }
-         rld.release(sr);
-         release(rld);
-         if (drop) {
-           readerPool.drop(rld.info);
-         }
-       });
+     if (merge.hasFinished() == false) {
+       final boolean drop = suppressExceptions == false;
 -      try (Closeable finalizer = () -> merge.mergeFinished(suppressExceptions == false)) {
 -        IOUtils.applyToAll(merge.readers, sr -> {
++      try {
++        // first call mergeFinished before we potentially drop the reader and the last reference.
++        merge.mergeFinished(suppressExceptions == false, droppedSegment);
++      } finally {
++        IOUtils.applyToAll(merge.clearMergeReader(), mr -> {
++          final SegmentReader sr = mr.reader;
+           final ReadersAndUpdates rld = getPooledInstance(sr.getOriginalSegmentInfo(), false);
+           // We still hold a ref so it should not have been removed:
+           assert rld != null;
+           if (drop) {
+             rld.dropChanges();
+           } else {
+             rld.dropMergingUpdates();
+           }
+           rld.release(sr);
+           release(rld);
+           if (drop) {
+             readerPool.drop(rld.info);
+           }
+         });
 -      } finally {
 -        Collections.fill(merge.readers, null);
+       }
+     } else {
 -      assert merge.readers.stream().filter(Objects::nonNull).count() == 0 : "we are done but still have readers: " + merge.readers;
++      assert merge.getMergeReader().isEmpty() : "we are done but still have readers: " + merge.getMergeReader();
+       assert suppressExceptions : "can't be done and not suppressing exceptions";
      }
 +
    }
  
    private void countSoftDeletes(CodecReader reader, Bits wrappedLiveDocs, Bits hardLiveDocs, Counter softDeleteCounter,
diff --cc lucene/core/src/java/org/apache/lucene/index/MergePolicy.java
index 16decf6,91d2302..60ad004
--- a/lucene/core/src/java/org/apache/lucene/index/MergePolicy.java
+++ b/lucene/core/src/java/org/apache/lucene/index/MergePolicy.java
@@@ -256,15 -254,11 +256,13 @@@ public abstract class MergePolicy 
      }
  
      /** Called by {@link IndexWriter} after the merge is done and all readers have been closed.
 -     * @param success true iff the merge finished successfully ie. was committed */
 -    public void mergeFinished(boolean success) throws IOException {
 +     * @param success true iff the merge finished successfully ie. was committed
 +     * @param segmentDropped true iff the merged segment was dropped since it was fully deleted
 +     */
 +    public void mergeFinished(boolean success, boolean segmentDropped) throws IOException {
-       mergeCompleted.complete(success);
-       // https://issues.apache.org/jira/browse/LUCENE-9408
-       // if (mergeCompleted.complete(success) == false) {
-       //   throw new IllegalStateException("merge has already finished");
-       // }
+       if (mergeCompleted.complete(success) == false) {
+         throw new IllegalStateException("merge has already finished");
+       }
      }
  
      /** Wrap the reader in order to add/remove information to the merged segment. */