This is an automated email from the ASF dual-hosted git repository. github-merge-queue[bot] pushed a commit to branch gh-readonly-queue/main/pr-6858-226124bb66491b2abccb02269cf23ebaf151bb84 in repository https://gitbox.apache.org/repos/asf/texera.git
commit 25b208388100c49280eb6511f50c330db7b711aa Author: ali risheh <[email protected]> AuthorDate: Thu Aug 20 20:35:55 2026 +0000 fix: raise default WebSocket payload limit to avoid dropping large result frames (#6858) ### What changes were proposed in this PR? Raises the default maximum workflow WebSocket message size from **64 KB to 1024 KB (1 MB)**, in every place the default is encoded: - `common/config/src/main/resources/application.conf` — the base config default (`web-server.max-workflow-websocket-request-payload-size-kb`) - `bin/k8s/values.yaml` — the Helm chart env default (`MAX_WORKFLOW_WEBSOCKET_REQUEST_PAYLOAD_SIZE_KB`), which overrides the base default in Kubernetes deployments - `bin/k8s/values-development.yaml` — the same env var in the development chart, which otherwise kept reproducing #6857 - `common/config/src/test/scala/.../ApplicationConfigSpec.scala` — the guard test asserting the default `WebsocketPayloadSizeTuner` applies this value to the Jetty WebSocket container's max text/binary message buffer. At the previous 64 KB default, the result/status frame pushed to the browser for a workflow with many operators or a sizable visualization payload (e.g. a Bar Chart) could exceed 65536 bytes; Jetty then drops the entire frame with `MessageTooLargeException`, so the final result/visualization never reaches the frontend even though the execution completes successfully on the backend. The overshoot is often only a couple KB, so even modest workflows can trip it. 1 MB gives ample headroom for large visualization payloads while remaining well within reasonable WebSocket frame sizes. This changes only a default value; the limit remains overridable via the `MAX_WORKFLOW_WEBSOCKET_REQUEST_PAYLOAD_SIZE_KB` environment variable. ### Any related issues, documentation, discussions? Closes #6857 ### How was this PR tested? Updated the existing guard test in `ApplicationConfigSpec` (`maxWorkflowWebsocketRequestPayloadSizeKb shouldBe 1024`), which covers the base config default. Manually verified the runtime behavior. Ran a workflow ending in a Bar Chart whose serialized result frame exceeded 64 KB: - **Before:** the visualization did not render, and the computing unit logged `MessageTooLargeException: ... too large for configured max of [65536]` at completion. - **After:** the frame is delivered and the chart renders. Also verified with `helm template` that the rendered chart env value updates to `1024` and that both charts still render cleanly. ### Was this PR authored or co-authored using generative AI tooling? Generated-by: Claude Opus 4.8 --------- Signed-off-by: ali <[email protected]> Co-authored-by: Yicong Huang <[email protected]> Co-authored-by: Claude Opus 5 (1M context) <[email protected]> --- .../org/apache/texera/web/resource/WebsocketPayloadSizeTuner.scala | 2 +- bin/k8s/values-development.yaml | 2 +- bin/k8s/values.yaml | 2 +- common/config/src/main/resources/application.conf | 2 +- .../scala/org/apache/texera/common/config/ApplicationConfigSpec.scala | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/amber/src/main/scala/org/apache/texera/web/resource/WebsocketPayloadSizeTuner.scala b/amber/src/main/scala/org/apache/texera/web/resource/WebsocketPayloadSizeTuner.scala index 92c7ad87f0..3fa032db5b 100644 --- a/amber/src/main/scala/org/apache/texera/web/resource/WebsocketPayloadSizeTuner.scala +++ b/amber/src/main/scala/org/apache/texera/web/resource/WebsocketPayloadSizeTuner.scala @@ -21,7 +21,7 @@ package org.apache.texera.web.resource import javax.servlet.{ServletContextEvent, ServletContextListener} import javax.websocket.server.ServerContainer -class WebsocketPayloadSizeTuner(maxKB: Int) // by default, 64 KiB +class WebsocketPayloadSizeTuner(maxKB: Int) // by default, 1 MiB extends ServletContextListener { override def contextInitialized(sce: ServletContextEvent): Unit = { diff --git a/bin/k8s/values-development.yaml b/bin/k8s/values-development.yaml index aa64d6ecbc..f2f885f105 100644 --- a/bin/k8s/values-development.yaml +++ b/bin/k8s/values-development.yaml @@ -307,7 +307,7 @@ texeraEnvVars: - name: SCHEDULE_GENERATOR_ENABLE_COST_BASED_SCHEDULE_GENERATOR value: "true" - name: MAX_WORKFLOW_WEBSOCKET_REQUEST_PAYLOAD_SIZE_KB - value: "64" + value: "1024" - name: MAX_NUM_OF_RUNNING_COMPUTING_UNITS_PER_USER value: "10" - name: KUBERNETES_COMPUTING_UNIT_CPU_LIMIT_OPTIONS diff --git a/bin/k8s/values.yaml b/bin/k8s/values.yaml index 9c37d3b408..907c212cb6 100644 --- a/bin/k8s/values.yaml +++ b/bin/k8s/values.yaml @@ -310,7 +310,7 @@ texeraEnvVars: - name: SCHEDULE_GENERATOR_ENABLE_COST_BASED_SCHEDULE_GENERATOR value: "true" - name: MAX_WORKFLOW_WEBSOCKET_REQUEST_PAYLOAD_SIZE_KB - value: "64" + value: "1024" - name: MAX_NUM_OF_RUNNING_COMPUTING_UNITS_PER_USER value: "10" - name: KUBERNETES_COMPUTING_UNIT_CPU_LIMIT_OPTIONS diff --git a/common/config/src/main/resources/application.conf b/common/config/src/main/resources/application.conf index c7a7af2418..d5f7ffed2e 100644 --- a/common/config/src/main/resources/application.conf +++ b/common/config/src/main/resources/application.conf @@ -90,7 +90,7 @@ web-server { clean-all-execution-results-on-server-start = false clean-all-execution-results-on-server-start = ${?WEB_SERVER_CLEAN_ALL_EXECUTION_RESULTS_ON_SERVER_START} - max-workflow-websocket-request-payload-size-kb = 64 + max-workflow-websocket-request-payload-size-kb = 1024 max-workflow-websocket-request-payload-size-kb = ${?MAX_WORKFLOW_WEBSOCKET_REQUEST_PAYLOAD_SIZE_KB} } diff --git a/common/config/src/test/scala/org/apache/texera/common/config/ApplicationConfigSpec.scala b/common/config/src/test/scala/org/apache/texera/common/config/ApplicationConfigSpec.scala index 8a16a8d48e..5c18bff3fa 100644 --- a/common/config/src/test/scala/org/apache/texera/common/config/ApplicationConfigSpec.scala +++ b/common/config/src/test/scala/org/apache/texera/common/config/ApplicationConfigSpec.scala @@ -131,7 +131,7 @@ class ApplicationConfigSpec extends AnyFlatSpec with Matchers { ApplicationConfig.cleanupAllExecutionResults shouldBe false ) ifUnset("MAX_WORKFLOW_WEBSOCKET_REQUEST_PAYLOAD_SIZE_KB")( - ApplicationConfig.maxWorkflowWebsocketRequestPayloadSizeKb shouldBe 64 + ApplicationConfig.maxWorkflowWebsocketRequestPayloadSizeKb shouldBe 1024 ) }
