Repository navigation
Exercise published SDK timers through restart and cooperative cancellation - #152
Merged
Merged
Conversation
This was referenced Oct 7, 2026
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.
Change
Adds one documented, repeatable published-artifact timer experiment for PHP, Python and Rust workflow workers. It checks twelve cells: normal completion, worker SIGKILL and cold replay after the timer fires, Server restart across the original deadline, and cooperative cancellation in each language. Every cell inspects actual persisted timer history and checks the public waiting/terminal state. Duplicate cancellation must retain its original identity and deadline, and a cancelled timer must remain unfired after its due time.
Reuses the existing Sample App workers and isolated Compose stack. The timer command removes its stack on success or failure and runs directly in a repository-local GitHub Actions job. It does not add another conformance coordinator.
The example tuple and both prepared Rust lockfiles now select the published Rust SDK with cooperative cancellation support. Its resolver explicitly accepts stable Rust 2.x and 3.x while preserving the other components' current supported versions and rejecting prereleases.
The interrupted timer run found that Rust's bounded poll retry contract exits during the Server outage. Published SDK 3.2.1 adds an explicit service-worker recovery option through durable-workflow/sdk-rust#69. This example opts into that recovery and negotiates cooperative cancellation in each timer worker. All twelve published cells passed before merge and again on merged main.
Part of durable-workflow/.github#122. This PR supplies the missing SDK timer paths. The broader experiment inventory remains open.
Validation
Shell syntax, exact tuple resolution in a Node container, and whitespace checks pass.
Forty-two Python metadata/verifier tests pass in a Python container. The new checks reject early fire, missing/duplicate durable events, wrong identities, rewritten original deadlines, replacement runs, downtime outside the original deadline and cancelled timers firing after their due time. The pending observer waits for both timer history and waiting status across their separate API reads.
Published timer run passes all twelve cells on
2544cd9c2ccb9828ae6eaf0e073182428eac1910, October 7, 22:58:11–23:04:11 UTC. Server 2.5.9 digestsha256:11c11e11498b63e644d906e43f49810a1bc0b5298f750734fe0edb279c622bca, PHP SDK 2.2.3, Python SDK 2.4.2, Rust SDK 3.2.1, CLI 2.1.3, Workflow 2.5.3 and Waterline 2.3.1.Each language passes normal completion, SIGKILL/cold replay, Server downtime crossing its original deadline and cooperative cancellation. All three cancellation runs converge as Cancelled, retain duplicate request identity/deadline and remain unfired after the timer's original due time.
Ordinary PHP 8.4/8.5 application and microservice checks, published polyglot journey, sample Compose and candidate container startup pass.
The merged-main timer repeat passes all twelve cells on
85f99cf80eae8b673c784885985fe0566f94acc7. All other merged-main workflows also pass.Published image qualification passes native amd64 and arm64 startup checks. Independent anonymous registry reads verify both GHCR and Docker Hub
mainand immutable tagsha-85f99cf80eae8b673c784885985fe0566f94acc7-run-37700272728-1at multi-platform digestsha256:32948877cf048baffa5369ef85105bf47d7c7d4611945e505151bc8b45cb1060, with the expected source/revision labels in both architecture configurations.No claim is made for concurrent timer groups, timer-bearing application upgrades or every cancellation scope permutation.