/// <summary> /// Constructs a new <see cref="SegmentReader"/> with a new core. </summary> /// <exception cref="CorruptIndexException"> if the index is corrupt </exception> /// <exception cref="IOException"> if there is a low-level IO error </exception> // TODO: why is this public? public SegmentReader(SegmentCommitInfo si, int termInfosIndexDivisor, IOContext context) { this.si = si; // TODO if the segment uses CFS, we may open the CFS file twice: once for // reading the FieldInfos (if they are not gen'd) and second time by // SegmentCoreReaders. We can open the CFS here and pass to SCR, but then it // results in less readable code (resource not closed where it was opened). // Best if we could somehow read FieldInfos in SCR but not keep it there, but // constructors don't allow returning two things... fieldInfos = ReadFieldInfos(si); core = new SegmentCoreReaders(this, si.Info.Dir, si, context, termInfosIndexDivisor); segDocValues = new SegmentDocValues(); bool success = false; Codec codec = si.Info.Codec; try { if (si.HasDeletions) { // NOTE: the bitvector is stored using the regular directory, not cfs liveDocs = codec.LiveDocsFormat.ReadLiveDocs(Directory, si, IOContext.READ_ONCE); } else { if (Debugging.AssertsEnabled) { Debugging.Assert(si.DelCount == 0); } liveDocs = null; } numDocs = si.Info.DocCount - si.DelCount; if (FieldInfos.HasDocValues) { InitDocValuesProducers(codec); } success = true; } finally { // With lock-less commits, it's entirely possible (and // fine) to hit a FileNotFound exception above. In // this case, we want to explicitly close any subset // of things that were opened so that we don't have to // wait for a GC to do so. if (!success) { DoClose(); } } }
/// <summary> /// Create new <see cref="SegmentReader"/> sharing core from a previous /// <see cref="SegmentReader"/> and using the provided in-memory /// liveDocs. Used by <see cref="IndexWriter"/> to provide a new NRT /// reader /// </summary> internal SegmentReader(SegmentCommitInfo si, SegmentReader sr, IBits liveDocs, int numDocs) { this.si = si; this.liveDocs = liveDocs; this.numDocs = numDocs; this.core = sr.core; core.IncRef(); this.segDocValues = sr.segDocValues; // System.out.println("[" + Thread.currentThread().getName() + "] SR.init: sharing reader: " + sr + " for gens=" + sr.genDVProducers.keySet()); // increment refCount of DocValuesProducers that are used by this reader bool success = false; try { Codec codec = si.Info.Codec; if (si.FieldInfosGen == -1) { fieldInfos = sr.FieldInfos; } else { fieldInfos = ReadFieldInfos(si); } if (FieldInfos.HasDocValues) { InitDocValuesProducers(codec); } success = true; } finally { if (!success) { DoClose(); } } }
public RefCountHelper(SegmentDocValues outerInstance, DocValuesProducer fieldsProducer, long?gen) : base(fieldsProducer) { this.outerInstance = outerInstance; this.gen = gen; }