private void InstantiateReader() { IndexSearcher searcher; if (_idxReader != null) { //use the Reopen() method for better near-realtime when the _writer ins't null var newReader = _idxReader.Reopen(); if (_idxReader != newReader) { //_idxReader.Dispose(); -- will get disposed upon disposing the searcher Interlocked.Exchange(ref _idxReader, newReader); } searcher = new IndexSearcher(_idxReader); } else { // Note: disposing the IndexSearcher instance obtained from the next // statement will not close the underlying reader on dispose. searcher = new IndexSearcher(FSDirectory.Open(IndexFolder)); } var reader = new CachedReader(searcher); var cutoffTime = DateTime.Now - TimeSpan.FromSeconds(_readerTimeSpan * 10); lock (((ICollection)_oldReaders).SyncRoot) { CheckDisposed(); _oldReaders.RemoveAll(r => r.LastUsed <= cutoffTime); _oldReaders.Add(reader); Interlocked.Exchange(ref _reader, reader); } }
private void DisposeReaders() { lock (((ICollection)_oldReaders).SyncRoot) { foreach (var rdr in _oldReaders) { rdr.Dispose(); } _oldReaders.Clear(); _reader = null; } }
private void DisposeReaders() { lock (((ICollection)_oldReaders).SyncRoot) { foreach (var rdr in _oldReaders) { rdr.Dispose(); } _oldReaders.Clear(); _reader = null; } }
private void InstantiateReader() { IndexSearcher searcher; if (_idxReader != null) { //use the Reopen() method for better near-realtime when the _writer ins't null var newReader = _idxReader.Reopen(); if (_idxReader != newReader) { //_idxReader.Dispose(); -- will get disposed upon disposing the searcher Interlocked.Exchange(ref _idxReader, newReader); } searcher = new IndexSearcher(_idxReader); } else { // Note: disposing the IndexSearcher instance obtained from the next // statement will not close the underlying reader on dispose. searcher = new IndexSearcher(FSDirectory.Open(IndexFolder)); } var reader = new CachedReader(searcher); var cutoffTime = DateTime.Now - TimeSpan.FromSeconds(_readerTimeSpan*10); lock (((ICollection) _oldReaders).SyncRoot) { CheckDisposed(); _oldReaders.RemoveAll(r => r.LastUsed <= cutoffTime); _oldReaders.Add(reader); Interlocked.Exchange(ref _reader, reader); } }
private static Line ReadRange(LineReader lineReader, long position, int maxPrev, int maxNext, int maxPrevExtent, int maxNextExtent, List <Line> prev, List <Line> next, List <Extent> prevExtent, List <Extent> nextExtent, LineRange currentState = null, Action <RawLine> feedDetector = null) { prev.Clear(); next.Clear(); prevExtent.Clear(); nextExtent.Clear(); currentState = lineReader.StreamLength >= currentState?.StreamLength ? currentState : null; CachedReader reader = new CachedReader(lineReader, currentState, feedDetector); Line curLine = reader.Read(position); if (curLine != null) { Line l = curLine; for (int prevRead = 0; prevRead < maxPrev; ++prevRead) { l = reader.ReadPrevious(l); if (l != null) { prev.Insert(0, l); } else { break; } } if (l != null) { Extent e = l.Extent; for (int prevRead = 0; prevRead < maxPrevExtent; ++prevRead) { e = reader.GetLineExtent(e.Begin - 1); if (e != null) { prevExtent.Insert(0, e); } else { break; } } } l = curLine; for (int nextRead = 0; nextRead < maxNext; ++nextRead) { l = reader.ReadNext(l); if (l != null) { next.Add(l); } else { break; } } if (l != null) { Extent e = l.Extent; for (int nextRead = 0; nextRead < maxNextExtent; ++nextRead) { e = reader.GetLineExtent(e.End); if (e != null) { nextExtent.Add(e); } else { break; } } } } return(curLine); }