From 970c0ad3d774e1250028bb7c2ece79496bb1f4f8 Mon Sep 17 00:00:00 2001 From: Panagiotis Bailis Date: Fri, 24 Jul 2026 17:29:33 +0300 Subject: [PATCH 1/3] iter --- .../xpack/esql/inference/InferenceOperator.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/inference/InferenceOperator.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/inference/InferenceOperator.java index a6babe277a6e8..80dd500bc4f90 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/inference/InferenceOperator.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/inference/InferenceOperator.java @@ -377,7 +377,10 @@ public BulkInferenceRequestItem pollNextRequest() { } synchronized (checkpoint) { - if (requestItemIterator.hasNext() == false) { + // Re-check under the lock: completeIfFinished() releases the request iterator (and its backing block) while holding + // this lock when a failure occurs. Without re-checking, a concurrent poller that passed the guard above could invoke + // requestItemIterator.next() on an already-released block. + if (hasFailure() || completed.get() || requestItemIterator.hasNext() == false) { return null; } From 28c7d6ab485477e431473d99006090a51342e5b8 Mon Sep 17 00:00:00 2001 From: Panagiotis Bailis Date: Fri, 24 Jul 2026 17:46:19 +0300 Subject: [PATCH 2/3] iter --- .../elasticsearch/xpack/esql/inference/InferenceOperator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/inference/InferenceOperator.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/inference/InferenceOperator.java index 80dd500bc4f90..320fa15889be9 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/inference/InferenceOperator.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/inference/InferenceOperator.java @@ -379,7 +379,7 @@ public BulkInferenceRequestItem pollNextRequest() { synchronized (checkpoint) { // Re-check under the lock: completeIfFinished() releases the request iterator (and its backing block) while holding // this lock when a failure occurs. Without re-checking, a concurrent poller that passed the guard above could invoke - // requestItemIterator.next() on an already-released block. + // requestItemIterator.next() on an already-released block. See https://github.com/elastic/elasticsearch/issues/154866 if (hasFailure() || completed.get() || requestItemIterator.hasNext() == false) { return null; } From 79eadce55eab62929ff2b88b158adfd909a9b2b1 Mon Sep 17 00:00:00 2001 From: Panagiotis Bailis Date: Fri, 24 Jul 2026 17:55:20 +0300 Subject: [PATCH 3/3] Update docs/changelog/154972.yaml --- docs/changelog/154972.yaml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 docs/changelog/154972.yaml diff --git a/docs/changelog/154972.yaml b/docs/changelog/154972.yaml new file mode 100644 index 0000000000000..bccf36f0ffb5e --- /dev/null +++ b/docs/changelog/154972.yaml @@ -0,0 +1,6 @@ +area: ES|QL +issues: + - 154866 +pr: 154972 +summary: Addressing inference timeout issues on inference operator tests +type: bug