From 367bcfadb48a86f619f282e5b10539799fbe734c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20B=C3=B6hm?= Date: Fri, 22 Aug 2025 12:48:29 +0200 Subject: [PATCH] Fix: Include script params in BulkRequest size calculation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The BulkRequest's size calculation in internalAdd(UpdateRequest) method currently doesn't account for the size of script parameters. This can lead to underestimating the actual request size when script parameters are used. Added script parameters size calculation using script.getParams().toString().length() Signed-off-by: Marcin Böhm --- .../opensearch/action/bulk/BulkRequest.java | 14 +++++------ .../action/bulk/BulkRequestTests.java | 24 +++++++++++++++++++ 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/server/src/main/java/org/opensearch/action/bulk/BulkRequest.java b/server/src/main/java/org/opensearch/action/bulk/BulkRequest.java index 84d1bee38fb47..7454c43946db7 100644 --- a/server/src/main/java/org/opensearch/action/bulk/BulkRequest.java +++ b/server/src/main/java/org/opensearch/action/bulk/BulkRequest.java @@ -54,16 +54,12 @@ import org.opensearch.core.common.io.stream.StreamInput; import org.opensearch.core.common.io.stream.StreamOutput; import org.opensearch.core.xcontent.MediaType; +import org.opensearch.script.Script; import org.opensearch.search.fetch.subphase.FetchSourceContext; import org.opensearch.transport.client.Client; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.Set; +import java.util.*; import static org.opensearch.action.ValidateActions.addValidationError; @@ -198,8 +194,10 @@ BulkRequest internalAdd(UpdateRequest request) { if (request.upsertRequest() != null) { sizeInBytes += request.upsertRequest().source().length(); } - if (request.script() != null) { - sizeInBytes += request.script().getIdOrCode().length() * 2; + Script script = request.script(); + if (script != null) { + sizeInBytes += (long) script.getIdOrCode().length() * 2L; + sizeInBytes += script.getParams().toString().length(); } indices.add(request.index()); return this; diff --git a/server/src/test/java/org/opensearch/action/bulk/BulkRequestTests.java b/server/src/test/java/org/opensearch/action/bulk/BulkRequestTests.java index e68ab8c793004..fc1e133dc3901 100644 --- a/server/src/test/java/org/opensearch/action/bulk/BulkRequestTests.java +++ b/server/src/test/java/org/opensearch/action/bulk/BulkRequestTests.java @@ -47,6 +47,7 @@ import org.opensearch.core.xcontent.MediaTypeRegistry; import org.opensearch.core.xcontent.XContentBuilder; import org.opensearch.script.Script; +import org.opensearch.script.ScriptType; import org.opensearch.test.OpenSearchTestCase; import org.opensearch.transport.client.Requests; @@ -423,4 +424,27 @@ public void testBulkTerminatedByNewline() throws Exception { ); assertEquals(3, bulkRequestWithNewLine.numberOfActions()); } + + public void testScriptParamsAreIncludedInSize() { + BulkRequest bulkRequest = new BulkRequest(); + + UpdateRequest requestWithEmptyParams = new UpdateRequest("index", "id1"); + requestWithEmptyParams.script( + new Script(ScriptType.INLINE, Script.DEFAULT_SCRIPT_LANG, "test script", Collections.emptyMap()) + ); + bulkRequest.add(requestWithEmptyParams); + long sizeWithEmptyParams = bulkRequest.estimatedSizeInBytes(); + + UpdateRequest requestWithParams = new UpdateRequest("index", "id2"); + Map params = new HashMap<>(); + params.put("param1", "test_value"); + requestWithParams.script( + new Script(ScriptType.INLINE, Script.DEFAULT_SCRIPT_LANG, "test script", params) + ); + bulkRequest.add(requestWithParams); + long sizeWithParams = bulkRequest.estimatedSizeInBytes(); + + assertTrue(sizeWithParams > sizeWithEmptyParams); + assertTrue(sizeWithParams - sizeWithEmptyParams >= params.toString().length()); + } }