You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by us...@apache.org on 2011/12/12 00:39:21 UTC

svn commit: r1213110 - in /lucene/dev/branches/branch_3x: ./ lucene/ lucene/CHANGES.txt lucene/src/java/org/apache/lucene/index/MultiReader.java

Author: uschindler
Date: Sun Dec 11 23:39:20 2011
New Revision: 1213110

URL: http://svn.apache.org/viewvc?rev=1213110&view=rev
Log:
Merged revision(s) 1213106 from lucene/dev/trunk:
LUCENE-3641: Fixed MultiReader to correctly propagate readerFinishedListeners to clones/reopened readers

Modified:
    lucene/dev/branches/branch_3x/   (props changed)
    lucene/dev/branches/branch_3x/lucene/   (props changed)
    lucene/dev/branches/branch_3x/lucene/CHANGES.txt
    lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/MultiReader.java

Modified: lucene/dev/branches/branch_3x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/CHANGES.txt?rev=1213110&r1=1213109&r2=1213110&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_3x/lucene/CHANGES.txt Sun Dec 11 23:39:20 2011
@@ -70,6 +70,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)

Modified: lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/MultiReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/MultiReader.java?rev=1213110&r1=1213109&r2=1213110&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/MultiReader.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/MultiReader.java Sun Dec 11 23:39:20 2011
@@ -37,7 +37,7 @@ import org.apache.lucene.util.MapBackedS
 public class MultiReader extends IndexReader implements Cloneable {
   protected final IndexReader[] subReaders;
   protected final int[] starts;                           // 1st docno for each segment
-  private boolean[] decrefOnClose;                // remember which subreaders to decRef on close
+  private final boolean[] decrefOnClose;                // remember which subreaders to decRef on close
   private final Map<String,byte[]> normsCache = new HashMap<String,byte[]>();
   private int maxDoc = 0;
   private int numDocs = -1;
@@ -84,6 +84,23 @@ public class MultiReader extends IndexRe
     readerFinishedListeners = new MapBackedSet<ReaderFinishedListener>(new ConcurrentHashMap<ReaderFinishedListener,Boolean>());
   }
   
+  // used only by openIfChaged
+  private MultiReader(IndexReader[] subReaders, boolean[] decrefOnClose,
+                      Collection<ReaderFinishedListener> readerFinishedListeners)
+                      throws IOException {
+    this.subReaders =  subReaders.clone();
+    this.decrefOnClose = decrefOnClose;
+    this.readerFinishedListeners = readerFinishedListeners;
+    starts = new int[subReaders.length + 1];    // build starts array
+    for (int i = 0; i < subReaders.length; i++) {
+      starts[i] = maxDoc;
+      maxDoc += subReaders[i].maxDoc();      // compute maxDocs
+      if (subReaders[i].hasDeletions())
+        hasDeletions = true;
+    }
+    starts[subReaders.length] = maxDoc;
+  }
+
   @Override
   protected synchronized IndexReader doOpenIfChanged() throws CorruptIndexException, IOException {
     return doReopen(false);
@@ -172,9 +189,7 @@ public class MultiReader extends IndexRe
           newDecrefOnClose[i] = true;
         }
       }
-      MultiReader mr = new MultiReader(newSubReaders);
-      mr.decrefOnClose = newDecrefOnClose;
-      return mr;
+      return new MultiReader(newSubReaders, newDecrefOnClose, readerFinishedListeners);
     } else {
       return null;
     }