|
@@ -1264,18 +1264,18 @@ public class SearchService extends AbstractLifecycleComponent implements IndexEv
|
|
|
}
|
|
|
|
|
|
final ReaderContext createOrGetReaderContext(ShardSearchRequest request) {
|
|
|
+ ShardSearchContextId readerId = request.readerId();
|
|
|
if (request.readerId() != null) {
|
|
|
try {
|
|
|
- return findReaderContext(request.readerId(), request);
|
|
|
+ return findReaderContext(readerId, request);
|
|
|
} catch (SearchContextMissingException e) {
|
|
|
- final String searcherId = request.readerId().getSearcherId();
|
|
|
- if (searcherId == null) {
|
|
|
+ if (readerId.isRetryable() == false) {
|
|
|
throw e;
|
|
|
}
|
|
|
final IndexService indexService = indicesService.indexServiceSafe(request.shardId().getIndex());
|
|
|
final IndexShard shard = indexService.getShard(request.shardId().id());
|
|
|
final Engine.SearcherSupplier searcherSupplier = shard.acquireSearcherSupplier();
|
|
|
- if (searcherId.equals(searcherSupplier.getSearcherId()) == false) {
|
|
|
+ if (readerId.sameSearcherIdsAs(searcherSupplier.getSearcherId()) == false) {
|
|
|
searcherSupplier.close();
|
|
|
throw e;
|
|
|
}
|
|
@@ -1298,8 +1298,8 @@ public class SearchService extends AbstractLifecycleComponent implements IndexEv
|
|
|
ReaderContext readerContext = null;
|
|
|
Releasable decreaseScrollContexts = null;
|
|
|
try {
|
|
|
- final ShardSearchContextId id = new ShardSearchContextId(sessionId, idGenerator.incrementAndGet());
|
|
|
if (request.scroll() != null) {
|
|
|
+ final ShardSearchContextId id = new ShardSearchContextId(sessionId, idGenerator.incrementAndGet());
|
|
|
decreaseScrollContexts = openScrollContexts::decrementAndGet;
|
|
|
if (openScrollContexts.incrementAndGet() > maxOpenScrollContext) {
|
|
|
throw new TooManyScrollContextsException(maxOpenScrollContext, MAX_OPEN_SCROLL_CONTEXT.getKey());
|
|
@@ -1308,6 +1308,7 @@ public class SearchService extends AbstractLifecycleComponent implements IndexEv
|
|
|
readerContext.addOnClose(decreaseScrollContexts);
|
|
|
decreaseScrollContexts = null;
|
|
|
} else {
|
|
|
+ final ShardSearchContextId id = new ShardSearchContextId(sessionId, idGenerator.incrementAndGet(), reader.getSearcherId());
|
|
|
readerContext = new ReaderContext(id, indexService, shard, reader, keepAliveInMillis, true);
|
|
|
}
|
|
|
reader = null;
|
|
@@ -1399,7 +1400,7 @@ public class SearchService extends AbstractLifecycleComponent implements IndexEv
|
|
|
final IndexService indexService = indicesService.indexServiceSafe(request.shardId().getIndex());
|
|
|
final IndexShard indexShard = indexService.getShard(request.shardId().getId());
|
|
|
final Engine.SearcherSupplier reader = indexShard.acquireSearcherSupplier();
|
|
|
- final ShardSearchContextId id = new ShardSearchContextId(sessionId, idGenerator.incrementAndGet());
|
|
|
+ final ShardSearchContextId id = new ShardSearchContextId(sessionId, idGenerator.incrementAndGet(), reader.getSearcherId());
|
|
|
try (ReaderContext readerContext = new ReaderContext(id, indexService, indexShard, reader, -1L, true)) {
|
|
|
DefaultSearchContext searchContext = createSearchContext(readerContext, request, timeout, ResultsType.NONE);
|
|
|
searchContext.addReleasable(readerContext.markAsUsed(0L));
|
|
@@ -2037,8 +2038,7 @@ public class SearchService extends AbstractLifecycleComponent implements IndexEv
|
|
|
}
|
|
|
searcher = readerContext.acquireSearcher(Engine.CAN_MATCH_SEARCH_SOURCE);
|
|
|
} catch (SearchContextMissingException e) {
|
|
|
- final String searcherId = canMatchContext.request.readerId().getSearcherId();
|
|
|
- if (searcherId == null) {
|
|
|
+ if (canMatchContext.request.readerId().isRetryable() == false) {
|
|
|
return new CanMatchShardResponse(true, null);
|
|
|
}
|
|
|
if (queryStillMatchesAfterRewrite(
|
|
@@ -2048,7 +2048,7 @@ public class SearchService extends AbstractLifecycleComponent implements IndexEv
|
|
|
return new CanMatchShardResponse(false, null);
|
|
|
}
|
|
|
final Engine.SearcherSupplier searcherSupplier = canMatchContext.getShard().acquireSearcherSupplier();
|
|
|
- if (searcherId.equals(searcherSupplier.getSearcherId()) == false) {
|
|
|
+ if (canMatchContext.request.readerId().sameSearcherIdsAs(searcherSupplier.getSearcherId()) == false) {
|
|
|
searcherSupplier.close();
|
|
|
return new CanMatchShardResponse(true, null);
|
|
|
}
|