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. */