You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@lucene.apache.org by mi...@apache.org on 2009/01/30 12:12:48 UTC
svn commit: r739238 [2/2] - in /lucene/java/trunk: ./
src/java/org/apache/lucene/index/ src/java/org/apache/lucene/store/
src/java/org/apache/lucene/util/ src/test/org/apache/lucene/index/
Modified: lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexReaderReopen.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexReaderReopen.java?rev=739238&r1=739237&r2=739238&view=diff
==============================================================================
--- lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexReaderReopen.java (original)
+++ lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexReaderReopen.java Fri Jan 30 11:12:48 2009
@@ -40,16 +40,16 @@
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
-import org.apache.lucene.store.RAMDirectory;
+import org.apache.lucene.store.MockRAMDirectory;
import org.apache.lucene.store.AlreadyClosedException;
import org.apache.lucene.util.LuceneTestCase;
public class TestIndexReaderReopen extends LuceneTestCase {
private File indexDir;
-
+
public void testReopen() throws Exception {
- final Directory dir1 = new RAMDirectory();
+ final Directory dir1 = new MockRAMDirectory();
createIndex(dir1, false);
performDefaultTests(new TestReopen() {
@@ -63,8 +63,9 @@
}
});
+ dir1.close();
- final Directory dir2 = new RAMDirectory();
+ final Directory dir2 = new MockRAMDirectory();
createIndex(dir2, true);
performDefaultTests(new TestReopen() {
@@ -78,12 +79,13 @@
}
});
+ dir2.close();
}
public void testParallelReaderReopen() throws Exception {
- final Directory dir1 = new RAMDirectory();
+ final Directory dir1 = new MockRAMDirectory();
createIndex(dir1, true);
- final Directory dir2 = new RAMDirectory();
+ final Directory dir2 = new MockRAMDirectory();
createIndex(dir2, true);
performDefaultTests(new TestReopen() {
@@ -101,10 +103,12 @@
}
});
+ dir1.close();
+ dir2.close();
- final Directory dir3 = new RAMDirectory();
+ final Directory dir3 = new MockRAMDirectory();
createIndex(dir3, true);
- final Directory dir4 = new RAMDirectory();
+ final Directory dir4 = new MockRAMDirectory();
createIndex(dir4, true);
performTestsWithExceptionInReopen(new TestReopen() {
@@ -118,11 +122,15 @@
ParallelReader pr = new ParallelReader();
pr.add(IndexReader.open(dir3));
pr.add(IndexReader.open(dir4));
+ // Does not implement reopen, so
+ // hits exception:
pr.add(new FilterIndexReader(IndexReader.open(dir3)));
return pr;
}
});
+ dir3.close();
+ dir4.close();
}
// LUCENE-1228: IndexWriter.commit() does not update the index version
@@ -133,17 +141,20 @@
public void testCommitReopenFS () throws IOException {
Directory dir = FSDirectory.getDirectory(indexDir);
doTestReopenWithCommit(dir, true);
+ dir.close();
}
public void testCommitRecreateFS () throws IOException {
Directory dir = FSDirectory.getDirectory(indexDir);
doTestReopenWithCommit(dir, false);
+ dir.close();
}
public void testCommitReopenRAM () throws IOException {
- Directory dir = new RAMDirectory();
+ Directory dir = new MockRAMDirectory();
doTestReopenWithCommit(dir, true);
+ dir.close();
}
public void testCommitRecreateRAM () throws IOException {
- Directory dir = new RAMDirectory();
+ Directory dir = new MockRAMDirectory();
doTestReopenWithCommit(dir, false);
}
@@ -188,9 +199,11 @@
}
public void testMultiReaderReopen() throws Exception {
- final Directory dir1 = new RAMDirectory();
+
+ final Directory dir1 = new MockRAMDirectory();
createIndex(dir1, true);
- final Directory dir2 = new RAMDirectory();
+
+ final Directory dir2 = new MockRAMDirectory();
createIndex(dir2, true);
performDefaultTests(new TestReopen() {
@@ -207,10 +220,14 @@
}
});
+
+ dir1.close();
+ dir2.close();
- final Directory dir3 = new RAMDirectory();
+ final Directory dir3 = new MockRAMDirectory();
createIndex(dir3, true);
- final Directory dir4 = new RAMDirectory();
+
+ final Directory dir4 = new MockRAMDirectory();
createIndex(dir4, true);
performTestsWithExceptionInReopen(new TestReopen() {
@@ -224,23 +241,26 @@
return new MultiReader(new IndexReader[]
{IndexReader.open(dir3),
IndexReader.open(dir4),
+ // Does not implement reopen, so
+ // hits exception:
new FilterIndexReader(IndexReader.open(dir3))});
}
});
-
+ dir3.close();
+ dir4.close();
}
public void testMixedReaders() throws Exception {
- final Directory dir1 = new RAMDirectory();
+ final Directory dir1 = new MockRAMDirectory();
createIndex(dir1, true);
- final Directory dir2 = new RAMDirectory();
+ final Directory dir2 = new MockRAMDirectory();
createIndex(dir2, true);
- final Directory dir3 = new RAMDirectory();
+ final Directory dir3 = new MockRAMDirectory();
createIndex(dir3, false);
- final Directory dir4 = new RAMDirectory();
+ final Directory dir4 = new MockRAMDirectory();
createIndex(dir4, true);
- final Directory dir5 = new RAMDirectory();
+ final Directory dir5 = new MockRAMDirectory();
createIndex(dir5, false);
performDefaultTests(new TestReopen() {
@@ -263,33 +283,39 @@
pr, mr, IndexReader.open(dir5)});
}
});
+ dir1.close();
+ dir2.close();
+ dir3.close();
+ dir4.close();
+ dir5.close();
}
-
private void performDefaultTests(TestReopen test) throws Exception {
+
IndexReader index1 = test.openReader();
IndexReader index2 = test.openReader();
TestIndexReader.assertIndexEquals(index1, index2);
-
+
// verify that reopen() does not return a new reader instance
// in case the index has no changes
ReaderCouple couple = refreshReader(index2, false);
assertTrue(couple.refreshedReader == index2);
couple = refreshReader(index2, test, 0, true);
+ index1.close();
index1 = couple.newReader;
+
IndexReader index2_refreshed = couple.refreshedReader;
index2.close();
// test if refreshed reader and newly opened reader return equal results
TestIndexReader.assertIndexEquals(index1, index2_refreshed);
-
- index1.close();
+
index2_refreshed.close();
assertReaderClosed(index2, true, true);
assertReaderClosed(index2_refreshed, true, true);
-
+
index2 = test.openReader();
for (int i = 1; i < 4; i++) {
@@ -313,7 +339,7 @@
public void testReferenceCounting() throws IOException {
for (int mode = 0; mode < 4; mode++) {
- Directory dir1 = new RAMDirectory();
+ Directory dir1 = new MockRAMDirectory();
createIndex(dir1, true);
IndexReader reader0 = IndexReader.open(dir1);
@@ -408,21 +434,24 @@
assertReaderClosed(reader1, true, true);
assertReaderClosed(reader2, true, true);
assertReaderClosed(reader3, true, true);
+
+ dir1.close();
}
}
public void testReferenceCountingMultiReader() throws IOException {
for (int mode = 0; mode <=1; mode++) {
- Directory dir1 = new RAMDirectory();
+ Directory dir1 = new MockRAMDirectory();
createIndex(dir1, false);
- Directory dir2 = new RAMDirectory();
+ Directory dir2 = new MockRAMDirectory();
createIndex(dir2, true);
IndexReader reader1 = IndexReader.open(dir1);
assertRefCountEquals(1, reader1);
-
- IndexReader multiReader1 = new MultiReader(new IndexReader[] {reader1, IndexReader.open(dir2)}, (mode == 0));
+
+ IndexReader initReader2 = IndexReader.open(dir2);
+ IndexReader multiReader1 = new MultiReader(new IndexReader[] {reader1, initReader2}, (mode == 0));
modifyIndex(0, dir2);
assertRefCountEquals(1 + mode, reader1);
@@ -433,6 +462,10 @@
modifyIndex(0, dir1);
IndexReader reader2 = reader1.reopen();
assertRefCountEquals(3 + mode, reader1);
+
+ if (mode == 1) {
+ initReader2.close();
+ }
modifyIndex(1, dir1);
IndexReader reader3 = reader2.reopen();
@@ -444,6 +477,10 @@
multiReader1.close();
assertRefCountEquals(3 + mode, reader1);
+
+ if (mode == 1) {
+ initReader2.close();
+ }
reader1.close();
assertRefCountEquals(3, reader1);
@@ -468,15 +505,17 @@
reader3.close();
assertRefCountEquals(0, reader1);
assertReaderClosed(reader1, true, true);
+ dir1.close();
+ dir2.close();
}
}
public void testReferenceCountingParallelReader() throws IOException {
for (int mode = 0; mode <=1; mode++) {
- Directory dir1 = new RAMDirectory();
+ Directory dir1 = new MockRAMDirectory();
createIndex(dir1, false);
- Directory dir2 = new RAMDirectory();
+ Directory dir2 = new MockRAMDirectory();
createIndex(dir2, true);
IndexReader reader1 = IndexReader.open(dir1);
@@ -484,7 +523,8 @@
ParallelReader parallelReader1 = new ParallelReader(mode == 0);
parallelReader1.add(reader1);
- parallelReader1.add(IndexReader.open(dir2));
+ IndexReader initReader2 = IndexReader.open(dir2);
+ parallelReader1.add(initReader2);
modifyIndex(1, dir2);
assertRefCountEquals(1 + mode, reader1);
@@ -496,6 +536,10 @@
modifyIndex(0, dir2);
IndexReader reader2 = reader1.reopen();
assertRefCountEquals(3 + mode, reader1);
+
+ if (mode == 1) {
+ initReader2.close();
+ }
modifyIndex(4, dir1);
IndexReader reader3 = reader2.reopen();
@@ -507,6 +551,10 @@
parallelReader1.close();
assertRefCountEquals(3 + mode, reader1);
+
+ if (mode == 1) {
+ initReader2.close();
+ }
reader1.close();
assertRefCountEquals(3, reader1);
@@ -531,12 +579,15 @@
reader3.close();
assertRefCountEquals(0, reader1);
assertReaderClosed(reader1, true, true);
+
+ dir1.close();
+ dir2.close();
}
}
public void testNormsRefCounting() throws IOException {
- Directory dir1 = new RAMDirectory();
+ Directory dir1 = new MockRAMDirectory();
createIndex(dir1, false);
SegmentReader reader1 = (SegmentReader) IndexReader.open(dir1);
@@ -554,25 +605,31 @@
modifier = IndexReader.open(dir1);
modifier.deleteDocument(2);
modifier.close();
- SegmentReader reader4 = (SegmentReader) reader3.reopen();
+ SegmentReader reader4 = (SegmentReader) reader3.reopen();
modifier = IndexReader.open(dir1);
modifier.deleteDocument(3);
modifier.close();
+
SegmentReader reader5 = (SegmentReader) reader3.reopen();
// Now reader2-reader5 references reader1. reader1 and reader2
// share the same norms. reader3, reader4, reader5 also share norms.
assertRefCountEquals(5, reader1);
assertFalse(reader1.normsClosed());
+
reader1.close();
+
assertRefCountEquals(4, reader1);
assertFalse(reader1.normsClosed());
+
reader2.close();
assertRefCountEquals(3, reader1);
+
// now the norms for field1 and field2 should be closed
assertTrue(reader1.normsClosed("field1"));
assertTrue(reader1.normsClosed("field2"));
+
// but the norms for field3 and field4 should still be open
assertFalse(reader1.normsClosed("field3"));
assertFalse(reader1.normsClosed("field4"));
@@ -593,6 +650,8 @@
// the norms that those three readers shared should be
// closed as well
assertTrue(reader3.normsClosed());
+
+ dir1.close();
}
private void performTestsWithExceptionInReopen(TestReopen test) throws Exception {
@@ -610,10 +669,13 @@
// index2 should still be usable and unaffected by the failed reopen() call
TestIndexReader.assertIndexEquals(index1, index2);
+
+ index1.close();
+ index2.close();
}
public void testThreadSafety() throws Exception {
- final Directory dir = new RAMDirectory();
+ final Directory dir = new MockRAMDirectory();
final int n = 150;
IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(), IndexWriter.MaxFieldLength.LIMITED);
@@ -779,6 +841,8 @@
assertReaderClosed(reader, true, true);
assertReaderClosed(firstReader, true, true);
+
+ dir.close();
}
private static class ReaderCouple {
@@ -829,7 +893,7 @@
return refreshReader(reader, null, -1, hasChanges);
}
- private ReaderCouple refreshReader(IndexReader reader, TestReopen test, int modify, boolean hasChanges) throws IOException {
+ ReaderCouple refreshReader(IndexReader reader, TestReopen test, int modify, boolean hasChanges) throws IOException {
synchronized (createReaderMutex) {
IndexReader r = null;
if (test != null) {
@@ -837,7 +901,16 @@
r = test.openReader();
}
- IndexReader refreshed = reader.reopen();
+ IndexReader refreshed = null;
+ try {
+ refreshed = reader.reopen();
+ } finally {
+ if (refreshed == null && r != null) {
+ // Hit exception -- close opened reader
+ r.close();
+ }
+ }
+
if (hasChanges) {
if (refreshed == reader) {
fail("No new IndexReader instance created during refresh.");
@@ -852,9 +925,10 @@
}
}
- private static void createIndex(Directory dir, boolean multiSegment) throws IOException {
+ public static void createIndex(Directory dir, boolean multiSegment) throws IOException {
+ IndexWriter.unlock(dir);
IndexWriter w = new IndexWriter(dir, new WhitespaceAnalyzer(), IndexWriter.MaxFieldLength.LIMITED);
-
+
w.setMergePolicy(new LogDocMergePolicy());
for (int i = 0; i < 100; i++) {
@@ -893,7 +967,7 @@
return doc;
}
- private static void modifyIndex(int i, Directory dir) throws IOException {
+ static void modifyIndex(int i, Directory dir) throws IOException {
switch (i) {
case 0: {
IndexWriter w = new IndexWriter(dir, new WhitespaceAnalyzer(), IndexWriter.MaxFieldLength.LIMITED);
@@ -932,7 +1006,12 @@
reader.close();
break;
}
-
+ case 5: {
+ IndexWriter w = new IndexWriter(dir, new WhitespaceAnalyzer(), IndexWriter.MaxFieldLength.LIMITED);
+ w.addDocument(createDocument(101, 4));
+ w.close();
+ break;
+ }
}
}