diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt index f8d0c789630..754b127d4f7 100644 --- a/lucene/CHANGES.txt +++ b/lucene/CHANGES.txt @@ -724,6 +724,9 @@ Bug fixes In ParallelReader the bug was not existent, but the implementation method was also made private. (Uwe Schindler) +* LUCENE-3641: Fixed MultiReader to correctly propagate readerFinishedListeners + to clones/reopened readers. (Uwe Schindler) + Documentation * LUCENE-3597: Fixed incorrect grouping documentation. (Martijn van Groningen, Robert Muir) diff --git a/lucene/src/java/org/apache/lucene/index/MultiReader.java b/lucene/src/java/org/apache/lucene/index/MultiReader.java index 9ba66635a79..8fc749d98e5 100644 --- a/lucene/src/java/org/apache/lucene/index/MultiReader.java +++ b/lucene/src/java/org/apache/lucene/index/MultiReader.java @@ -18,6 +18,7 @@ package org.apache.lucene.index; */ import java.io.IOException; +import java.util.Collection; import java.util.concurrent.ConcurrentHashMap; import org.apache.lucene.util.Bits; @@ -27,7 +28,7 @@ import org.apache.lucene.util.MapBackedSet; /** An IndexReader which reads multiple indexes, appending * their content. */ public class MultiReader extends BaseMultiReader { - private boolean[] decrefOnClose; // remember which subreaders to decRef on close + private final boolean[] decrefOnClose; // remember which subreaders to decRef on close /** *

Construct a MultiReader aggregating the named set of (sub)readers. @@ -46,7 +47,7 @@ public class MultiReader extends BaseMultiReader { */ public MultiReader(IndexReader[] subReaders, boolean closeSubReaders) throws IOException { super(subReaders.clone()); - this.readerFinishedListeners = new MapBackedSet(new ConcurrentHashMap()); + readerFinishedListeners = new MapBackedSet(new ConcurrentHashMap()); decrefOnClose = new boolean[subReaders.length]; for (int i = 0; i < subReaders.length; i++) { if (!closeSubReaders) { @@ -57,6 +58,15 @@ public class MultiReader extends BaseMultiReader { } } } + + // used only by openIfChaged + private MultiReader(IndexReader[] subReaders, boolean[] decrefOnClose, + Collection readerFinishedListeners) + throws IOException { + super(subReaders); + this.decrefOnClose = decrefOnClose; + this.readerFinishedListeners = readerFinishedListeners; + } @Override protected synchronized IndexReader doOpenIfChanged() throws CorruptIndexException, IOException { @@ -117,9 +127,7 @@ public class MultiReader extends BaseMultiReader { newDecrefOnClose[i] = true; } } - MultiReader mr = new MultiReader(newSubReaders); - mr.decrefOnClose = newDecrefOnClose; - return mr; + return new MultiReader(newSubReaders, newDecrefOnClose, readerFinishedListeners); } else { return null; }