| 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<StoredFieldsReader> fieldsReaderLocal = new CloseableThreadLocal<StoredFieldsReader>() { |
| + @Override |
| + protected StoredFieldsReader initialValue() { |
| + return fieldsReaderOrig.clone(); |
| + } |
| + }; |
| + |
| + final CloseableThreadLocal<TermVectorsReader> termVectorsLocal = new CloseableThreadLocal<TermVectorsReader>() { |
| + @Override |
| + protected TermVectorsReader initialValue() { |
| + return (termVectorsReaderOrig == null) ? |
| + null : termVectorsReaderOrig.clone(); |
| + } |
| + }; |
| + |
| private final Set<CoreClosedListener> coreClosedListeners = |
| Collections.synchronizedSet(new LinkedHashSet<CoreClosedListener>()); |
| |
| @@ -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<StoredFieldsReader> fieldsReaderLocal = new CloseableThreadLocal<StoredFieldsReader>() { |
| - @Override |
| - protected StoredFieldsReader initialValue() { |
| - return core.getFieldsReaderOrig().clone(); |
| - } |
| - }; |
| - |
| - private final CloseableThreadLocal<TermVectorsReader> termVectorsLocal = new CloseableThreadLocal<TermVectorsReader>() { |
| - @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; |