internal static void SaveResultsAndClearLucenePool(string luceneIndex) { ReadWriteLock.TryEnterWriteLock(IndexConstants.ReadWriteLockTimeOutMilliseconds); try { if (IndexReaderPool.TryRemove(luceneIndex, out var indexReader)) { indexReader.Dispose(); } if (IndexWritesPool.TryRemove(luceneIndex, out var indexWriter)) { indexWriter.Dispose(); } IndexSearcherPool.TryRemove(luceneIndex, out _); IndexGotChanged.AddOrUpdate(luceneIndex, u => 0, (u, v) => 0); } finally { ReadWriteLock.ExitWriteLock(); } }
static IndexSearcher CreateOrGetIndexSearcher(string luceneIndex) { IndexSearcher indexSearcher; if (!IndexSearcherPool.TryGetValue(luceneIndex, out indexSearcher) || IndexGotChanged.TryGetValue(luceneIndex, out var indexChangedTimes) && indexChangedTimes > 0) { lock (syncLockForSearcher) { if (!IndexSearcherPool.TryGetValue(luceneIndex, out indexSearcher)) { indexSearcher = new IndexSearcher(CreateOrGetIndexReader(luceneIndex, false)); IndexSearcherPool.TryAdd(luceneIndex, indexSearcher); } else if (IndexGotChanged.TryGetValue(luceneIndex, out indexChangedTimes) && indexChangedTimes > 0) { indexSearcher = new IndexSearcher(CreateOrGetIndexReader(luceneIndex, true)); IndexSearcherPool.AddOrUpdate(luceneIndex, indexSearcher, (u, v) => indexSearcher); IndexGotChanged.AddOrUpdate(luceneIndex, 0, (u, v) => 0); } } } if (!indexSearcher.IndexReader.TryIncRef()) { return(CreateOrGetIndexSearcher(luceneIndex)); } return(indexSearcher); }