From ae9ce6a7fb18674e982a95707eee85e117d9b150 Mon Sep 17 00:00:00 2001 From: kvanerum Date: Fri, 4 Jul 2025 18:53:11 +0200 Subject: [PATCH 1/2] Add a checkCancelled public method to ContextIndexSearcher --- .../search/internal/ContextIndexSearcher.java | 6 ++++++ .../search/SearchCancellationTests.java | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/server/src/main/java/org/elasticsearch/search/internal/ContextIndexSearcher.java b/server/src/main/java/org/elasticsearch/search/internal/ContextIndexSearcher.java index d64eb663b409c..c9ab64605562e 100644 --- a/server/src/main/java/org/elasticsearch/search/internal/ContextIndexSearcher.java +++ b/server/src/main/java/org/elasticsearch/search/internal/ContextIndexSearcher.java @@ -191,6 +191,12 @@ public boolean hasCancellations() { return this.cancellable.isEnabled(); } + public void checkCancelled() { + if (this.cancellable.isEnabled()) { + this.cancellable.checkCancelled(); + } + } + public void setAggregatedDfs(AggregatedDfs aggregatedDfs) { this.aggregatedDfs = aggregatedDfs; } diff --git a/server/src/test/java/org/elasticsearch/search/SearchCancellationTests.java b/server/src/test/java/org/elasticsearch/search/SearchCancellationTests.java index aa2e76f512cc8..ebd59f8df27e0 100644 --- a/server/src/test/java/org/elasticsearch/search/SearchCancellationTests.java +++ b/server/src/test/java/org/elasticsearch/search/SearchCancellationTests.java @@ -120,6 +120,25 @@ public void testCancellableCollector() throws IOException { assertThat(totalHits2, equalTo(reader.numDocs())); } + public void testCheckCancelled() throws IOException { + Runnable cancellation = () -> { throw new TaskCancelledException("cancelled"); }; + ContextIndexSearcher searcher = new ContextIndexSearcher( + reader, + IndexSearcher.getDefaultSimilarity(), + IndexSearcher.getDefaultQueryCache(), + IndexSearcher.getDefaultQueryCachingPolicy(), + true + ); + + searcher.checkCancelled(); + + searcher.addQueryCancellation(cancellation); + expectThrows(TaskCancelledException.class, searcher::checkCancelled); + + searcher.removeQueryCancellation(cancellation); + searcher.checkCancelled(); + } + public void testExitableDirectoryReader() throws IOException { AtomicBoolean cancelled = new AtomicBoolean(true); Runnable cancellation = () -> { From e46ab4462276eb8a684fbd0b8c65866b3d6662fe Mon Sep 17 00:00:00 2001 From: kvanerum Date: Thu, 17 Jul 2025 07:26:47 +0200 Subject: [PATCH 2/2] Add Javadocs to checkCancelled method --- .../elasticsearch/search/internal/ContextIndexSearcher.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/src/main/java/org/elasticsearch/search/internal/ContextIndexSearcher.java b/server/src/main/java/org/elasticsearch/search/internal/ContextIndexSearcher.java index c9ab64605562e..1c705b011b642 100644 --- a/server/src/main/java/org/elasticsearch/search/internal/ContextIndexSearcher.java +++ b/server/src/main/java/org/elasticsearch/search/internal/ContextIndexSearcher.java @@ -191,6 +191,11 @@ public boolean hasCancellations() { return this.cancellable.isEnabled(); } + /** + * Checks if the current task has been cancelled and throws a {@link TaskCancelledException} if so. + * This method provides plugin developers (e.g., custom runtime fields) with a way to detect + * task cancellation and act accordingly, for example to release resources early. + */ public void checkCancelled() { if (this.cancellable.isEnabled()) { this.cancellable.checkCancelled();