Skip to content

Commit 51d1e4f

Browse files
committed
Fix keep_alive of derived context of point in time (elastic#67398)
The reaper can remove derived contexts of a point in time between query and fetch phases as their keep_alive is unset (-1). Closes elastic#67307
1 parent 84b1bf2 commit 51d1e4f

File tree

3 files changed

+13
-12
lines changed

3 files changed

+13
-12
lines changed

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -646,18 +646,19 @@ final ReaderContext createOrGetReaderContext(ShardSearchRequest request, boolean
646646
searcherSupplier.close();
647647
throw e;
648648
}
649-
return createAndPutReaderContext(request, indexService, shard, searcherSupplier, false);
649+
return createAndPutReaderContext(request, indexService, shard, searcherSupplier, false, defaultKeepAlive);
650650
}
651651
} else {
652+
final long keepAliveInMillis = getKeepAlive(request);
652653
final IndexService indexService = indicesService.indexServiceSafe(request.shardId().getIndex());
653654
final IndexShard shard = indexService.getShard(request.shardId().id());
654655
final Engine.SearcherSupplier searcherSupplier = shard.acquireSearcherSupplier();
655-
return createAndPutReaderContext(request, indexService, shard, searcherSupplier, keepStatesInContext);
656+
return createAndPutReaderContext(request, indexService, shard, searcherSupplier, keepStatesInContext, keepAliveInMillis);
656657
}
657658
}
658659

659660
final ReaderContext createAndPutReaderContext(ShardSearchRequest request, IndexService indexService, IndexShard shard,
660-
Engine.SearcherSupplier reader, boolean keepStatesInContext) {
661+
Engine.SearcherSupplier reader, boolean keepStatesInContext, long keepAliveInMillis) {
661662
ReaderContext readerContext = null;
662663
Releasable decreaseScrollContexts = null;
663664
try {
@@ -670,16 +671,15 @@ final ReaderContext createAndPutReaderContext(ShardSearchRequest request, IndexS
670671
+ MAX_OPEN_SCROLL_CONTEXT.getKey() + "] setting.");
671672
}
672673
}
673-
final long keepAlive = getKeepAlive(request);
674674
final ShardSearchContextId id = new ShardSearchContextId(sessionId, idGenerator.incrementAndGet());
675675
if (keepStatesInContext || request.scroll() != null) {
676-
readerContext = new LegacyReaderContext(id, indexService, shard, reader, request, keepAlive);
676+
readerContext = new LegacyReaderContext(id, indexService, shard, reader, request, keepAliveInMillis);
677677
if (request.scroll() != null) {
678678
readerContext.addOnClose(decreaseScrollContexts);
679679
decreaseScrollContexts = null;
680680
}
681681
} else {
682-
readerContext = new ReaderContext(id, indexService, shard, reader, keepAlive, request.keepAlive() == null);
682+
readerContext = new ReaderContext(id, indexService, shard, reader, keepAliveInMillis, true);
683683
}
684684
reader = null;
685685
final ReaderContext finalReaderContext = readerContext;

server/src/test/java/org/elasticsearch/search/SearchServiceTests.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -583,8 +583,8 @@ public void testMaxOpenScrollContexts() throws Exception {
583583

584584
final ShardScrollRequestTest request = new ShardScrollRequestTest(indexShard.shardId());
585585
ElasticsearchException ex = expectThrows(ElasticsearchException.class,
586-
() -> service.createAndPutReaderContext(
587-
request, indexService, indexShard, indexShard.acquireSearcherSupplier(), randomBoolean()));
586+
() -> service.createAndPutReaderContext(request, indexService, indexShard, indexShard.acquireSearcherSupplier(),
587+
randomBoolean(), SearchService.KEEPALIVE_INTERVAL_SETTING.get(Settings.EMPTY).millis()));
588588
assertEquals(
589589
"Trying to create too many scroll contexts. Must be less than or equal to: [" +
590590
SearchService.MAX_OPEN_SCROLL_CONTEXT.get(Settings.EMPTY) + "]. " +
@@ -612,8 +612,9 @@ public void testOpenScrollContextsConcurrently() throws Exception {
612612
for (; ; ) {
613613
final Engine.SearcherSupplier reader = indexShard.acquireSearcherSupplier();
614614
try {
615-
searchService.createAndPutReaderContext(
616-
new ShardScrollRequestTest(indexShard.shardId()), indexService, indexShard, reader, true);
615+
final ShardScrollRequestTest request = new ShardScrollRequestTest(indexShard.shardId());
616+
searchService.createAndPutReaderContext(request, indexService, indexShard, reader, true,
617+
SearchService.KEEPALIVE_INTERVAL_SETTING.get(Settings.EMPTY).millis());
617618
} catch (ElasticsearchException e) {
618619
assertThat(e.getMessage(), equalTo(
619620
"Trying to create too many scroll contexts. Must be less than or equal to: " +
@@ -1120,7 +1121,8 @@ public void testLookUpSearchContext() throws Exception {
11201121
OriginalIndices.NONE, new SearchRequest().allowPartialSearchResults(true),
11211122
indexShard.shardId(), 0, 1, new AliasFilter(null, Strings.EMPTY_ARRAY), 1.0f, -1, null);
11221123
final ReaderContext context = searchService.createAndPutReaderContext(request, indexService, indexShard,
1123-
indexShard.acquireSearcherSupplier(), randomBoolean());
1124+
indexShard.acquireSearcherSupplier(), randomBoolean(),
1125+
SearchService.KEEPALIVE_INTERVAL_SETTING.get(Settings.EMPTY).millis());
11241126
assertThat(context.id().getId(), equalTo((long) (i + 1)));
11251127
contextIds.add(context.id());
11261128
}

x-pack/plugin/frozen-indices/src/internalClusterTest/java/org/elasticsearch/index/engine/FrozenIndexIT.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,6 @@ public void testTimestampFieldTypeExposedByAllIndicesServices() throws Exception
186186
}
187187
}
188188

189-
@AwaitsFix(bugUrl = "https://github.com/elastic/elasticsearch/issues/67307")
190189
public void testRetryPointInTime() throws Exception {
191190
internalCluster().ensureAtLeastNumDataNodes(1);
192191
final List<String> dataNodes =

0 commit comments

Comments
 (0)