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 14:48:26 UTC
svn commit: r1043418 - in /lucene/dev/branches/branch_3x/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 13:48:25 2010
New Revision: 1043418
URL: http://svn.apache.org/viewvc?rev=1043418&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/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/DirectoryReader.java
lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.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=1043418&r1=1043417&r2=1043418&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_3x/lucene/CHANGES.txt Wed Dec 8 13:48:25 2010
@@ -275,6 +275,11 @@ Bug fixes
* LUCENE-2732: Fix charset problems in XML loading in
HyphenationCompoundWordTokenFilter. (Uwe Schinder)
+* 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)
+
New features
* LUCENE-2128: Parallelized fetching document frequencies during weight
Modified: lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/DirectoryReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/DirectoryReader.java?rev=1043418&r1=1043417&r2=1043418&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/DirectoryReader.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/DirectoryReader.java Wed Dec 8 13:48:25 2010
@@ -49,8 +49,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;
@@ -90,7 +89,6 @@ class DirectoryReader extends IndexReade
this.segmentInfos = sis;
this.deletionPolicy = deletionPolicy;
this.termInfosIndexDivisor = termInfosIndexDivisor;
-
// To reduce the chance of hitting FileNotFound
// (and having to retry), we open segments in
// reverse because IndexWriter merges & deletes
@@ -123,8 +121,7 @@ class DirectoryReader extends IndexReade
DirectoryReader(IndexWriter writer, SegmentInfos infos, int termInfosIndexDivisor) 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;
// IndexWriter synchronizes externally before calling
@@ -840,7 +837,7 @@ class DirectoryReader extends IndexReade
// we loaded SegmentInfos from the directory
return SegmentInfos.readCurrentVersion(directory) == segmentInfos.getVersion();
} else {
- return writer.nrtIsCurrent(segmentInfosStart);
+ return writer.nrtIsCurrent(segmentInfos);
}
}
Modified: lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.java?rev=1043418&r1=1043417&r2=1043418&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.java Wed Dec 8 13:48:25 2010
@@ -170,6 +170,44 @@ public class TestIndexWriterReader exten
dir1.close();
}
+ public void testIsCurrent() throws IOException {
+ Directory dir = newDirectory();
+ IndexWriterConfig iwc = newIndexWriterConfig(TEST_VERSION_CURRENT, new WhitespaceAnalyzer(TEST_VERSION_CURRENT));
+
+ 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 WhitespaceAnalyzer(TEST_VERSION_CURRENT));
+ 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
*