Index: src/test/org/apache/lucene/index/TestIndexReaderReopen.java =================================================================== --- src/test/org/apache/lucene/index/TestIndexReaderReopen.java (revision 718221) +++ src/test/org/apache/lucene/index/TestIndexReaderReopen.java (working copy) @@ -999,4 +999,22 @@ indexDir = new File(tempDir, "IndexReaderReopen"); } + // LUCENE-1453 + public void testFSDirectoryReopen() throws CorruptIndexException, IOException { + IndexReader ir = IndexReader.open(indexDir); + modifyIndex(3, ir.directory()); + IndexReader newIr = ir.reopen(); + modifyIndex(3, newIr.directory()); + IndexReader newIr2 = newIr.reopen(); + modifyIndex(3, newIr2.directory()); + IndexReader newIr3 = newIr2.reopen(); + + ir.close(); + newIr.close(); + newIr2.close(); + + // shouldn't throw Directory AlreadyClosedException + modifyIndex(3, newIr3.directory()); + } + } Index: src/java/org/apache/lucene/index/DirectoryIndexReader.java =================================================================== --- src/java/org/apache/lucene/index/DirectoryIndexReader.java (revision 718221) +++ src/java/org/apache/lucene/index/DirectoryIndexReader.java (working copy) @@ -28,6 +28,7 @@ import org.apache.lucene.store.Directory; import org.apache.lucene.store.Lock; import org.apache.lucene.store.LockObtainFailedException; +import org.apache.lucene.store.FSDirectory; /** * IndexReader implementation that has access to a Directory. @@ -71,6 +72,15 @@ } } } + + // NOTE: + /** @deprecated Remove in 3.0 (see LUCENE-1453).*/ + protected Directory maybeCopyFSDirectory() throws IOException { + if (closeDirectory && directory instanceof FSDirectory) + return FSDirectory.getDirectory(((FSDirectory) directory).getFile()); + else + return directory; + } protected DirectoryIndexReader() {} Index: src/java/org/apache/lucene/index/SegmentReader.java =================================================================== --- src/java/org/apache/lucene/index/SegmentReader.java (revision 718221) +++ src/java/org/apache/lucene/index/SegmentReader.java (working copy) @@ -33,6 +33,7 @@ import org.apache.lucene.search.DefaultSimilarity; import org.apache.lucene.store.BufferedIndexInput; import org.apache.lucene.store.Directory; +import org.apache.lucene.store.FSDirectory; import org.apache.lucene.store.IndexInput; import org.apache.lucene.store.IndexOutput; import org.apache.lucene.util.BitVector; @@ -415,7 +416,8 @@ protected synchronized DirectoryIndexReader doReopen(SegmentInfos infos) throws CorruptIndexException, IOException { DirectoryIndexReader newReader; - + // NOTE: remove this in 3.0 + Directory dir = maybeCopyFSDirectory(); if (infos.size() == 1) { SegmentInfo si = infos.info(0); if (segment.equals(si.name) && si.getUseCompoundFile() == SegmentReader.this.si.getUseCompoundFile()) { @@ -427,9 +429,9 @@ } } else { if (readOnly) - return new ReadOnlyMultiSegmentReader(directory, infos, closeDirectory, new SegmentReader[] {this}, null, null); + return new ReadOnlyMultiSegmentReader(dir, infos, closeDirectory, new SegmentReader[] {this}, null, null); else - return new MultiSegmentReader(directory, infos, closeDirectory, new SegmentReader[] {this}, null, null, false); + return new MultiSegmentReader(dir, infos, closeDirectory, new SegmentReader[] {this}, null, null, false); } return newReader; Index: src/java/org/apache/lucene/index/MultiSegmentReader.java =================================================================== --- src/java/org/apache/lucene/index/MultiSegmentReader.java (revision 718221) +++ src/java/org/apache/lucene/index/MultiSegmentReader.java (working copy) @@ -29,6 +29,7 @@ import org.apache.lucene.document.Document; import org.apache.lucene.document.FieldSelector; import org.apache.lucene.store.Directory; +import org.apache.lucene.store.FSDirectory; /** * An IndexReader which reads indexes with multiple segments. @@ -200,11 +201,14 @@ // The index has only one segment now, so we can't refresh the MultiSegmentReader. // Return a new [ReadOnly]SegmentReader instead return SegmentReader.get(readOnly, infos, infos.info(0), false); - } else if (readOnly) { - return new ReadOnlyMultiSegmentReader(directory, infos, closeDirectory, subReaders, starts, normsCache); } else { - return new MultiSegmentReader(directory, infos, closeDirectory, subReaders, starts, normsCache, false); - } + // NOTE: remove this in 3.0 + Directory dir = maybeCopyFSDirectory(); + if (readOnly) + return new ReadOnlyMultiSegmentReader(dir, infos, closeDirectory, subReaders, starts, normsCache); + else + return new MultiSegmentReader(dir, infos, closeDirectory, subReaders, starts, normsCache, false); + } } public TermFreqVector[] getTermFreqVectors(int n) throws IOException {