You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2011/05/23 02:36:31 UTC
svn commit: r1126284 - in
/lucene/dev/trunk/lucene/src/java/org/apache/lucene/index:
SegmentCoreReaders.java SegmentReader.java
Author: rmuir
Date: Mon May 23 00:36:31 2011
New Revision: 1126284
URL: http://svn.apache.org/viewvc?rev=1126284&view=rev
Log:
LUCENE-3127: pull CoreReaders out of SegmentReader.java
Added:
lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/SegmentCoreReaders.java
Modified:
lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/SegmentReader.java
Added: lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/SegmentCoreReaders.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/SegmentCoreReaders.java?rev=1126284&view=auto
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/SegmentCoreReaders.java (added)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/SegmentCoreReaders.java Mon May 23 00:36:31 2011
@@ -0,0 +1,191 @@
+package org.apache.lucene.index;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.IOException;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.lucene.index.codecs.FieldsProducer;
+import org.apache.lucene.store.Directory;
+
+/** Holds core readers that are shared (unchanged) when
+ * SegmentReader is cloned or reopened */
+final class SegmentCoreReaders {
+
+ // Counts how many other reader share the core objects
+ // (freqStream, proxStream, tis, etc.) of this reader;
+ // when coreRef drops to 0, these core objects may be
+ // closed. A given instance of SegmentReader may be
+ // closed, even those it shares core objects with other
+ // SegmentReaders:
+ private final AtomicInteger ref = new AtomicInteger(1);
+
+ final String segment;
+ final FieldInfos fieldInfos;
+
+ final FieldsProducer fields;
+
+ final Directory dir;
+ final Directory cfsDir;
+ final int readBufferSize;
+ final int termsIndexDivisor;
+
+ private final SegmentReader owner;
+
+ FieldsReader fieldsReaderOrig;
+ TermVectorsReader termVectorsReaderOrig;
+ CompoundFileReader cfsReader;
+ CompoundFileReader storeCFSReader;
+
+ SegmentCoreReaders(SegmentReader owner, Directory dir, SegmentInfo si, int readBufferSize, int termsIndexDivisor) throws IOException {
+
+ if (termsIndexDivisor == 0) {
+ throw new IllegalArgumentException("indexDivisor must be < 0 (don't load terms index) or greater than 0 (got 0)");
+ }
+
+ segment = si.name;
+ final SegmentCodecs segmentCodecs = si.getSegmentCodecs();
+ this.readBufferSize = readBufferSize;
+ this.dir = dir;
+
+ boolean success = false;
+
+ try {
+ Directory dir0 = dir;
+ if (si.getUseCompoundFile()) {
+ cfsReader = new CompoundFileReader(dir, IndexFileNames.segmentFileName(segment, "", IndexFileNames.COMPOUND_FILE_EXTENSION), readBufferSize);
+ dir0 = cfsReader;
+ }
+ cfsDir = dir0;
+ si.loadFieldInfos(cfsDir, false); // prevent opening the CFS to load fieldInfos
+ fieldInfos = si.getFieldInfos();
+
+ this.termsIndexDivisor = termsIndexDivisor;
+
+ // Ask codec for its Fields
+ fields = segmentCodecs.codec().fieldsProducer(new SegmentReadState(cfsDir, si, fieldInfos, readBufferSize, termsIndexDivisor));
+ assert fields != null;
+
+ success = true;
+ } finally {
+ if (!success) {
+ decRef();
+ }
+ }
+
+ // Must assign this at the end -- if we hit an
+ // exception above core, we don't want to attempt to
+ // purge the FieldCache (will hit NPE because core is
+ // not assigned yet).
+ this.owner = owner;
+ }
+
+ synchronized TermVectorsReader getTermVectorsReaderOrig() {
+ return termVectorsReaderOrig;
+ }
+
+ synchronized FieldsReader getFieldsReaderOrig() {
+ return fieldsReaderOrig;
+ }
+
+ synchronized void incRef() {
+ ref.incrementAndGet();
+ }
+
+ synchronized Directory getCFSReader() {
+ return cfsReader;
+ }
+
+ synchronized void decRef() throws IOException {
+
+ if (ref.decrementAndGet() == 0) {
+
+ if (fields != null) {
+ fields.close();
+ }
+
+ if (termVectorsReaderOrig != null) {
+ termVectorsReaderOrig.close();
+ }
+
+ if (fieldsReaderOrig != null) {
+ fieldsReaderOrig.close();
+ }
+
+ if (cfsReader != null) {
+ cfsReader.close();
+ }
+
+ if (storeCFSReader != null) {
+ storeCFSReader.close();
+ }
+
+ // Now, notify any ReaderFinished listeners:
+ if (owner != null) {
+ owner.notifyReaderFinishedListeners();
+ }
+ }
+ }
+
+ synchronized void openDocStores(SegmentInfo si) throws IOException {
+
+ assert si.name.equals(segment);
+
+ if (fieldsReaderOrig == null) {
+ final Directory storeDir;
+ if (si.getDocStoreOffset() != -1) {
+ if (si.getDocStoreIsCompoundFile()) {
+ assert storeCFSReader == null;
+ storeCFSReader = new CompoundFileReader(dir,
+ IndexFileNames.segmentFileName(si.getDocStoreSegment(), "", IndexFileNames.COMPOUND_FILE_STORE_EXTENSION),
+ readBufferSize);
+ storeDir = storeCFSReader;
+ assert storeDir != null;
+ } else {
+ storeDir = dir;
+ assert storeDir != null;
+ }
+ } else if (si.getUseCompoundFile()) {
+ // In some cases, we were originally opened when CFS
+ // was not used, but then we are asked to open doc
+ // stores after the segment has switched to CFS
+ if (cfsReader == null) {
+ cfsReader = new CompoundFileReader(dir, IndexFileNames.segmentFileName(segment, "", IndexFileNames.COMPOUND_FILE_EXTENSION), readBufferSize);
+ }
+ storeDir = cfsReader;
+ assert storeDir != null;
+ } else {
+ storeDir = dir;
+ assert storeDir != null;
+ }
+
+ final String storesSegment = si.getDocStoreSegment();
+ fieldsReaderOrig = new FieldsReader(storeDir, storesSegment, fieldInfos, readBufferSize,
+ si.getDocStoreOffset(), si.docCount);
+
+ // Verify two sources of "maxDoc" agree:
+ if (si.getDocStoreOffset() == -1 && fieldsReaderOrig.size() != si.docCount) {
+ throw new CorruptIndexException("doc counts differ for segment " + segment + ": fieldsReader shows " + fieldsReaderOrig.size() + " but segmentInfo shows " + si.docCount);
+ }
+
+ if (si.getHasVectors()) { // open term vector files only as needed
+ termVectorsReaderOrig = new TermVectorsReader(storeDir, storesSegment, fieldInfos, readBufferSize, si.getDocStoreOffset(), si.docCount);
+ }
+ }
+ }
+}
Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/SegmentReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/SegmentReader.java?rev=1126284&r1=1126283&r2=1126284&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/SegmentReader.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/SegmentReader.java Mon May 23 00:36:31 2011
@@ -29,7 +29,6 @@ import java.util.concurrent.atomic.Atomi
import org.apache.lucene.document.Document;
import org.apache.lucene.document.FieldSelector;
-import org.apache.lucene.index.codecs.FieldsProducer;
import org.apache.lucene.store.BufferedIndexInput;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.IndexInput;
@@ -70,174 +69,7 @@ public class SegmentReader extends Index
IndexInput singleNormStream;
AtomicInteger singleNormRef;
- CoreReaders core;
-
- // Holds core readers that are shared (unchanged) when
- // SegmentReader is cloned or reopened
- static final class CoreReaders {
-
- // Counts how many other reader share the core objects
- // (freqStream, proxStream, tis, etc.) of this reader;
- // when coreRef drops to 0, these core objects may be
- // closed. A given instance of SegmentReader may be
- // closed, even those it shares core objects with other
- // SegmentReaders:
- private final AtomicInteger ref = new AtomicInteger(1);
-
- final String segment;
- final FieldInfos fieldInfos;
-
- final FieldsProducer fields;
-
- final Directory dir;
- final Directory cfsDir;
- final int readBufferSize;
- final int termsIndexDivisor;
-
- private final SegmentReader origInstance;
-
- FieldsReader fieldsReaderOrig;
- TermVectorsReader termVectorsReaderOrig;
- CompoundFileReader cfsReader;
- CompoundFileReader storeCFSReader;
-
- CoreReaders(SegmentReader origInstance, Directory dir, SegmentInfo si, int readBufferSize, int termsIndexDivisor) throws IOException {
-
- if (termsIndexDivisor == 0) {
- throw new IllegalArgumentException("indexDivisor must be < 0 (don't load terms index) or greater than 0 (got 0)");
- }
-
- segment = si.name;
- final SegmentCodecs segmentCodecs = si.getSegmentCodecs();
- this.readBufferSize = readBufferSize;
- this.dir = dir;
-
- boolean success = false;
-
- try {
- Directory dir0 = dir;
- if (si.getUseCompoundFile()) {
- cfsReader = new CompoundFileReader(dir, IndexFileNames.segmentFileName(segment, "", IndexFileNames.COMPOUND_FILE_EXTENSION), readBufferSize);
- dir0 = cfsReader;
- }
- cfsDir = dir0;
- si.loadFieldInfos(cfsDir, false); // prevent opening the CFS to load fieldInfos
- fieldInfos = si.getFieldInfos();
-
- this.termsIndexDivisor = termsIndexDivisor;
-
- // Ask codec for its Fields
- fields = segmentCodecs.codec().fieldsProducer(new SegmentReadState(cfsDir, si, fieldInfos, readBufferSize, termsIndexDivisor));
- assert fields != null;
-
- success = true;
- } finally {
- if (!success) {
- decRef();
- }
- }
-
- // Must assign this at the end -- if we hit an
- // exception above core, we don't want to attempt to
- // purge the FieldCache (will hit NPE because core is
- // not assigned yet).
- this.origInstance = origInstance;
- }
-
- synchronized TermVectorsReader getTermVectorsReaderOrig() {
- return termVectorsReaderOrig;
- }
-
- synchronized FieldsReader getFieldsReaderOrig() {
- return fieldsReaderOrig;
- }
-
- synchronized void incRef() {
- ref.incrementAndGet();
- }
-
- synchronized Directory getCFSReader() {
- return cfsReader;
- }
-
- synchronized void decRef() throws IOException {
-
- if (ref.decrementAndGet() == 0) {
-
- if (fields != null) {
- fields.close();
- }
-
- if (termVectorsReaderOrig != null) {
- termVectorsReaderOrig.close();
- }
-
- if (fieldsReaderOrig != null) {
- fieldsReaderOrig.close();
- }
-
- if (cfsReader != null) {
- cfsReader.close();
- }
-
- if (storeCFSReader != null) {
- storeCFSReader.close();
- }
-
- // Now, notify any ReaderFinished listeners:
- if (origInstance != null) {
- origInstance.notifyReaderFinishedListeners();
- }
- }
- }
-
- synchronized void openDocStores(SegmentInfo si) throws IOException {
-
- assert si.name.equals(segment);
-
- if (fieldsReaderOrig == null) {
- final Directory storeDir;
- if (si.getDocStoreOffset() != -1) {
- if (si.getDocStoreIsCompoundFile()) {
- assert storeCFSReader == null;
- storeCFSReader = new CompoundFileReader(dir,
- IndexFileNames.segmentFileName(si.getDocStoreSegment(), "", IndexFileNames.COMPOUND_FILE_STORE_EXTENSION),
- readBufferSize);
- storeDir = storeCFSReader;
- assert storeDir != null;
- } else {
- storeDir = dir;
- assert storeDir != null;
- }
- } else if (si.getUseCompoundFile()) {
- // In some cases, we were originally opened when CFS
- // was not used, but then we are asked to open doc
- // stores after the segment has switched to CFS
- if (cfsReader == null) {
- cfsReader = new CompoundFileReader(dir, IndexFileNames.segmentFileName(segment, "", IndexFileNames.COMPOUND_FILE_EXTENSION), readBufferSize);
- }
- storeDir = cfsReader;
- assert storeDir != null;
- } else {
- storeDir = dir;
- assert storeDir != null;
- }
-
- final String storesSegment = si.getDocStoreSegment();
- fieldsReaderOrig = new FieldsReader(storeDir, storesSegment, fieldInfos, readBufferSize,
- si.getDocStoreOffset(), si.docCount);
-
- // Verify two sources of "maxDoc" agree:
- if (si.getDocStoreOffset() == -1 && fieldsReaderOrig.size() != si.docCount) {
- throw new CorruptIndexException("doc counts differ for segment " + segment + ": fieldsReader shows " + fieldsReaderOrig.size() + " but segmentInfo shows " + si.docCount);
- }
-
- if (si.getHasVectors()) { // open term vector files only as needed
- termVectorsReaderOrig = new TermVectorsReader(storeDir, storesSegment, fieldInfos, readBufferSize, si.getDocStoreOffset(), si.docCount);
- }
- }
- }
- }
+ SegmentCoreReaders core;
/**
* Sets the initial value
@@ -248,8 +80,6 @@ public class SegmentReader extends Index
return (FieldsReader) core.getFieldsReaderOrig().clone();
}
}
-
-
Map<String,SegmentNorms> norms = new HashMap<String,SegmentNorms>();
@@ -281,7 +111,7 @@ public class SegmentReader extends Index
boolean success = false;
try {
- instance.core = new CoreReaders(instance, dir, si, readBufferSize, termInfosIndexDivisor);
+ instance.core = new SegmentCoreReaders(instance, dir, si, readBufferSize, termInfosIndexDivisor);
if (doOpenStores) {
instance.core.openDocStores(si);
}