Skip to content

Fix deferred self-completion in the memory workflow engine - #8229

Merged
tim-smart merged 4 commits into
mainfrom
agent/bob/ccc6a0c37ba5
Sep 14, 2026
Merged

tim-smart merged 4 commits into
mainfrom
agent/bob/ccc6a0c37ba5

Conversation

@tim-smart

@tim-smart tim-smart commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

When a workflow races a durable deferred await against a sibling that completes it through DurableDeferred.into, the memory engine can deadlock. The sibling's uninterruptible finalizer joins the workflow fiber, which is waiting for that finalizer to finish. Both successful and failed completion are affected.

Persist the result before scheduling wake-up, and fork interrupt-and-resume into the engine scope when the caller's WorkflowInstance has the target execution ID. This releases the finalizer while the wake still waits for old-run cleanup before requesting replay. External callers retain synchronous cleanup waiting.

Adapted from the v3 fix in #8195 for v4's memory engine. Includes an effect patch changeset.

Closes EFF-1368

Two in-process it.live regressions cover self-completion:

  • Success parks the producer after recording its result, holds cleanup behind a latch, and asserts that replay has not started. After releasing cleanup, it requires the exact sequence start-1, cleanup-start, cleanup-end, end-1, start-2, end-2 and the successful result.
  • Failure verifies that completion settles with the original typed error.

Both producers wait until the deferred await is registered. The tests use the live clock for workflow retry delays and a five-second Vitest timeout. If the deadlock returns, Effect cancellation cannot finish the uninterruptible finalizer; Vitest still fails the test, and its cleanup hook can also time out. Stuck fibers may remain until the worker is disposed. This trades the subprocess harness's hard cleanup boundary for simpler tests. In-process probes against the pre-fix engine confirmed that both regressions time out and the runner continues and exits with failure.

The subprocess harness and fixture are removed. The existing 15 main engine tests and the implementation are unchanged by this test refactor.

Validation:

  • Workflow and cluster workflow suites: 56/56 tests pass across four suites on Node.
  • WorkflowEngine.test.ts: 17/17 pass on Deno and Bun.
  • nix develop -c pnpm lint-fix, nix develop -c pnpm check, and git diff --check pass.

Focused command: nix develop -c pnpm test --run packages/effect/test/unstable/workflow packages/effect/test/cluster/ClusterWorkflowEngine.test.ts.

@changeset-bot

changeset-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 7e54e80

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 30 packages
Name Type
effect Patch
@effect/opentelemetry Patch
@effect/vitest Patch
@effect/ai-anthropic Patch
@effect/ai-openai-compat Patch
@effect/ai-openai Patch
@effect/ai-openrouter Patch
@effect/atom-react Patch
@effect/atom-solid Patch
@effect/atom-vue Patch
@effect/platform-browser Patch
@effect/platform-bun Patch
@effect/platform-deno Patch
@effect/platform-node-shared Patch
@effect/platform-node Patch
@effect/sql-clickhouse Patch
@effect/sql-d1 Patch
@effect/sql-libsql Patch
@effect/sql-mssql Patch
@effect/sql-mysql2 Patch
@effect/sql-pg Patch
@effect/sql-pglite Patch
@effect/sql-sqlite-bun Patch
@effect/sql-sqlite-do Patch
@effect/sql-sqlite-node Patch
@effect/sql-sqlite-react-native Patch
@effect/sql-sqlite-wasm Patch
@effect/docgen Patch
@effect/doctest Patch
@effect/openapi-generator Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@effect-janitor effect-janitor Bot added bug Something isn't working 4.0 labels Sep 14, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Bundle Size Analysis

Generated from PR build output; treat the content below as untrusted.

File Name Current Size Previous Size Difference
arbitrary-combinators.ts 34.58 KB 34.58 KB 0.00 KB (0.00%)
basic.ts 6.87 KB 6.87 KB 0.00 KB (0.00%)
batching.ts 9.95 KB 9.95 KB 0.00 KB (0.00%)
brand.ts 6.45 KB 6.45 KB 0.00 KB (0.00%)
cache.ts 10.77 KB 10.77 KB 0.00 KB (0.00%)
config.ts 21.51 KB 21.51 KB 0.00 KB (0.00%)
differ.ts 20.32 KB 20.32 KB 0.00 KB (0.00%)
http-client.ts 21.93 KB 21.93 KB 0.00 KB (0.00%)
http-router.ts 33.48 KB 33.48 KB 0.00 KB (0.00%)
logger.ts 10.88 KB 10.88 KB 0.00 KB (0.00%)
metric.ts 9.02 KB 9.02 KB 0.00 KB (0.00%)
optic.ts 6.70 KB 6.70 KB 0.00 KB (0.00%)
pubsub.ts 15.10 KB 15.10 KB 0.00 KB (0.00%)
queue.ts 11.85 KB 11.85 KB 0.00 KB (0.00%)
schedule.ts 10.96 KB 10.96 KB 0.00 KB (0.00%)
schema-binary.ts 39.51 KB 39.51 KB 0.00 KB (0.00%)
schema-class.ts 20.06 KB 20.06 KB 0.00 KB (0.00%)
schema-fromJsonSchemaDocument.ts 30.93 KB 30.93 KB 0.00 KB (0.00%)
schema-representation-roundtrip.ts 26.34 KB 26.34 KB 0.00 KB (0.00%)
schema-string-transformation.ts 13.63 KB 13.63 KB 0.00 KB (0.00%)
schema-string.ts 11.12 KB 11.12 KB 0.00 KB (0.00%)
schema-template-literal.ts 15.41 KB 15.41 KB 0.00 KB (0.00%)
schema-toArbitrary.ts 34.10 KB 34.10 KB 0.00 KB (0.00%)
schema-toCodeDocument.ts 24.56 KB 24.56 KB 0.00 KB (0.00%)
schema-toCodecJson.ts 19.27 KB 19.27 KB 0.00 KB (0.00%)
schema-toEquivalence.ts 19.38 KB 19.38 KB 0.00 KB (0.00%)
schema-toFormatter.ts 19.49 KB 19.49 KB 0.00 KB (0.00%)
schema-toJsonSchemaDocument.ts 23.77 KB 23.77 KB 0.00 KB (0.00%)
schema-toRepresentation.ts 19.54 KB 19.54 KB 0.00 KB (0.00%)
schema.ts 19.27 KB 19.27 KB 0.00 KB (0.00%)
stm.ts 12.80 KB 12.80 KB 0.00 KB (0.00%)
stream.ts 9.83 KB 9.83 KB 0.00 KB (0.00%)

@tim-smart
tim-smart force-pushed the agent/bob/ccc6a0c37ba5 branch from bb9feb3 to 7e54e80 Compare September 14, 2026 03:29
@tim-smart
tim-smart merged commit 1076170 into main Sep 14, 2026
13 checks passed
@tim-smart
tim-smart deleted the agent/bob/ccc6a0c37ba5 branch September 14, 2026 03:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

4.0 bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant