Skip to content

Commit daae8b8

Browse files
andystaplesCopilot
andauthored
Release durabletask 1.13.0 and Azure Functions 2.0.0rc4 (#321)
* Prepare durabletask 1.13.0 and Azure Functions 2.0.0rc4 releases Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * Focus release changelogs on user impact and upgrade risks Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
1 parent fe2d7d7 commit daae8b8

9 files changed

Lines changed: 145 additions & 107 deletions

File tree

‎.github/copilot-instructions.md‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ three packages:
3030
- When in doubt, write the changelog entry in terms of user impact (what users
3131
can now do or what behavior changed), not implementation mechanism (how it
3232
was implemented internally).
33+
- Keep entries focused on the capability or fix, its relevant default, and
34+
material compatibility or upgrade risks. Preserve actionable replay and
35+
breaking-change warnings, but keep API tutorials, implementation
36+
prescriptions, exhaustive edge cases, and workarounds in linked feature or
37+
API documentation. Narrow an overly broad claim rather than expanding it
38+
into a catalogue of exceptions.
3339
- Changelogs are not covered by the CI Markdown lint step. Review changes to
3440
them manually.
3541
- Use the current unindented changelog style: category labels such as `ADDED`,

‎CHANGELOG.md‎

Lines changed: 23 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -7,71 +7,58 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

88
## Unreleased
99

10+
## v1.13.0
11+
1012
ADDED
1113

1214
- Added `OrchestrationQuery.task_hub_names` to filter orchestration instances
1315
by one or more task hubs.
16+
- Added deterministic JSON-array serialization for sets and frozensets.
17+
Generic set reconstruction is opt-in through `JsonDataConverter`; enabling it
18+
for existing orchestrations can change replay behavior.
1419

1520
CHANGED
1621

1722
- Dropped Python 3.10 support. Python 3.11 or later is now required.
18-
- Removed the obsolete PyPI `asyncio` backport dependency; all supported
19-
Python versions use the standard-library module.
23+
- Removed the obsolete PyPI `asyncio` backport dependency.
2024
- Context managers now preserve subclass types in type checkers, including
2125
Azure Managed clients and workers.
2226
- Entity ID copy and pickle hooks now preserve subclass types in type checkers.
2327
- Multiple task completion callback failures now raise the built-in
2428
`ExceptionGroup`, preserving each exception and its traceback in memory and
25-
the first callback error as the explicit cause and serialized inner failure.
26-
A single callback failure is still raised directly.
29+
the first callback error as the cause. A single callback failure is still
30+
raised directly.
2731

2832
> [!WARNING]
2933
> The aggregate exception type and message have changed. Orchestrations that
3034
> branch on the old aggregate type or message can take a different path during
3135
> replay; drain affected instances on the previous SDK or use a separate task
32-
> hub for new instances. Branches on the aggregate's explicit first-error cause
33-
> retain their previous behavior.
36+
> hub for new instances.
3437
3538
FIXED
3639

3740
- Activity and sub-orchestration retry policies now honor
3841
`failureDetails.isNonRetriable`, surfacing the failure immediately without
39-
scheduling a retry timer or another attempt. Existing histories that already
40-
retried such failures can replay differently; drain affected instances on the
41-
previous SDK before upgrading.
42+
retrying. Existing histories that already retried such failures can replay
43+
differently; drain affected instances on the previous SDK before upgrading.
4244
- Grouped failures now retain nested exception messages, tracebacks, and notes
4345
in failure details, including `ExceptionGroup` failures from task callbacks.
44-
Traceback rendering is limited to 15 children per group and 10 group levels,
45-
with truncation markers for omitted diagnostics. Failure details do not
46-
serialize a complete structured tree of group children.
47-
- Optimized set and frozenset serialization, particularly for deeply nested
48-
frozensets and large singleton elements. JSON object names within sets are now
49-
ordered consistently after conversion to strings, including numeric names.
50-
Equivalent surrogate-pair and non-BMP object names retain the last value
51-
rather than emitting duplicate JSON properties.
52-
Set reconstruction remains opt-in.
53-
- With set reconstruction enabled, annotated sets of typed tuples are now
54-
recognized during input and activity-result discovery, and bare
55-
`collections.abc.Set` annotations reconstruct JSON arrays as concrete sets.
56-
- Implemented `__hash__` and `__repr__` for `EntityInstanceId`, making identity attributes immutable to guarantee hash stability when used in sets or dict keys.
57-
- Large-payload externalization now checks every eligible payload's maximum
58-
size before uploading or replacing any protobuf values, including carryover
59-
events and entity payloads, for both synchronous and asynchronous calls.
60-
Oversized messages remain unchanged and cause no uploads; their size error
61-
now takes precedence over hypothetical earlier storage failures.
46+
- Improved set and frozenset serialization performance and consistent JSON
47+
object-key handling.
48+
- `EntityInstanceId` is now hashable and has a diagnostic `repr`, allowing use
49+
in sets and as dictionary keys. Entity IDs are now immutable.
50+
- Oversized payloads now fail validation before any payload uploads or
51+
replacements occur.
6252
- Orchestrations that exceed the configured external payload storage limit now
6353
fail without retrying and release their entity locks, allowing other callers to
6454
progress. Transient payload-store failures remain retryable.
65-
- Previously unhandled non-cancellation `BaseException` exits, including result
66-
serialization and generator teardown failures, now fail with a clear reason instead of leaving an accepted dispatch
67-
unfinished. Cancellation and process-control signals retain their semantics.
68-
The gRPC worker abandons work that exits before an outcome is sent and resets
69-
the originating work-item stream after an uncertain completion or abandonment
70-
RPC, allowing scheduler ownership recovery without retrying an uncertain outcome.
55+
- Unexpected orchestration execution, result serialization, and teardown
56+
failures no longer leave accepted work unfinished. Cancellation and
57+
process-control signals retain their semantics.
7158
- Orchestrator generators are now closed at the end of each dispatch, including
72-
while waiting for durable work, releasing resources held by async bridges.
73-
`finally` blocks and context-manager exits can run before orchestration completion
74-
and repeat across dispatches; see [cleanup semantics](docs/supported-patterns.md#cleanup-in-orchestrator-finally-blocks).
59+
while waiting for durable work. `finally` blocks and context-manager exits can
60+
run before orchestration completion and repeat across dispatches; see
61+
[cleanup semantics](docs/supported-patterns.md#cleanup-in-orchestrator-finally-blocks).
7562
- Async cancellation raised by generator teardown no longer replaces dispatch
7663
responses or version-rejection abandonment.
7764

‎README.md‎

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,47 @@ The Azure Functions Durable provider requires Python 3.13 or later.
3232

3333
## Optional Features
3434

35+
### Task Hub Query Filters
36+
37+
Set `OrchestrationQuery.task_hub_names` to filter orchestration queries by one or
38+
more task hubs. The filter is available through synchronous and asynchronous
39+
core and Azure Managed clients; filtering support depends on the backend.
40+
41+
```python
42+
from durabletask.client import OrchestrationQuery
43+
44+
query = OrchestrationQuery(task_hub_names=["orders", "billing"])
45+
```
46+
47+
### Set Serialization
48+
49+
The default `JsonDataConverter` serializes sets and frozensets as JSON arrays
50+
ordered by their canonical JSON representation, not numeric order. For example,
51+
`{2, 10}` serializes as `[10, 2]`. To reconstruct annotated sets and frozensets
52+
instead of receiving lists, configure the same converter on clients and workers:
53+
54+
```python
55+
from durabletask.serialization import JsonDataConverter
56+
57+
converter = JsonDataConverter(enable_generic_sets=True)
58+
```
59+
60+
Pass it using the `data_converter` parameter on core or Azure Managed clients
61+
and workers. `enable_set_coercion=True` is an alias for the same option.
62+
Azure Functions uses its own shared codec rather than this converter.
63+
64+
> [!WARNING]
65+
> Set reconstruction is disabled by default to preserve the order and duplicates
66+
> of recorded JSON arrays. Enabling it for existing orchestrations can change
67+
> replay behavior. Iteration over reconstructed sets is not replay-safe; sort
68+
> values explicitly before using their order to schedule durable work.
69+
70+
### Entity IDs
71+
72+
`EntityInstanceId` values are immutable, hashable, and usable as dictionary keys
73+
or set elements. Construct a new ID to change an entity name or key; attribute
74+
assignment and deletion raise `AttributeError`.
75+
3576
### Large Payload Externalization
3677

3778
Install the `azure-blob-payloads` extra to automatically offload oversized orchestration payloads to

‎azure-functions-durable/CHANGELOG.md‎

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,49 +7,43 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## Unreleased
99

10+
## v2.0.0rc4
11+
1012
ADDED
1113

14+
- Added inherited `OrchestrationQuery.task_hub_names` support to filter
15+
orchestration instances by one or more task hubs.
1216
- Added `DFApp.configure_serialization(ensure_ascii=False)` to opt in to compact
13-
Unicode JSON across durable clients, orchestration and entity workers, activity
14-
bindings, and registered blueprints. The default remains ASCII-escaped JSON.
15-
The opt-in uses the shared codec's `ensure_ascii` option available in
16-
`azure-functions` v2.4.0b1; unsupported SDKs fail explicitly at configuration time.
17+
Unicode JSON for durable payloads. The default remains ASCII-escaped JSON.
1718

1819
CHANGED
1920

21+
- Updated the minimum `durabletask` dependency to v1.13.0.
2022
- Updated the minimum `azure-functions` dependency to v2.4.0b1.
21-
- With the corresponding core SDK update, client and worker context managers
22-
preserve Functions subclass types in type checkers. Python 3.13 remains the
23-
minimum supported version for this package.
24-
- With the corresponding core SDK update, multiple task completion callback
25-
failures raise the built-in `ExceptionGroup`; a single failure is still raised
26-
directly. The first callback error remains the explicit cause and serialized
27-
inner failure. Branches on the previous aggregate exception type or message
28-
can change during replay; see the [core upgrade warning](../CHANGELOG.md#unreleased).
23+
- Client and worker context managers now preserve Functions subclass types in
24+
type checkers. Python 3.13 remains the minimum supported version.
25+
- Multiple task completion callback failures now raise the built-in
26+
`ExceptionGroup`; a single failure is still raised directly. Branches on the
27+
previous aggregate type or message can change during replay; see the
28+
[core upgrade warning](../CHANGELOG.md#v1130).
2929

3030
FIXED
3131

32-
- With the corresponding core SDK update, activity and sub-orchestration retry
33-
policies, including compatibility `RetryOptions`, honor
34-
`failureDetails.isNonRetriable` and surface the failure immediately without retrying.
35-
Histories that already retried such failures can replay differently; drain
36-
affected instances on the previous SDK before upgrading.
37-
- With the corresponding core SDK update, grouped failures retain nested
38-
exception messages, tracebacks, and notes in failure details. Tracebacks are
39-
limited to 15 children per group and 10 group levels with truncation markers;
40-
group children are not serialized as a complete structured tree.
41-
- With the corresponding core `durabletask` SDK fix, oversized messages fail
42-
large-payload validation before any uploads or payload replacements. Size
43-
errors now take precedence over hypothetical earlier storage failures.
44-
- With the corresponding core `durabletask` SDK fix, previously unhandled non-cancellation
45-
`BaseException` exits from orchestration execution, result serialization, or teardown now produce a failed response
46-
with the exception's type, message, and stack trace instead of losing the response.
47-
- With the corresponding core `durabletask` SDK fix, orchestrator generators
48-
are closed at the end of each dispatch, including while waiting for durable work.
49-
See [cleanup semantics](../docs/supported-patterns.md#cleanup-in-orchestrator-finally-blocks)
50-
for repeated finalizers, discarded teardown actions/status, and yielding restrictions.
51-
- With the corresponding core `durabletask` SDK fix, async cancellation raised by
52-
generator teardown no longer replaces dispatch responses or version-rejection abandonment.
32+
- `EntityInstanceId` and the compatibility `EntityId` are now immutable and
33+
hashable, with a diagnostic `repr`.
34+
- Activity and sub-orchestration retry policies, including compatibility
35+
`RetryOptions`, now honor `failureDetails.isNonRetriable`. Histories that already
36+
retried such failures can replay differently; drain affected instances on the
37+
previous SDK before upgrading.
38+
- Grouped failures now retain nested exception messages, tracebacks, and notes.
39+
- Oversized payloads now fail validation before any uploads or replacements.
40+
- Unexpected orchestration execution, result serialization, and teardown
41+
failures now produce a failed response instead of losing the response.
42+
- Orchestrator generators are now closed at each dispatch boundary, so
43+
`finally` blocks and context-manager exits may run repeatedly before completion.
44+
See [cleanup semantics](../docs/supported-patterns.md#cleanup-in-orchestrator-finally-blocks).
45+
- Async cancellation during generator teardown no longer replaces dispatch
46+
responses or version-rejection abandonment.
5347

5448
## v2.0.0rc3
5549

‎azure-functions-durable/README.md‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ Key capabilities include durable orchestrations and sub-orchestrations, durable
3232
timers, external events, durable entities, retries, versioning, durable HTTP
3333
calls (`context.call_http(...)`), recurring scheduled tasks, and history export.
3434

35+
`DurableFunctionsClient` and `SyncDurableFunctionsClient` inherit
36+
`OrchestrationQuery.task_hub_names` for filtering orchestration queries by one
37+
or more task hubs. Filtering support depends on the backend.
38+
39+
`EntityInstanceId` and the compatibility `EntityId` are immutable and hashable,
40+
so they can be used as dictionary keys or set elements. Construct a new ID
41+
instead of assigning or deleting attributes on an existing ID.
42+
3543
## Unicode JSON serialization
3644

3745
By default, durable payloads preserve the shared `azure-functions` codec's

‎azure-functions-durable/pyproject.toml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta"
99

1010
[project]
1111
name = "azure-functions-durable"
12-
version = "2.0.0rc3"
12+
version = "2.0.0rc4"
1313
description = "Durable Task Python SDK provider implementation for Durable Azure Functions"
1414
keywords = [
1515
"durable",
@@ -30,7 +30,7 @@ requires-python = ">=3.13"
3030
license = {file = "LICENSE"}
3131
readme = "README.md"
3232
dependencies = [
33-
"durabletask[opentelemetry]>=1.12.0",
33+
"durabletask[opentelemetry]>=1.13.0",
3434
"azure-identity>=1.19.0",
3535
"azure-functions>=2.4.0b1"
3636
]

‎durabletask-azuremanaged/CHANGELOG.md‎

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,44 +7,46 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

88
## Unreleased
99

10+
## v1.13.0
11+
12+
ADDED
13+
14+
- Added inherited `OrchestrationQuery.task_hub_names` support to filter
15+
orchestration instances by one or more task hubs.
16+
- Added inherited deterministic set and frozenset serialization.
17+
Generic set reconstruction is opt-in through `JsonDataConverter`; enabling it
18+
for existing orchestrations can change replay behavior.
19+
1020
CHANGED
1121

22+
- Updated the minimum `durabletask` dependency to v1.13.0, including the
23+
`azure-blob-payloads` extra.
1224
- Dropped Python 3.10 support. Python 3.11 or later is now required.
13-
- With the corresponding core SDK update, client and worker context managers
14-
preserve Azure Managed subclass types in type checkers.
15-
- With the corresponding core SDK update, multiple task completion callback
16-
failures raise the built-in `ExceptionGroup`; a single failure is still raised
17-
directly. The first callback error remains the explicit cause and serialized
18-
inner failure. Branches on the previous aggregate exception type or message
19-
can change during replay; see the [core upgrade warning](../CHANGELOG.md#unreleased).
25+
- Client and worker context managers now preserve Azure Managed subclass types
26+
in type checkers.
27+
- Multiple task completion callback failures now raise the built-in
28+
`ExceptionGroup`; a single failure is still raised directly. Branches on the
29+
previous aggregate type or message can change during replay; see the
30+
[core upgrade warning](../CHANGELOG.md#v1130).
2031

2132
FIXED
2233

23-
- With the corresponding core SDK update, activity and sub-orchestration retry
24-
policies honor `failureDetails.isNonRetriable` and surface the failure immediately
25-
without retrying. Histories that already retried such failures can replay
26-
differently; drain affected instances on the previous SDK before upgrading.
27-
- With the corresponding core SDK update, grouped failures retain nested
28-
exception messages, tracebacks, and notes in failure details. Tracebacks are
29-
limited to 15 children per group and 10 group levels with truncation markers;
30-
group children are not serialized as a complete structured tree.
31-
- With the corresponding core `durabletask` SDK fix, oversized messages fail
32-
large-payload validation before any uploads or payload replacements. Size
33-
errors now take precedence over hypothetical earlier storage failures.
34-
- With the corresponding core `durabletask` SDK fix, orchestrations that exceed
35-
the configured external payload storage limit fail without retrying and release
36-
their entity locks. Transient payload-store failures remain retryable.
37-
- With the corresponding core `durabletask` SDK fix, previously unhandled
38-
non-cancellation `BaseException` exits, including result serialization failures,
39-
now fail with a clear reason. Cancellation and process-control
40-
exits recover dispatch ownership, and uncertain completion or abandonment RPCs
41-
reset the originating work-item stream rather than retaining unfinished work.
42-
- With the corresponding core `durabletask` SDK fix, orchestrator generators
43-
are closed at the end of each dispatch, including while waiting for durable work.
44-
See [cleanup semantics](../docs/supported-patterns.md#cleanup-in-orchestrator-finally-blocks)
45-
for repeated finalizers, discarded teardown actions/status, and yielding restrictions.
46-
- With the corresponding core `durabletask` SDK fix, async cancellation raised by
47-
generator teardown no longer replaces dispatch responses or version-rejection abandonment.
34+
- `EntityInstanceId` is now immutable and hashable, with a diagnostic `repr`.
35+
- Activity and sub-orchestration retry policies now honor
36+
`failureDetails.isNonRetriable`. Histories that already retried such failures
37+
can replay differently; drain affected instances on the previous SDK before
38+
upgrading.
39+
- Grouped failures now retain nested exception messages, tracebacks, and notes.
40+
- Oversized payloads now fail validation before any uploads or replacements.
41+
Orchestrations exceeding the external payload storage limit fail without
42+
retrying and release entity locks; transient payload-store failures remain
43+
retryable.
44+
- Unexpected orchestration failures no longer leave accepted work unfinished.
45+
- Orchestrator generators are now closed at each dispatch boundary, so
46+
`finally` blocks and context-manager exits may run repeatedly before completion.
47+
See [cleanup semantics](../docs/supported-patterns.md#cleanup-in-orchestrator-finally-blocks).
48+
- Async cancellation during generator teardown no longer replaces dispatch
49+
responses or version-rejection abandonment.
4850

4951
## v1.12.0
5052

‎durabletask-azuremanaged/pyproject.toml‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta"
99

1010
[project]
1111
name = "durabletask.azuremanaged"
12-
version = "1.12.0"
12+
version = "1.13.0"
1313
description = "Durable Task Python SDK provider implementation for the Azure Durable Task Scheduler"
1414
keywords = [
1515
"durable",
@@ -31,13 +31,13 @@ requires-python = ">=3.11"
3131
license = {file = "LICENSE"}
3232
readme = "README.md"
3333
dependencies = [
34-
"durabletask>=1.12.0",
34+
"durabletask>=1.13.0",
3535
"azure-identity>=1.19.0"
3636
]
3737

3838
[project.optional-dependencies]
3939
azure-blob-payloads = [
40-
"durabletask[azure-blob-payloads]>=1.12.0"
40+
"durabletask[azure-blob-payloads]>=1.13.0"
4141
]
4242

4343
[project.urls]

‎pyproject.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta"
99

1010
[project]
1111
name = "durabletask"
12-
version = "1.12.0"
12+
version = "1.13.0"
1313
description = "A Durable Task Client SDK for Python"
1414
keywords = [
1515
"durable",

0 commit comments

Comments
 (0)