From dd3e7a87d405101fe48e9d72ee1b6986dff99a9a Mon Sep 17 00:00:00 2001 From: Mike Pellegrini Date: Thu, 13 Feb 2025 15:37:32 -0500 Subject: [PATCH 1/5] Added integration test --- .../ShardBulkInferenceActionFilterIT.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/x-pack/plugin/inference/src/internalClusterTest/java/org/elasticsearch/xpack/inference/action/filter/ShardBulkInferenceActionFilterIT.java b/x-pack/plugin/inference/src/internalClusterTest/java/org/elasticsearch/xpack/inference/action/filter/ShardBulkInferenceActionFilterIT.java index 303f957c7ab20..04bdc1c31cfeb 100644 --- a/x-pack/plugin/inference/src/internalClusterTest/java/org/elasticsearch/xpack/inference/action/filter/ShardBulkInferenceActionFilterIT.java +++ b/x-pack/plugin/inference/src/internalClusterTest/java/org/elasticsearch/xpack/inference/action/filter/ShardBulkInferenceActionFilterIT.java @@ -44,6 +44,7 @@ import java.util.Set; import static org.elasticsearch.xpack.inference.mapper.SemanticTextFieldTests.randomSemanticTextInput; +import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; public class ShardBulkInferenceActionFilterIT extends ESIntegTestCase { @@ -183,4 +184,48 @@ public void testBulkOperations() throws Exception { searchResponse.decRef(); } } + + public void testItemFailures() { + prepareCreate(INDEX_NAME).setMapping( + String.format( + Locale.ROOT, + """ + { + "properties": { + "sparse_field": { + "type": "semantic_text", + "inference_id": "%s" + }, + "dense_field": { + "type": "semantic_text", + "inference_id": "%s" + } + } + } + """, + TestSparseInferenceServiceExtension.TestInferenceService.NAME, + TestDenseInferenceServiceExtension.TestInferenceService.NAME + ) + ).get(); + + BulkRequestBuilder bulkReqBuilder = client().prepareBulk(); + int totalBulkSize = randomIntBetween(100, 200); + for (int bulkSize = 0; bulkSize < totalBulkSize; bulkSize++) { + String id = Integer.toString(bulkSize); + + // Set field values that will cause errors when generating inference requests + Map source = new HashMap<>(); + source.put("sparse_field", List.of(Map.of("foo", "bar"), Map.of("baz", "bar"))); + source.put("dense_field", List.of(Map.of("foo", "bar"), Map.of("baz", "bar"))); + + bulkReqBuilder.add(new IndexRequestBuilder(client()).setIndex(INDEX_NAME).setId(id).setSource(source)); + } + + BulkResponse bulkResponse = bulkReqBuilder.get(); + assertThat(bulkResponse.hasFailures(), equalTo(true)); + for (BulkItemResponse bulkItemResponse : bulkResponse.getItems()) { + assertThat(bulkItemResponse.isFailed(), equalTo(true)); + assertThat(bulkItemResponse.getFailureMessage(), containsString("expected [String|Number|Boolean]")); + } + } } From f332cf0963e48eeb17f428ed45c4b0742236a218 Mon Sep 17 00:00:00 2001 From: Mike Pellegrini Date: Thu, 13 Feb 2025 15:39:16 -0500 Subject: [PATCH 2/5] Replace item.id() with itemIndex --- .../action/filter/ShardBulkInferenceActionFilter.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/action/filter/ShardBulkInferenceActionFilter.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/action/filter/ShardBulkInferenceActionFilter.java index 3933260664b7c..5fca096dae1e3 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/action/filter/ShardBulkInferenceActionFilter.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/action/filter/ShardBulkInferenceActionFilter.java @@ -482,7 +482,7 @@ private Map> createFieldInferenceRequests(Bu isUpdateRequest = true; if (updateRequest.script() != null) { addInferenceResponseFailure( - item.id(), + itemIndex, new ElasticsearchStatusException( "Cannot apply update with a script on indices that contain [{}] field(s)", RestStatus.BAD_REQUEST, @@ -540,7 +540,7 @@ private Map> createFieldInferenceRequests(Bu if (valueObj == null || valueObj == EXPLICIT_NULL) { if (isUpdateRequest && useLegacyFormat) { addInferenceResponseFailure( - item.id(), + itemIndex, new ElasticsearchStatusException( "Field [{}] must be specified on an update request to calculate inference for field [{}]", RestStatus.BAD_REQUEST, @@ -557,7 +557,7 @@ private Map> createFieldInferenceRequests(Bu try { values = SemanticTextUtils.nodeStringValues(field, valueObj); } catch (Exception exc) { - addInferenceResponseFailure(item.id(), exc); + addInferenceResponseFailure(itemIndex, exc); break; } From 63a3f8d780dd1aa177da80f6a98870e64e9f3500 Mon Sep 17 00:00:00 2001 From: Mike Pellegrini Date: Thu, 13 Feb 2025 15:54:59 -0500 Subject: [PATCH 3/5] Update docs/changelog/122538.yaml --- docs/changelog/122538.yaml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/changelog/122538.yaml diff --git a/docs/changelog/122538.yaml b/docs/changelog/122538.yaml new file mode 100644 index 0000000000000..19fcaaeb1f9f3 --- /dev/null +++ b/docs/changelog/122538.yaml @@ -0,0 +1,5 @@ +pr: 122538 +summary: Fix `ArrayIndexOutOfBoundsException` in `ShardBulkInferenceActionFilter` +area: Relevance +type: bug +issues: [] From d0ea8cca80a8b2b4a7f7fbc37191de23d58918dc Mon Sep 17 00:00:00 2001 From: Mike Pellegrini Date: Thu, 13 Feb 2025 15:57:37 -0500 Subject: [PATCH 4/5] Added comment --- .../action/filter/ShardBulkInferenceActionFilterIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugin/inference/src/internalClusterTest/java/org/elasticsearch/xpack/inference/action/filter/ShardBulkInferenceActionFilterIT.java b/x-pack/plugin/inference/src/internalClusterTest/java/org/elasticsearch/xpack/inference/action/filter/ShardBulkInferenceActionFilterIT.java index 04bdc1c31cfeb..b8e594e70abd9 100644 --- a/x-pack/plugin/inference/src/internalClusterTest/java/org/elasticsearch/xpack/inference/action/filter/ShardBulkInferenceActionFilterIT.java +++ b/x-pack/plugin/inference/src/internalClusterTest/java/org/elasticsearch/xpack/inference/action/filter/ShardBulkInferenceActionFilterIT.java @@ -209,7 +209,7 @@ public void testItemFailures() { ).get(); BulkRequestBuilder bulkReqBuilder = client().prepareBulk(); - int totalBulkSize = randomIntBetween(100, 200); + int totalBulkSize = randomIntBetween(100, 200); // Use a bulk request size large enough to require batching for (int bulkSize = 0; bulkSize < totalBulkSize; bulkSize++) { String id = Integer.toString(bulkSize); From e7956a1fe63415195a50f81ddef2af4499e0e4d7 Mon Sep 17 00:00:00 2001 From: Mike Pellegrini Date: Thu, 13 Feb 2025 15:59:26 -0500 Subject: [PATCH 5/5] Update changelog --- docs/changelog/122538.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog/122538.yaml b/docs/changelog/122538.yaml index 19fcaaeb1f9f3..441f454923cbf 100644 --- a/docs/changelog/122538.yaml +++ b/docs/changelog/122538.yaml @@ -1,5 +1,5 @@ pr: 122538 summary: Fix `ArrayIndexOutOfBoundsException` in `ShardBulkInferenceActionFilter` -area: Relevance +area: Ingest type: bug issues: []