Skip to content

v1.12.0

Latest

Choose a tag to compare

@andystaples andystaples released this 13 Oct 18:05
· 12 commits to main since this release
d9cf9e2

What's Changed

  • Add Python 3.15 support, by Bernd Verst (@berndverst) in #284
  • Fix when_all hanging when pending tasks are shared between groups or appear more than once in a group. Results preserve input order and duplicate positions without scheduling additional activities. Completed when_any groups stop observing losing children without disturbing other groups, and throwing completion callbacks no longer prevent other observers from being notified. By andystaples in #286
  • Reconstruct dataclasses with init=False fields as their declared type rather than falling back to a dictionary. Handwritten constructors still receive serialized non-init fields they accept as keywords; other non-init fields use defaults, default factories, or __post_init__ and may reset recorded values. Use an explicit from_json() hook to preserve recorded state that the constructor cannot accept. By Shubham Padkonde (@Shubham-Padkonde) in #283
  • Explicitly target orchestrations rather than entities in single-instance purge_orchestration() requests from both synchronous and asynchronous clients, by andystaples in #279
  • Prevent timer callbacks from scheduling additional long-timer chunks, retrying activities or sub-orchestrations, or resuming orchestrator code after completion, failure, termination, or continue-as-new. Work scheduled before the terminal state is preserved. By andystaples in #280
  • Preserve the global arrival order of unconsumed buffered external events across different event names when using continue_as_new(..., save_events=True), by andystaples in #278
  • Carry external events arriving after continue_as_new(..., save_events=True) into the next execution instead of losing them to abandoned waits. Events already delivered to live waits are not carried over, and save_events=False still discards unprocessed events. By andystaples in #281

Warning

Replay-breaking bug fix: Shared nested races can select a different direct child during replay. For example, with first = when_any([timer, work]) and second = when_any([first, timer]), timer completion now notifies first, allowing second to select first rather than timer. Existing downstream history can then fail replay with NonDeterminismError. Disjoint task groups are unchanged.

Drain affected instances on the previous SDK, or keep their task hub on the previous SDK and use a separate task hub for new instances. Already-stuck instances may need deliberate recovery. Pin or lock the core durabletask dependency, including when using a provider. The coordinated provider releases require durabletask v1.12.0 or later and adopt this correction.

External Links

New Contributors

Full Changelog: v1.11.0...v1.12.0