mirror of https://github.com/apache/lucene.git
LUCENE-7564: Force single-threaded access to the AnalyzingInfixSuggester's SearcherManager when performing an acquire() or reassigning. This fixes failures in AnalyzingInfixSuggester.testRandomNRT().
This commit is contained in:
parent
a4335c0e9f
commit
93fdc20736
|
@ -137,6 +137,8 @@ public class AnalyzingInfixSuggester extends Lookup implements Closeable {
|
|||
/** {@link IndexSearcher} used for lookups. */
|
||||
protected SearcherManager searcherMgr;
|
||||
|
||||
protected final Object searcherMgrLock = new Object();
|
||||
|
||||
/** Default minimum number of leading characters before
|
||||
* PrefixQuery is used (4). */
|
||||
public static final int DEFAULT_MIN_PREFIX_CHARS = 4;
|
||||
|
@ -275,6 +277,7 @@ public class AnalyzingInfixSuggester extends Lookup implements Closeable {
|
|||
@Override
|
||||
public void build(InputIterator iter) throws IOException {
|
||||
|
||||
synchronized (searcherMgrLock) {
|
||||
if (searcherMgr != null) {
|
||||
searcherMgr.close();
|
||||
searcherMgr = null;
|
||||
|
@ -326,6 +329,7 @@ public class AnalyzingInfixSuggester extends Lookup implements Closeable {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Commits all pending changes made to this suggester to disk.
|
||||
*
|
||||
|
@ -369,6 +373,7 @@ public class AnalyzingInfixSuggester extends Lookup implements Closeable {
|
|||
} else {
|
||||
writer = new IndexWriter(dir, getIndexWriterConfig(getGramAnalyzer(), IndexWriterConfig.OpenMode.CREATE));
|
||||
}
|
||||
synchronized (searcherMgrLock) {
|
||||
SearcherManager oldSearcherMgr = searcherMgr;
|
||||
searcherMgr = new SearcherManager(writer, null);
|
||||
if (oldSearcherMgr != null) {
|
||||
|
@ -376,6 +381,7 @@ public class AnalyzingInfixSuggester extends Lookup implements Closeable {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Adds a new suggestion. Be sure to use {@link #update}
|
||||
* instead if you want to replace a previous suggestion.
|
||||
|
@ -642,7 +648,12 @@ public class AnalyzingInfixSuggester extends Lookup implements Closeable {
|
|||
// only retrieve the first num hits now:
|
||||
Collector c2 = new EarlyTerminatingSortingCollector(c, SORT, num);
|
||||
List<LookupResult> results = null;
|
||||
IndexSearcher searcher = searcherMgr.acquire();
|
||||
SearcherManager mgr;
|
||||
IndexSearcher searcher;
|
||||
synchronized (searcherMgrLock) {
|
||||
mgr = searcherMgr; // acquire & release on same SearcherManager, via local reference
|
||||
searcher = mgr.acquire();
|
||||
}
|
||||
try {
|
||||
//System.out.println("got searcher=" + searcher);
|
||||
searcher.search(finalQuery, c2);
|
||||
|
@ -653,7 +664,7 @@ public class AnalyzingInfixSuggester extends Lookup implements Closeable {
|
|||
// hits = searcher.search(query, null, num, SORT);
|
||||
results = createResults(searcher, hits, num, key, doHighlight, matchedTokens, prefixToken);
|
||||
} finally {
|
||||
searcherMgr.release(searcher);
|
||||
mgr.release(searcher);
|
||||
}
|
||||
|
||||
//System.out.println((System.currentTimeMillis() - t0) + " msec for infix suggest");
|
||||
|
@ -853,7 +864,12 @@ public class AnalyzingInfixSuggester extends Lookup implements Closeable {
|
|||
long mem = RamUsageEstimator.shallowSizeOf(this);
|
||||
try {
|
||||
if (searcherMgr != null) {
|
||||
IndexSearcher searcher = searcherMgr.acquire();
|
||||
SearcherManager mgr;
|
||||
IndexSearcher searcher;
|
||||
synchronized (searcherMgrLock) {
|
||||
mgr = searcherMgr; // acquire & release on same SearcherManager, via local reference
|
||||
searcher = mgr.acquire();
|
||||
}
|
||||
try {
|
||||
for (LeafReaderContext context : searcher.getIndexReader().leaves()) {
|
||||
LeafReader reader = FilterLeafReader.unwrap(context.reader());
|
||||
|
@ -862,7 +878,7 @@ public class AnalyzingInfixSuggester extends Lookup implements Closeable {
|
|||
}
|
||||
}
|
||||
} finally {
|
||||
searcherMgr.release(searcher);
|
||||
mgr.release(searcher);
|
||||
}
|
||||
}
|
||||
return mem;
|
||||
|
@ -876,7 +892,12 @@ public class AnalyzingInfixSuggester extends Lookup implements Closeable {
|
|||
List<Accountable> resources = new ArrayList<>();
|
||||
try {
|
||||
if (searcherMgr != null) {
|
||||
IndexSearcher searcher = searcherMgr.acquire();
|
||||
SearcherManager mgr;
|
||||
IndexSearcher searcher;
|
||||
synchronized (searcherMgrLock) {
|
||||
mgr = searcherMgr; // acquire & release on same SearcherManager, via local reference
|
||||
searcher = mgr.acquire();
|
||||
}
|
||||
try {
|
||||
for (LeafReaderContext context : searcher.getIndexReader().leaves()) {
|
||||
LeafReader reader = FilterLeafReader.unwrap(context.reader());
|
||||
|
@ -885,7 +906,7 @@ public class AnalyzingInfixSuggester extends Lookup implements Closeable {
|
|||
}
|
||||
}
|
||||
} finally {
|
||||
searcherMgr.release(searcher);
|
||||
mgr.release(searcher);
|
||||
}
|
||||
}
|
||||
return Collections.unmodifiableList(resources);
|
||||
|
@ -899,11 +920,16 @@ public class AnalyzingInfixSuggester extends Lookup implements Closeable {
|
|||
if (searcherMgr == null) {
|
||||
return 0;
|
||||
}
|
||||
IndexSearcher searcher = searcherMgr.acquire();
|
||||
SearcherManager mgr;
|
||||
IndexSearcher searcher;
|
||||
synchronized (searcherMgrLock) {
|
||||
mgr = searcherMgr; // acquire & release on same SearcherManager, via local reference
|
||||
searcher = mgr.acquire();
|
||||
}
|
||||
try {
|
||||
return searcher.getIndexReader().numDocs();
|
||||
} finally {
|
||||
searcherMgr.release(searcher);
|
||||
mgr.release(searcher);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue