Index: lucene/src/java/org/apache/lucene/index/SegmentCoreReaders.java =================================================================== --- lucene/src/java/org/apache/lucene/index/SegmentCoreReaders.java (revision 1221654) +++ lucene/src/java/org/apache/lucene/index/SegmentCoreReaders.java (working copy) @@ -34,6 +34,7 @@ import org.apache.lucene.store.CompoundFileDirectory; import org.apache.lucene.store.Directory; import org.apache.lucene.store.IOContext; +import org.apache.lucene.util.CloseableThreadLocal; import org.apache.lucene.util.IOUtils; /** Holds core readers that are shared (unchanged) when @@ -67,6 +68,21 @@ final CompoundFileDirectory cfsReader; final CompoundFileDirectory storeCFSReader; + final CloseableThreadLocal fieldsReaderLocal = new CloseableThreadLocal() { + @Override + protected StoredFieldsReader initialValue() { + return fieldsReaderOrig.clone(); + } + }; + + final CloseableThreadLocal termVectorsLocal = new CloseableThreadLocal() { + @Override + protected TermVectorsReader initialValue() { + return (termVectorsReaderOrig == null) ? + null : termVectorsReaderOrig.clone(); + } + }; + private final Set coreClosedListeners = Collections.synchronizedSet(new LinkedHashSet()); @@ -152,14 +168,6 @@ this.owner = owner; } - TermVectorsReader getTermVectorsReaderOrig() { - return termVectorsReaderOrig; - } - - StoredFieldsReader getFieldsReaderOrig() { - return fieldsReaderOrig; - } - void incRef() { ref.incrementAndGet(); } @@ -167,8 +175,8 @@ void decRef() throws IOException { //System.out.println("core.decRef seg=" + owner.getSegmentInfo() + " rc=" + ref); if (ref.decrementAndGet() == 0) { - IOUtils.close(fields, perDocProducer, termVectorsReaderOrig, - fieldsReaderOrig, cfsReader, storeCFSReader, norms); + IOUtils.close(termVectorsLocal, fieldsReaderLocal, fields, perDocProducer, + termVectorsReaderOrig, fieldsReaderOrig, cfsReader, storeCFSReader, norms); notifyCoreClosedListeners(); } } Index: lucene/src/java/org/apache/lucene/index/SegmentReader.java =================================================================== --- lucene/src/java/org/apache/lucene/index/SegmentReader.java (revision 1221654) +++ lucene/src/java/org/apache/lucene/index/SegmentReader.java (working copy) @@ -33,7 +33,6 @@ import org.apache.lucene.store.IOContext; import org.apache.lucene.util.BitVector; import org.apache.lucene.util.Bits; -import org.apache.lucene.util.CloseableThreadLocal; /** * @lucene.experimental @@ -43,21 +42,6 @@ private final SegmentInfo si; private final ReaderContext readerContext = new AtomicReaderContext(this); - private final CloseableThreadLocal fieldsReaderLocal = new CloseableThreadLocal() { - @Override - protected StoredFieldsReader initialValue() { - return core.getFieldsReaderOrig().clone(); - } - }; - - private final CloseableThreadLocal termVectorsLocal = new CloseableThreadLocal() { - @Override - protected TermVectorsReader initialValue() { - final TermVectorsReader tvr = core.getTermVectorsReaderOrig(); - return (tvr == null) ? null : tvr.clone(); - } - }; - private final BitVector liveDocs; // Normally set to si.docCount - si.delDocCount, unless we @@ -167,16 +151,9 @@ return true; } - /** @lucene.internal */ - public StoredFieldsReader getFieldsReader() { - return fieldsReaderLocal.get(); - } - @Override protected void doClose() throws IOException { //System.out.println("SR.close seg=" + si); - termVectorsLocal.close(); - fieldsReaderLocal.close(); if (core != null) { core.decRef(); } @@ -192,8 +169,14 @@ return core.fieldInfos; } + /** @lucene.internal */ + public StoredFieldsReader getFieldsReader() { + ensureOpen(); + return core.fieldsReaderLocal.get(); + } + + @Override public void document(int docID, StoredFieldVisitor visitor) throws CorruptIndexException, IOException { - ensureOpen(); if (docID < 0 || docID >= maxDoc()) { throw new IllegalArgumentException("docID must be >= 0 and < maxDoc=" + maxDoc() + " (got docID=" + docID + ")"); } @@ -287,13 +270,10 @@ return core.norms.norms(field); } - /** - * Create a clone from the initial TermVectorsReader and store it in the ThreadLocal. - * @return TermVectorsReader - * @lucene.internal - */ + /** @lucene.internal */ public TermVectorsReader getTermVectorsReader() { - return termVectorsLocal.get(); + ensureOpen(); + return core.termVectorsLocal.get(); } /** Return a term frequency vector for the specified document and field. The @@ -304,7 +284,6 @@ */ @Override public Fields getTermVectors(int docID) throws IOException { - ensureOpen(); TermVectorsReader termVectorsReader = getTermVectorsReader(); if (termVectorsReader == null) { return null;