Skip to content

Commit 4d408d4

Browse files
authored
[8.16] Fix ArrayIndexOutOfBoundsException in ShardBulkInferenceActionFilter (#122538) (#122854)
* Fix ArrayIndexOutOfBoundsException in ShardBulkInferenceActionFilter (#122538) (cherry picked from commit 229d392) # Conflicts: # x-pack/plugin/inference/src/internalClusterTest/java/org/elasticsearch/xpack/inference/action/filter/ShardBulkInferenceActionFilterIT.java * Fix compilation & test failures
1 parent 74f10d2 commit 4d408d4

File tree

3 files changed

+53
-3
lines changed

3 files changed

+53
-3
lines changed

docs/changelog/122538.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 122538
2+
summary: Fix `ArrayIndexOutOfBoundsException` in `ShardBulkInferenceActionFilter`
3+
area: Ingest
4+
type: bug
5+
issues: []

x-pack/plugin/inference/src/internalClusterTest/java/org/elasticsearch/xpack/inference/action/filter/ShardBulkInferenceActionFilterIT.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,13 @@
3232
import java.util.Collections;
3333
import java.util.HashMap;
3434
import java.util.HashSet;
35+
import java.util.List;
3536
import java.util.Locale;
3637
import java.util.Map;
3738
import java.util.Set;
3839

3940
import static org.elasticsearch.xpack.inference.mapper.SemanticTextFieldTests.randomSemanticTextInput;
41+
import static org.hamcrest.Matchers.containsString;
4042
import static org.hamcrest.Matchers.equalTo;
4143

4244
public class ShardBulkInferenceActionFilterIT extends ESIntegTestCase {
@@ -152,4 +154,47 @@ public void testBulkOperations() throws Exception {
152154
}
153155
}
154156

157+
public void testItemFailures() {
158+
prepareCreate(INDEX_NAME).setMapping(
159+
String.format(
160+
Locale.ROOT,
161+
"""
162+
{
163+
"properties": {
164+
"sparse_field": {
165+
"type": "semantic_text",
166+
"inference_id": "%s"
167+
},
168+
"dense_field": {
169+
"type": "semantic_text",
170+
"inference_id": "%s"
171+
}
172+
}
173+
}
174+
""",
175+
TestSparseInferenceServiceExtension.TestInferenceService.NAME,
176+
TestDenseInferenceServiceExtension.TestInferenceService.NAME
177+
)
178+
).get();
179+
180+
BulkRequestBuilder bulkReqBuilder = client().prepareBulk();
181+
int totalBulkSize = randomIntBetween(100, 200); // Use a bulk request size large enough to require batching
182+
for (int bulkSize = 0; bulkSize < totalBulkSize; bulkSize++) {
183+
String id = Integer.toString(bulkSize);
184+
185+
// Set field values that will cause errors when generating inference requests
186+
Map<String, Object> source = new HashMap<>();
187+
source.put("sparse_field", List.of(Map.of("foo", "bar"), Map.of("baz", "bar")));
188+
source.put("dense_field", List.of(Map.of("foo", "bar"), Map.of("baz", "bar")));
189+
190+
bulkReqBuilder.add(new IndexRequestBuilder(client()).setIndex(INDEX_NAME).setId(id).setSource(source));
191+
}
192+
193+
BulkResponse bulkResponse = bulkReqBuilder.get();
194+
assertThat(bulkResponse.hasFailures(), equalTo(true));
195+
for (BulkItemResponse bulkItemResponse : bulkResponse.getItems()) {
196+
assertThat(bulkItemResponse.isFailed(), equalTo(true));
197+
assertThat(bulkItemResponse.getFailureMessage(), containsString("expected [String]"));
198+
}
199+
}
155200
}

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/action/filter/ShardBulkInferenceActionFilter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ private Map<String, List<FieldInferenceRequest>> createFieldInferenceRequests(Bu
427427
isUpdateRequest = true;
428428
if (updateRequest.script() != null) {
429429
addInferenceResponseFailure(
430-
item.id(),
430+
itemIndex,
431431
new ElasticsearchStatusException(
432432
"Cannot apply update with a script on indices that contain [{}] field(s)",
433433
RestStatus.BAD_REQUEST,
@@ -458,7 +458,7 @@ private Map<String, List<FieldInferenceRequest>> createFieldInferenceRequests(Bu
458458
if (valueObj == null) {
459459
if (isUpdateRequest) {
460460
addInferenceResponseFailure(
461-
item.id(),
461+
itemIndex,
462462
new ElasticsearchStatusException(
463463
"Field [{}] must be specified on an update request to calculate inference for field [{}]",
464464
RestStatus.BAD_REQUEST,
@@ -475,7 +475,7 @@ private Map<String, List<FieldInferenceRequest>> createFieldInferenceRequests(Bu
475475
try {
476476
values = nodeStringValues(field, valueObj);
477477
} catch (Exception exc) {
478-
addInferenceResponseFailure(item.id(), exc);
478+
addInferenceResponseFailure(itemIndex, exc);
479479
break;
480480
}
481481
List<FieldInferenceRequest> fieldRequests = fieldRequestsMap.computeIfAbsent(inferenceId, k -> new ArrayList<>());

0 commit comments

Comments
 (0)