Repository navigation
Apply the configured XCom backend to language SDK task XComs - #75184
Draft
jason810496 wants to merge 3 commits into
Draft
jason810496 wants to merge 3 commits into
jason810496 wants to merge 3 commits into
Conversation
TypeScript, Go and Java tasks sent their XComs to the API server without the configured XCom backend. They read the stored reference of a value that a Python task wrote, such as an S3 path, instead of the value, their own values stayed in the metadata database, and clearing a try left stored objects behind. The backend runs in a helper process started like a Python task process, so the long-lived worker process keeps none of its state, such as a cached filesystem that a task process forked from it later cannot use. Co-Authored-By: Claude <noreply@anthropic.com>
A Go task only logged a failed push of its return value and still succeeded, so downstream tasks found no result. With an XCom backend, a failed write to the backend's storage would drop the result the same way. Co-Authored-By: Claude <noreply@anthropic.com>
No e2e test checked that TypeScript, Go and Java tasks store and read their XComs through the configured XCom backend. The new lang_sdk_xcom_object_storage mode runs one Dag definition in each language SDK with XComObjectStorageBackend on LocalStack, and checks the stored objects and the values the tasks read back. Co-Authored-By: Claude <noreply@anthropic.com>
jason810496
force-pushed
the
feature/lang-sdk/xcom-backend-in-coordinator
branch
from
October 20, 2026 06:20
5fa6540 to
e77b09a
Compare
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
Run the configured
[core] xcom_backendat the supervisor, so TypeScript, Go and Java tasks store, read and purge XComs through it like Python tasks.How
SetXCom,GetXCom,GetXComSequenceItem,GetXComSequenceSlice,DeleteXCom) and on the XComs it clears when a try starts. With the defaultBaseXCom, requests go to the API server unchanged.[core] execute_tasks_new_python_interpreter). So the long-lived worker process keeps none of the backend's state, such as a cachedS3FileSystemthat a Python task forked from it later could not use.store_value, and a loaded value is encoded with serde again.skipmixin_keybypasses the backend, as it does for Python tasks.execution_timeoutor the server stops the task.lang_sdk_xcom_object_storagee2e mode runs a Dag definition in each of TypeScript, Go and Java withXComObjectStorageBackendon LocalStack.No SDK change is needed, since all three runtimes only talk to the supervisor. With this config, TypeScript, Go and Java tasks read and write offloaded XComs like Python tasks:
Lifecycle
sequenceDiagram participant R as Runtime (TS, Go, Java) participant S as Supervisor participant H as XCom backend process participant A as API server participant O as Object storage Note over S,H: H starts on the first call the backend handles,<br/>by fork, or by exec on macOS or with execute_tasks_new_python_interpreter S->>A: get and delete the XComs of the earlier try S->>H: purge(row) H->>O: delete object R->>S: SetXCom(key, value) S->>H: store(coordinate, key, value) H->>S: GetConnection S-->>H: Connection (from A) H->>O: write value H-->>S: s3://... reference S->>A: set the XCom row to the reference R->>S: GetXCom(task_id, key) S->>A: get the XCom row S->>H: load(row) H->>O: read value H-->>S: value S-->>R: value Note over S,H: While a call runs, S keeps heartbeating, and kills H<br/>when the task reaches execution_timeout or the server stops it R->>S: exits S->>H: exitWas generative AI tooling used to co-author this PR?
Generated-by: Claude Code (Opus 5.5) following the guidelines