From b4c6285ae1742a72f88c5e1f172b1aad3819c77d 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 0fe56a0100369..8f7abc08beaef 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 @@ -295,9 +295,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 {