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 2010/12/08 03:02:03 UTC
svn commit: r1043277 - in /lucene/dev/trunk/lucene: CHANGES.txt
src/java/org/apache/lucene/index/DirectoryReader.java
src/test/org/apache/lucene/index/TestIndexWriterReader.java
Author: simonw
Date: Wed Dec 8 02:02:02 2010
New Revision: 1043277
URL: http://svn.apache.org/viewvc?rev=1043277&view=rev
Log:
LUCENE-2802: NRT DirectoryReader returned incorrect values from getVersion, isOptimized, getCommitUserData, getIndexCommit and isCurrent due to a mutable reference to the IndexWriters SegmentInfos
Modified:
lucene/dev/trunk/lucene/CHANGES.txt
lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/DirectoryReader.java
lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.java
Modified: lucene/dev/trunk/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/CHANGES.txt?rev=1043277&r1=1043276&r2=1043277&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/CHANGES.txt Wed Dec 8 02:02:02 2010
@@ -348,6 +348,11 @@ Bug fixes
with more document deletions is requested before a reader with fewer
deletions, provided they share some segments. (yonik)
+* LUCENE-2802: NRT DirectoryReader returned incorrect values from
+ getVersion, isOptimized, getCommitUserData, getIndexCommit and isCurrent due
+ to a mutable reference to the IndexWriters SegmentInfos.
+ (Simon Willnauer, Earwin Burrfoot)
+
======================= Lucene 3.x (not yet released) =======================
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/DirectoryReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/DirectoryReader.java?rev=1043277&r1=1043276&r2=1043277&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/DirectoryReader.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/DirectoryReader.java Wed Dec 8 02:02:02 2010
@@ -55,8 +55,7 @@ class DirectoryReader extends IndexReade
private IndexDeletionPolicy deletionPolicy;
private Lock writeLock;
- private SegmentInfos segmentInfos;
- private SegmentInfos segmentInfosStart;
+ private final SegmentInfos segmentInfos;
private boolean stale;
private final int termInfosIndexDivisor;
@@ -106,7 +105,6 @@ class DirectoryReader extends IndexReade
this.segmentInfos = sis;
this.deletionPolicy = deletionPolicy;
this.termInfosIndexDivisor = termInfosIndexDivisor;
-
if (codecs == null) {
this.codecs = CodecProvider.getDefault();
} else {
@@ -145,8 +143,7 @@ class DirectoryReader extends IndexReade
DirectoryReader(IndexWriter writer, SegmentInfos infos, int termInfosIndexDivisor, CodecProvider codecs) throws IOException {
this.directory = writer.getDirectory();
this.readOnly = true;
- segmentInfos = infos;
- segmentInfosStart = (SegmentInfos) infos.clone();
+ segmentInfos = (SegmentInfos) infos.clone();// make sure we clone otherwise we share mutable state with IW
this.termInfosIndexDivisor = termInfosIndexDivisor;
if (codecs == null) {
this.codecs = CodecProvider.getDefault();
@@ -860,7 +857,7 @@ class DirectoryReader extends IndexReade
// we loaded SegmentInfos from the directory
return SegmentInfos.readCurrentVersion(directory, codecs) == segmentInfos.getVersion();
} else {
- return writer.nrtIsCurrent(segmentInfosStart);
+ return writer.nrtIsCurrent(segmentInfos);
}
}
Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.java?rev=1043277&r1=1043276&r2=1043277&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.java Wed Dec 8 02:02:02 2010
@@ -175,6 +175,44 @@ public class TestIndexWriterReader exten
dir1.close();
}
+ public void testIsCurrent() throws IOException {
+ Directory dir = newDirectory();
+ IndexWriterConfig iwc = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer());
+
+ IndexWriter writer = new IndexWriter(dir, iwc);
+ Document doc = new Document();
+ doc.add(newField("field", "a b c", Field.Store.NO, Field.Index.ANALYZED));
+ writer.addDocument(doc);
+ writer.close();
+
+ iwc = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer());
+ writer = new IndexWriter(dir, iwc);
+ doc = new Document();
+ doc.add(newField("field", "a b c", Field.Store.NO, Field.Index.ANALYZED));
+ IndexReader nrtReader = writer.getReader();
+ assertTrue(nrtReader.isCurrent());
+ writer.addDocument(doc);
+ assertFalse(nrtReader.isCurrent()); // should see the changes
+ writer.optimize(); // make sure we don't have a merge going on
+ assertFalse(nrtReader.isCurrent());
+ nrtReader.close();
+
+ IndexReader dirReader = IndexReader.open(dir);
+ nrtReader = writer.getReader();
+
+ assertTrue(dirReader.isCurrent());
+ assertTrue(nrtReader.isCurrent()); // nothing was committed yet so we are still current
+ assertEquals(2, nrtReader.maxDoc()); // sees the actual document added
+ assertEquals(1, dirReader.maxDoc());
+ writer.close(); // close is actually a commit both should see the changes
+ assertTrue(nrtReader.isCurrent());
+ assertFalse(dirReader.isCurrent()); // this reader has been opened before the writer was closed / committed
+
+ dirReader.close();
+ nrtReader.close();
+ dir.close();
+ }
+
/**
* Test using IW.addIndexes
*