Index: src/test/org/apache/lucene/index/TestIndexReaderClone.java =================================================================== --- src/test/org/apache/lucene/index/TestIndexReaderClone.java (revision 741907) +++ src/test/org/apache/lucene/index/TestIndexReaderClone.java (working copy) @@ -403,4 +403,24 @@ private void assertDelDocsRefCountEquals(int refCount, SegmentReader reader) { assertEquals(refCount, reader.deletedDocsRef.refCount()); } + + public void testCloneSubreaders() throws Exception { + final Directory dir1 = new MockRAMDirectory(); + + TestIndexReaderReopen.createIndex(dir1, true); + IndexReader reader = IndexReader.open(dir1); + reader.deleteDocument(1); // acquire write lock + IndexReader[] subs = reader.getSequentialSubReaders(); + assert subs.length > 1; + + IndexReader[] clones = new IndexReader[subs.length]; + for (int x=0; x < subs.length; x++) { + clones[x] = (IndexReader) subs[x].clone(); + } + reader.close(); + for (int x=0; x < subs.length; x++) { + clones[x].close(); + } + dir1.close(); + } } Index: src/java/org/apache/lucene/index/DirectoryIndexReader.java =================================================================== --- src/java/org/apache/lucene/index/DirectoryIndexReader.java (revision 741907) +++ src/java/org/apache/lucene/index/DirectoryIndexReader.java (working copy) @@ -167,11 +167,16 @@ public final synchronized IndexReader clone(boolean openReadOnly) throws CorruptIndexException, IOException { - final SegmentInfos infos = (SegmentInfos) segmentInfos.clone(); - DirectoryIndexReader newReader = doReopen(infos, true, openReadOnly); + final SegmentInfos clonedInfos; + if (segmentInfos != null) { + clonedInfos = (SegmentInfos) segmentInfos.clone(); + } else { + clonedInfos = null; + } + DirectoryIndexReader newReader = doReopen(clonedInfos, true, openReadOnly); if (this != newReader) { - newReader.init(directory, infos, closeDirectory, openReadOnly); + newReader.init(directory, clonedInfos, closeDirectory, openReadOnly); newReader.deletionPolicy = deletionPolicy; } Index: src/java/org/apache/lucene/index/SegmentReader.java =================================================================== --- src/java/org/apache/lucene/index/SegmentReader.java (revision 741907) +++ src/java/org/apache/lucene/index/SegmentReader.java (working copy) @@ -625,8 +625,15 @@ protected synchronized DirectoryIndexReader doReopen(SegmentInfos infos, boolean doClone, boolean openReadOnly) throws CorruptIndexException, IOException { DirectoryIndexReader newReader; - - if (infos.size() == 1) { + + if (infos == null) { + if (doClone) { + // OK: directly clone myself + newReader = reopenSegment(si, doClone, openReadOnly); + } else { + throw new UnsupportedOperationException("cannot reopen a standalone SegmentReader"); + } + } else if (infos.size() == 1) { SegmentInfo si = infos.info(0); if (segment.equals(si.name) && si.getUseCompoundFile() == SegmentReader.this.si.getUseCompoundFile()) { newReader = reopenSegment(si, doClone, openReadOnly);