From 1fe3d3ff176d55834ff7bfc40d1ac9d3e59f0911 Mon Sep 17 00:00:00 2001 From: Alan Woodward Date: Wed, 17 Sep 2025 15:57:06 +0100 Subject: [PATCH] Avoid holding references to SearchExecutionContext in SourceConfirmedTextQuery (#134887) Lucene Query objects can hang around for longer than a single search, for example as the key in a Query cache. This means that they should not hold references to anything that is only expected to exist for the duration of a single search request. SourceConfirmedTextQuery holds a lambda to load data during query execution. This commit changes one of the constructor calls to avoid capturing unnecessary references to the SearchExecutionContext, an object which is expected to be short-lived. --- docs/changelog/134887.yaml | 5 +++++ .../index/mapper/extras/MatchOnlyTextFieldMapper.java | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 docs/changelog/134887.yaml diff --git a/docs/changelog/134887.yaml b/docs/changelog/134887.yaml new file mode 100644 index 0000000000000..aa566ad8fdcf5 --- /dev/null +++ b/docs/changelog/134887.yaml @@ -0,0 +1,5 @@ +pr: 134887 +summary: Avoid holding references to `SearchExecutionContext` in `SourceConfirmedTextQuery` +area: Mapping +type: bug +issues: [] diff --git a/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/MatchOnlyTextFieldMapper.java b/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/MatchOnlyTextFieldMapper.java index 1d9fd9cb3a13b..645c0cffe8065 100644 --- a/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/MatchOnlyTextFieldMapper.java +++ b/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/MatchOnlyTextFieldMapper.java @@ -301,9 +301,9 @@ private IOFunction, IOExcepti String name = storedFieldNameForSyntheticSource(); return storedFieldFetcher(name); } + ValueFetcher valueFetcher = valueFetcher(searchExecutionContext, null); + SourceProvider sourceProvider = searchExecutionContext.lookup(); return context -> { - ValueFetcher valueFetcher = valueFetcher(searchExecutionContext, null); - SourceProvider sourceProvider = searchExecutionContext.lookup(); valueFetcher.setNextReader(context); return docID -> { try {