Index: lucene/core/src/test/org/apache/lucene/index/TestParallelCompositeReader.java =================================================================== --- lucene/core/src/test/org/apache/lucene/index/TestParallelCompositeReader.java (revision 1471409) +++ lucene/core/src/test/org/apache/lucene/index/TestParallelCompositeReader.java (working copy) @@ -23,8 +23,9 @@ import org.apache.lucene.analysis.MockAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; +import org.apache.lucene.index.IndexReader.ReaderClosedListener; +import org.apache.lucene.search.*; import org.apache.lucene.search.BooleanClause.Occur; -import org.apache.lucene.search.*; import org.apache.lucene.store.Directory; import org.apache.lucene.util.LuceneTestCase; @@ -277,6 +278,33 @@ dir2.close(); } + public void testReaderClosedListener() throws Exception { + Directory dir1 = getDir1(random()); + CompositeReader ir1 = DirectoryReader.open(dir1); + + // with overlapping + ParallelCompositeReader pr = new ParallelCompositeReader(false, + new CompositeReader[] {ir1}, + new CompositeReader[] {ir1}); + + final int[] listenerClosedCount = new int[1]; + + assertEquals(3, pr.leaves().size()); + + for(AtomicReaderContext cxt : pr.leaves()) { + cxt.reader().addReaderClosedListener(new ReaderClosedListener() { + @Override + public void onClose(IndexReader reader) { + listenerClosedCount[0]++; + } + }); + } + pr.close(); + ir1.close(); + assertEquals(3, listenerClosedCount[0]); + dir1.close(); + } + private void queryTest(Query query) throws IOException { ScoreDoc[] parallelHits = parallel.search(query, null, 1000).scoreDocs; ScoreDoc[] singleHits = single.search(query, null, 1000).scoreDocs;