Repository navigation
Preserve pending operations across signal wakeups - #97
Merged
Merged
Conversation
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.
Problem
Addresses #96, delivered in 2.4.1 after published-artifact verification.
A signal waking a workflow with a pending scalar timer, remote activity or child
caused replay to emit that scheduling command again. Server allocated another
operation sequence. Timers acquired a later deadline, and the duplicate result
could collide with the next workflow operation during replay.
Change
reissuing it. New operations and local activity preparation keep their paths.
without a recorded delay.
for repeated signals, fresh worker replay, original completion, changed code,
legacy history and refusal to hide already duplicated timers.
cancellation identity, original authority, deadline and policy checks remain.
Verification
The unmodified published SDK reproduced duplicate timers on published Server
2.5.5 before image replacement and then failed replay on Server 2.5.6. The three
new scalar regression cases also fail against the unchanged source.
Local tests pass: 2,454 non-integration tests, plus 49 final regression/corpus
cases after adding the damaged-history refusal. The local corpus validator
passes with one new replay fixture. Ruff and mypy pass.
CI on
c209731093ef8aff51e099ccd635ea5d6248eb33passes Python 3.10, 3.11 and3.12, regression corpus, lint, package build/smoke, the developer portal and
public boundary checks. Connected integration passes:
https://github.com/durable-workflow/sdk-python/actions/runs/37582960588
Review checks the changed-code diagnostics before omitting a recorded command,
retains local activity preparation and leaves cancellation delivery ahead of
ordinary waiting. Shielded cleanup timers validate the original receipt and
authority without starting another timer. Existing damaged histories continue
to fail explicitly rather than being silently repaired.
Published 2.4.1
from merged source
7cae7f7395aded953d9f950442798c8e450cd4fc. Main qualificationand protected publication pass. Installed-package checks against immutable
Server 2.5.5 and 2.5.6 preserve the original pending timer, history, run identity
and 204800-byte external payload through signals and fresh workers. The waiting
run completes with total eighteen and one timer schedule/fire. Completed and
queued controls also complete correctly. The broader image exercise requires
PHP/Rust worker restarts and a guarded observer recovery.
Delivery details.
Issue #96 is closed after verification, and the merged GitHub branch is deleted.