Skip to content

Commit 28a3480

Browse files
committed
Release search context when scroll keep_alive is too large (elastic#62179)
Previously, we close related search contexts if the keep_alive of a scroll is too large. But we accidentally change this behavior in elastic#62061.
1 parent 13b7a87 commit 28a3480

File tree

1 file changed

+16
-2
lines changed

1 file changed

+16
-2
lines changed

server/src/main/java/org/elasticsearch/search/SearchService.java

+16-2
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,14 @@ public void executeQueryPhase(InternalScrollSearchRequest request,
471471
SearchShardTask task,
472472
ActionListener<ScrollQuerySearchResult> listener) {
473473
final LegacyReaderContext readerContext = (LegacyReaderContext) findReaderContext(request.contextId(), request);
474-
final Releasable markAsUsed = readerContext.markAsUsed(getScrollKeepAlive(request.scroll()));
474+
final Releasable markAsUsed;
475+
try {
476+
markAsUsed = readerContext.markAsUsed(getScrollKeepAlive(request.scroll()));
477+
} catch (Exception e) {
478+
// We need to release the reader context of the scroll when we hit any exception (here the keep_alive can be too large)
479+
freeReaderContext(readerContext.id());
480+
throw e;
481+
}
475482
runAsync(getExecutor(readerContext.indexShard()), () -> {
476483
final ShardSearchRequest shardSearchRequest = readerContext.getShardSearchRequest(null);
477484
try (SearchContext searchContext = createContext(readerContext, shardSearchRequest, task, false);
@@ -536,7 +543,14 @@ private Executor getExecutor(IndexShard indexShard) {
536543
public void executeFetchPhase(InternalScrollSearchRequest request, SearchShardTask task,
537544
ActionListener<ScrollQueryFetchSearchResult> listener) {
538545
final LegacyReaderContext readerContext = (LegacyReaderContext) findReaderContext(request.contextId(), request);
539-
final Releasable markAsUsed = readerContext.markAsUsed(getScrollKeepAlive(request.scroll()));
546+
final Releasable markAsUsed;
547+
try {
548+
markAsUsed = readerContext.markAsUsed(getScrollKeepAlive(request.scroll()));
549+
} catch (Exception e) {
550+
// We need to release the reader context of the scroll when we hit any exception (here the keep_alive can be too large)
551+
freeReaderContext(readerContext.id());
552+
throw e;
553+
}
540554
runAsync(getExecutor(readerContext.indexShard()), () -> {
541555
final ShardSearchRequest shardSearchRequest = readerContext.getShardSearchRequest(null);
542556
try (SearchContext searchContext = createContext(readerContext, shardSearchRequest, task, false);

0 commit comments

Comments
 (0)