·
5 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
This release strengthens cluster membership consistency, extends cooperative cancellation across framework APIs, and gives streaming applications more control over subscription start positions and dequeue sizes. This release also fixes SQLite persistence under contention, modernizes request-latency metrics, improves serialization and source-generation efficiency, and expands the preview journaling and Durable Jobs capabilities.
Compatibility and upgrade notes
Important
Review the SQLite query updates and metric schema changes when upgrading.
- Refresh existing SQLite persistence queries (#11354). SQLite writes now use a single implicit transaction, preserving atomicity and durable clears when pooled connections encounter writer contention. Reapply the 10.4.0 SQLite main script and SQLite persistence script to existing databases to install the corrected queries. Both scripts are idempotent and preserve grain state.
- Update request-latency dashboards and exporter configuration (#11251). Application request latency is now a standard
Histogram<double>namedorleans-app-requests-latency, measured in fractional milliseconds. It replaces the separateorleans-app-requests-latency-bucket,-count, and-suminstruments and theirdurationattribute. Configure histogram boundaries through an OpenTelemetry View and update dashboards, alerts, and recording rules for the exporter representation. Use matching boundaries across instances whose distributions are aggregated. - Use canonical grain-type metric dimensions (#11253).
orleans-grainsnow usesgrain_type, containing the canonicalGrainId.Typeidentity, in place oftype, which contained the CLR implementation name. Activation lifecycle metrics also gain this dimension. Update queries and label filters accordingly. - Review explicitly numbered RPC parameters (#11179). RPC parameter
[Id]attributes now control serialized argument IDs, and automatic IDs count serialized parameters. PlaceCancellationTokenlast. Existing contracts with parameter[Id]attributes or non-last cancellation tokens can change argument wire IDs relative to 10.3.1; coordinate their client/silo contract upgrade or introduce versioned contracts. Method-level[Id]attributes and ordinary unannotated, token-last contracts retain their existing identities and argument numbering. - Review preview journaling API changes (#11211, #11276, #11319). Journaling and Durable Jobs packages continue as
10.4.0-alpha.1. Custom integrations should adopt the updated durable-state/state-machine contracts and streamed catalog enumeration APIs. Named-provider migration is an opt-in capability for moving Durable Jobs between storage backends; existing default-provider convenience registrations remain available.
Highlights
Runtime, clustering, and reminders
- Consistent membership across providers. Core membership and the Azure Storage, Cosmos DB, DynamoDB, Consul, Redis, Cassandra, Firestore, ADO.NET, and ZooKeeper implementations strengthen atomic updates, canonical snapshots, and heartbeat handling. ZooKeeper preserves consistent snapshot reads under contention, and Firestore preserves atomic membership reads (#11307, #11309, #11317, #11342, #11387).
- Cancellation-aware framework contracts. Trailing cancellation tokens flow through runtime, reminder, streaming, transaction, management, and other framework operations. Legacy overloads and stable wire aliases preserve existing implementations and established framework call identities (#10937).
- More efficient manifest retrieval. Content-addressed retrieval is enabled by default, allowing silos to reuse immutable manifests by canonical SHA-256 hash and repair missing metadata from peers.
ClusterManifestOptions.EnableContentAddressedRetrievalselects the retrieval mode (#11239). - Stronger lifecycle handling. Shutdown drains admitted connection-establishment and client-observer work; reminder startup and topology reconciliation are better ordered; directory recovery deactivates duplicate activations; and idle migrated activations are collected (#11263, #11264, #11118, #11030, #11365).
Streaming
- Choose where subscriptions begin.
StreamSubscriptionStartPosition.LatestandEarliestAvailableprovide per-subscription control, with a provider default throughStreamPullingAgentOptions.InitialSubscriptionStartPosition.EarliestAvailablestarts at the oldest retained message for the stream in the local queue cache. An explicit sequence token takes precedence, andLatestremains the default. Enable the new controls after pulling-agent silos have been upgraded (#10936). - Better recovery and handoffs. Typed cache-cursor results, provider-encoded offsets, and a reusable checkpoint state machine improve provider recovery. SQS and Azure Queue handoffs release messages, recovery preserves prefetched batches and pooled-buffer ownership, and pulling agents drain detached work during shutdown (#9714, #11153, #11154, #11062, #11144, #11268).
- Tune memory-stream dequeue sizes. Per-provider
MemoryStreamCacheOptions.MaxAddCountcontrols the maximum number of queue records requested per dequeue, allowing applications to balance response size and queue-call overhead. The default remains 100 (#11238).
Persistence and transactions
- SQLite persistence returns scalar versions and recovers cleanly from writer contention. Relational providers also receive normalized integer reads, corrected PostgreSQL persistence scripts, and Oracle defunct-silo cleanup support (#11322, #11354, #11283, #11247, #11246).
- Transaction participant locks honor transaction timeouts, aborted queued lock operations are removed, and recovery cleanup tasks are awaited (#10457, #10455, #11188).
- DynamoDB providers honor configured endpoint credentials, bind token and profile options, and redact tokens in logs. Provider configuration validation and invariant text handling are strengthened across storage and clustering integrations (#11292, #11290, #11288).
Preview journaling and Durable Jobs
- S3 Express One Zone journal storage.
Microsoft.Orleans.Journaling.S3adds append-based write-ahead logs, conditional metadata/checkpoint publication, catalog discovery, and provider metrics. A conditional-rewrite mode supports S3-compatible development environments (#10161). - Composable, named journal providers. Grains can compose durable state through the updated APIs, while named providers bind storage, catalogs, and state-manager factories together. Catalog enumeration streams results, and recovery serializes retries while preserving persistence failures (#11279, #11275, #11211, #11326).
- Controlled Durable Jobs provider migration. Select an active provider for new shards and draining providers for existing jobs, inspect storage before retirement, and retain saved job handles across the cutover. Shard discovery uses start-time ordering, and shutdown drains scheduling and releases running shards. Queue wake-ups and flush signals are coalesced (#11277, #11258, #11301, #11103, #11206).
Serialization, code generation, and deployment
- Improved NativeAOT building blocks. Generated C# codecs and copiers use ref-returning
UnsafeAccessormethods for private, readonly, and backing fields on supported targets. Grain activation constructors are preserved, non-generic grain references gain native construction, and serialization constructors can initialize existing objects under NativeAOT. Default serializer activation uses a shared construction path with consistent exception propagation (#11372, #11383, #11371, #11373, #11390). - Opt-in serializer Hot Reload. Set
<OrleansHotReload>true</OrleansHotReload>to generate stable member/dependency identities and lazily initialize dependencies added to existing serializers and copiers. Supported updates add strongly typed serialized members to classes and records; restart to refresh manifests when adding new polymorphic or collection-element types (#10932). - Correct compound-aliased array resolution. Polymorphic arrays and arrays nested in closed generic types deserialize correctly, with the existing writer bytes preserved (#11392).
- Less repeated work and copying. The generator caches library types per compilation, serialization-attribute analysis skips generated code, contiguous JSON payloads are read directly, and buffered tail reads avoid repeated page traversal. Metadata discovery also supports single-file deployment (#11363, #11384, #11270, #11209, #11054).
Observability and developer tooling
- Request latency uses native histogram aggregation, while canonical, cached grain-type dimensions make activation populations and lifecycle events easier to correlate (#11251, #11253).
- Dashboard state inspection reuses JSON options, and its statistics timer follows the grain-service lifecycle. Orleans templates now include Copilot instructions (#11190, #11359, #11006).
Microsoft.Orleans.Clustering.TestKitprovides framework-neutral membership-provider conformance scenarios and generated operation histories for validating custom providers (#11308).
What's Changed
- fix(reminders): observe completed retries before timeout by @ReubenBond in #10916
- fix(transactions): honor transaction timeout for participant locks by @ReubenBond in #10457
- fix(runtime): quiesce client route publication before shutdown by @ReubenBond in #10917
- test(placement): stabilize activation rebalancing startup by @ReubenBond in #10930
- fix(analyzers): create missing Orleans contract manifests by @ReubenBond in #10915
- fix(testing): synchronize in-process cluster logging by @ReubenBond in #10929
- fix(testing): scope diagnostic observers to test clusters by @ReubenBond in #10945
- feat(codegen): support stable field naming and hot reload by @koenbeuk in #10932
- test(serialization): cover segmented buffer traversal by @ReubenBond in #10964
- test(runtime): cover expired directory lease cleanup by @ReubenBond in #10960
- test(aws): cover DynamoDB configuration by @ReubenBond in #10952
- test(analyzers): cover contract code fix edge cases by @ReubenBond in #10956
- test(streaming): cover subscription lifecycle by @ReubenBond in #10957
- test(journaling): cover legacy recovery contracts by @ReubenBond in #10959
- refactor(diagnostics): remove unreachable messaging events by @ReubenBond in #10951
- test(testing): cover TestingHost lifecycle branches by @ReubenBond in #10958
- perf(runtime): optimize version selector cache under cluster churn by @ReubenBond in #10946
- fix(testing): stabilize reminder topology boundaries by @ReubenBond in #10933
- fix(runtime): synchronize stateless worker status by @ReubenBond in #10968
- fix(serialization): allow well-known generic arguments by @ReubenBond in #10970
- fix(testing): preserve deterministic reminder cleanup by @ReubenBond in #10974
- test(security): cover TLS hosting and duplex pipes by @ReubenBond in #10963
- perf(serialization): avoid delimiter array allocations by @ReubenBond in #10966
- ci: compare coverage with current main by @ReubenBond in #10948
- chore(deps-dev): bump browserslist from 4.28.4 to 4.28.8 in /src/Dashboard/Orleans.Dashboard.App by @dependabot[bot] in #10977
- test(redis): cover journaling provider builder by @ReubenBond in #10975
- test(serialization): cover mutable tuple copying by @ReubenBond in #10987
- chore: use CFS package proxies by @ReubenBond in #10981
- perf: enforce CA1849 async diagnostics by @ReubenBond in #11002
- test: centralize NSubstitute analyzers by @ReubenBond in #10993
- ci: add analyzer audit lanes by @ReubenBond in #10988
- ci: expand scheduled CodeQL analysis by @ReubenBond in #10984
- build: modernize Roslyn analyzers by @ReubenBond in #10991
- feat(streaming): add subscription start position by @ReubenBond in #10936
- chore: enforce analyzer baseline by @ReubenBond in #10996
- perf: enforce CA1848 logging diagnostics by @ReubenBond in #11000
- perf: enforce CA1873 logging guards by @ReubenBond in #10999
- feat: add cancellation-aware RPC contracts by @ReubenBond in #10937
- test(streaming): cover stream identity JSON contracts by @ReubenBond in #11007
- test(event-sourcing): cover synchronization and recovery by @ReubenBond in #11009
- test(analyzers): cover ConfigureAwait analyzer branches by @ReubenBond in #11008
- test(testing): cover grain directory convergence observer by @ReubenBond in #11010
- test(runtime): cover grain directory registration handoff by @ReubenBond in #11014
- perf: enforce CA2002 lock diagnostics by @ReubenBond in #11001
- test(aws): cover DynamoDB storage mutations by @ReubenBond in #11011
- fix(test): skip unconfigured ADO.NET fixtures by @ReubenBond in #11015
- fix(testing): separate reminder refresh barriers by @ReubenBond in #11021
- test(journaling): synchronize legacy recovery repair by @ReubenBond in #11019
- feat(templates): add Orleans Copilot instructions by @ReubenBond in #11006
- fix(testing): isolate reminder topology timeout by @ReubenBond in #11017
- fix(test): pass cancellation tokens in handoff tests by @ReubenBond in #11040
- build: add banned API policy by @ReubenBond in #10995
- test: make message TTL serialization deterministic by @ReubenBond in #11018
- test: stabilize Cosmos reminder manifest convergence by @ReubenBond in #11029
- perf: enforce CA2000 ownership diagnostics by @ReubenBond in #11003
- docs: enforce public API documentation by @ReubenBond in #10992
- fix(directory): deactivate recovery duplicates by @ReubenBond in #11030
- ci: enforce whitespace formatting by @ReubenBond in #10986
- fix(cosmos): retry transient reminder reads by @ReubenBond in #11031
- docs(streaming): document subscription start positions by @ReubenBond in #11025
- build: broaden banned API policy by @ReubenBond in #11046
- fix(runtime): harden lifecycle lock identity by @ReubenBond in #11050
- fix(aws): use invariant DynamoDB clustering text by @ReubenBond in #11051
- fix: support single-file metadata discovery by @ReubenBond in #11054
- fix(core): enforce disposable ownership by @ReubenBond in #11052
- fix(docs): forward async stream cancellation token by @ReubenBond in #11072
- fix(core): make interface mapping trim-safe by @ReubenBond in #11055
- fix(testing): support single-file standalone silos by @ReubenBond in #11068
- fix(aws): use invariant DynamoDB state serialization by @ReubenBond in #11056
- test(reminders): stabilize singleton startup topology by @ReubenBond in #11067
- ci: fix invalid cfs-npm Dependabot registry configuration by @ReubenBond in #11079
- test(analyzers): stabilize temporary directory cleanup by @ReubenBond in #11069
- fix(build): resolve analyzer enforcement blockers by @ReubenBond in #11080
- test(streaming): await failure detection before lease recovery by @ReubenBond in #11081
- test: synchronize async enumerable deactivation by @ReubenBond in #11084
- test(durable-jobs): stabilize shard start timing assertion by @ReubenBond in #11065
- fix(test): synchronize receiver stream delivery by @ReubenBond in #11061
- test(reminders): stabilize TestKit topology startup by @ReubenBond in #11064
- fix(ci): avoid provider apt refreshes by @ReubenBond in #11085
- test: allow expected client directory error during rolling restart by @ReubenBond in #11078
- ci: diagnose Dashboard npm terminations by @ReubenBond in #11066
- fix(reminders): enforce lifecycle provider consistency by @ReubenBond in #10908
- chore(deps-dev): bump @humanfs/node from 0.16.7 to 0.16.8 in /src/Dashboard/Orleans.Dashboard.App by @dependabot[bot] in #10976
- chore(deps-dev): bump fast-uri from 3.1.5 to 3.1.6 in /docs/site by @dependabot[bot] in #10978
- ci: centralize Dashboard asset builds in tests by @ReubenBond in #11070
- test(reminders): stabilize legacy topology convergence by @ReubenBond in #11082
- fix(ci): preserve artifact upload failures by @ReubenBond in #11086
- fix(transactions): remove aborted queued lock operations by @ReubenBond in #10455
- fix(testing): await reminder startup topology by @ReubenBond in #11063
- ci: validate package compatibility by @ReubenBond in #10994
- fix(ci): pin SQL Server test image by @ReubenBond in #11090
- fix(benchmarks): register adaptive ping grain types by @ReubenBond in #11092
- fix(docs): stabilize validation timeouts by @ReubenBond in #11091
- fix(durable-jobs): prevent duplicate queue entries by @ReubenBond in #11097
- fix(streaming): recover cache misses from oldest data by @BMagerMT in #9711
- ci: capture Linux net8 test coordinator crashes by @ReubenBond in #11096
- test(reminders): isolate exact-due recovery setup by @ReubenBond in #11105
- test(analyzers): stabilize repository target contract by @ReubenBond in #11104
- fix(azure): validate reminder options by @ReubenBond in #11101
- fix(azure): use invariant clustering text by @ReubenBond in #11107
- ci: retain failed test diagnostics by @ReubenBond in #11102
- fix(test): update MTP to 2.4.0 by @ReubenBond in #11110
- ci: run macOS tests daily by @ReubenBond in #11112
- fix(dashboard): use deterministic text handling by @ReubenBond in #11100
- test(runtime): stabilize manual activation collection by @ReubenBond in #11117
- fix(testing): avoid redundant reminder topology refresh by @ReubenBond in #11116
- test(placement): synchronize static rebalancing observations by @ReubenBond in #11113
- test(placement): fix state preservation flake by @ReubenBond in #11114
- fix(serialization): make reflection trim-safe by @ReubenBond in #11115
- fix(cosmos): validate reminder options by @ReubenBond in #11099
- fix(redis): validate clustering options by @ReubenBond in #11098
- fix(streaming): release SQS messages during handoff by @ReubenBond in #11062
- fix(ci): collect coverage on Linux .NET 10 by @ReubenBond in #11087
- test(reminders): isolate local owner update path by @ReubenBond in #11109
- fix(docs): allowlist SQS permissions reference by @ReubenBond in #11129
- fix(runtime): retain observer cancellation until dispatch by @ReubenBond in #11111
- fix(reminders): order topology reconciliation admission by @ReubenBond in #11118
- fix(ci): preserve retry policy across nested test actions by @ReubenBond in #11131
- fix(redis): validate grain directory inputs by @ReubenBond in #11127
- fix(reminders): await queued startup range changes by @ReubenBond in #11132
- ci: disable macOS builds by @ReubenBond in #11134
- fix(azure): validate transaction storage inputs by @ReubenBond in #11125
- fix(storage): validate memory storage inputs by @ReubenBond in #11124
- fix(azure): validate grain directory inputs by @ReubenBond in #11126
- fix(firestore): validate grain directory inputs by @ReubenBond in #11121
- test(runtime): synchronize forwarded cancellation by @ReubenBond in #11143
- fix(azure): validate grain storage inputs by @ReubenBond in #11139
- fix(serialization): validate test kit inputs by @ReubenBond in #11140
- fix(zookeeper): validate clustering inputs by @ReubenBond in #11138
- test(reminders): isolate exact-due delivery refresh by @ReubenBond in #11145
- test(runtime): make one-way deactivation setup deterministic by @ReubenBond in #11147
- fix(streaming): preserve prefetched recovery batches by @ReubenBond in #11149
- refactor(runtime): encapsulate ActivationData synchronization by @ReubenBond in #10068
- fix(reminders): validate test kit inputs by @ReubenBond in #11137
- fix(cosmos): validate clustering setup by @ReubenBond in #11122
- feat(journaling): add S3 Express storage provider by @ReubenBond in #10161
- perf(durable-jobs): reduce queue wake-ups by @ReubenBond in #11103
- test(runtime): keep grain call filter observers alive by @ReubenBond in #11142
- fix(streaming): release Azure Queue messages during handoff by @ReubenBond in #11144
- fix(analyzers): enforce ordinal string comparisons by @ReubenBond in #11150
- fix(analyzers): expand CA1062 provider coverage by @ReubenBond in #11157
- refactor(streaming): add typed cache cursor results by @BMagerMT in #9714
- fix(analyzers): expand CA1062 library coverage by @ReubenBond in #11160
- fix(analyzers): validate transaction test kit inputs by @ReubenBond in #11161
- test(runtime): remove stateless worker directory race by @ReubenBond in #11163
- test(reminders): isolate range-read gate ownership by @ReubenBond in #11148
- fix: define CA1815 value semantics by @ReubenBond in #11166
- fix(analyzers): enforce disposable field ownership by @ReubenBond in #11167
- fix(core): preserve DI constructors when trimming by @ReubenBond in #11170
- fix(serialization): validate codec arguments by @ReubenBond in #11168
- fix(analyzers): enforce CA1062 for Cosmos and S3 by @ReubenBond in #11171
- fix(streaming): validate boundary arguments by @ReubenBond in #11172
- fix(serialization): validate support contracts by @ReubenBond in #11174
- fix(journaling): validate JSON codec contracts by @ReubenBond in #11176
- fix(core): validate boundary arguments by @ReubenBond in #11178
- fix(journaling): use ordinal identifier comparisons by @ReubenBond in #11177
- fix(runtime): order ring range notifications by @ReubenBond in #11182
- test(runtime): derive one-way topology from directory owner by @ReubenBond in #11181
- fix(codegen): honor RPC parameter field IDs by @ReubenBond in #11179
- fix(reminders): preserve cleanup failures by @ReubenBond in #11195
- fix(runtime): specify continuation schedulers by @ReubenBond in #11194
- perf(dashboard): cache grain state JSON options by @ReubenBond in #11190
- test(analyzers): isolate nested restore from feeds by @ReubenBond in #11199
- test(runtime): allocate heterogeneous silo ports at startup by @ReubenBond in #11201
- fix(test): retry SQL Server setup ownership race by @ReubenBond in #11202
- fix(test): skip unavailable providers by @ReubenBond in #11200
- fix(transactions): await recovery cleanup tasks by @ReubenBond in #11188
- test(reminders): stabilize range-change barrier by @ReubenBond in #11197
- docs: document formatting verification by @ReubenBond in #11198
- fix(runtime): use messaging clock for callback expiry by @ReubenBond in #11180
- perf(durable-jobs): coalesce flush signals by @ReubenBond in #11206
- perf(serialization): optimize buffered tail reads by @ReubenBond in #11209
- fix: avoid virtual calls during construction by @ReubenBond in #11196
- fix(ci): update SourceLink packages flagged by NU1902 by @ReubenBond in #11216
- feat(journaling)!: stream catalog enumeration by @ReubenBond in #11211
- fix: report exact ring cardinality and cover range boundaries by @ReubenBond in #11221
- fix(streaming): preserve pooled cache buffer ownership by @ReubenBond in #11152
- feat(streaming): support provider-encoded cache offsets by @ReubenBond in #11153
- feat(streaming): add reusable checkpoint state machine by @ReubenBond in #11154
- fix(streaming): satisfy checkpoint state analyzer by @ReubenBond in #11227
- fix(streaming): migrate encoded-offset cache tests to result APIs by @ReubenBond in #11230
- chore(deps): bump svgo from 4.0.2 to 4.1.0 in /docs/site by @dependabot[bot] in #11214
- chore(deps): bump astro from 7.1.3 to 7.2.10 in /docs/site by @dependabot[bot] in #11224
- chore(deps): bump @vitest/mocker and vitest in /docs/site by @dependabot[bot] in #11228
- chore(deps): bump sharp from 0.35.3 to 0.35.4 in /docs/site by @dependabot[bot] in #11232
- chore(deps): bump smol-toml from 1.7.0 to 1.8.0 in /docs/site by @dependabot[bot] in #11234
- fix(docs): tolerate transient GitHub link throttling by @ReubenBond in #11229
- fix(ci): retry stalled coverage uploads by @ReubenBond in #11215
- fix(streaming): recover legacy sequence tokens by @ReubenBond in #11155
- ci: retry transient NuGet metadata restore failures by @ReubenBond in #11218
- ci: retry S3 test image pulls by @ReubenBond in #11231
- feat(streaming): configure memory stream dequeue limits by @ReubenBond in #11238
- docs: remove unrelated POCO grains section from migration guide by @ReubenBond in #11240
- fix(runtime): honor membership and load cancellation lifetimes by @ReubenBond in #11237
- test(s3): use SeaweedFS by @ReubenBond in #11252
- fix(test): retain SQL setup ownership across batches by @ReubenBond in #11245
- chore(deps): bump js-yaml from 4.3.1 to 4.3.2 in /docs/site by @dependabot[bot] in #11233
- fix(ci): retry transient test coordinator failures by @ReubenBond in #11244
- chore: add safe PR rebase and readiness reporting script by @ReubenBond in #11236
- feat(manifest): enable content-addressed retrieval by default by @ReubenBond in #11239
- fix(streaming): await dropped client cleanup by @ReubenBond in #11260
- feat(metrics): add canonical cached grain-type dimensions by @ReubenBond in #11253
- feat(metrics): use native request latency histogram by @ReubenBond in #11251
- fix(durable-jobs): drain scheduling and activation on shutdown by @ReubenBond in #11256
- fix(adonet): align PostgreSQL persistence script with its migration by @ranma42 in #11247
- fix(adonet): add missing CleanupDefunctSiloEntriesKey to Oracle clustering by @ranma42 in #11246
- perf: streamline request context import by @ReubenBond in #11212
- fix: drain connection establishment during shutdown by @ReubenBond in #11263
- feat(durable-jobs): discover shards by start time by @ReubenBond in #11258
- refactor(reminders): gate reminder delivery admission by @ReubenBond in #11262
- fix(streaming): advance checkpoints past drained subscriptions by @fickleEfrit in #11249
- fix(journaling): bound Azure Table catalog key literals by @ReubenBond in #11257
- fix: drain admitted client observer invocations during shutdown by @ReubenBond in #11264
- refactor: gate client route publication quiescence by @ReubenBond in #11266
- refactor: gate ADO.NET receiver work by @ReubenBond in #11265
- fix(streaming): remove defunct stream publishers by @ReubenBond in #10532
- refactor: simplify transaction storage draining by @ReubenBond in #11267
- fix(streaming): drain detached pulling-agent work by @ReubenBond in #11268
- feat(journaling): measure catalog traversal and provider retries by @ReubenBond in #11259
- fix(test): avoid SQL Server single-user setup by @ReubenBond in #11271
- perf(serialization): read contiguous JSON payloads directly by @ReubenBond in #11270
- perf(journaling): benchmark Azure storage providers by @ReubenBond in #11261
- feat(journaling): support named storage providers by @ReubenBond in #11275
- build: upgrade xUnit to 4.0.0 by @ReubenBond in #11274
- fix(journaling)!: recover failed operations in new activations by @ReubenBond in #11276
- fix(adonet): normalize integer reads by @ReubenBond in #11283
- chore(deps): bump dotnet-sdk from 10.0.400 to 10.0.401 by @dependabot[bot] in #11281
- feat(durable-jobs): support journal provider migration by @ReubenBond in #11277
- fix(test): update MTP to 2.4.1 by @ReubenBond in #11299
- fix(test): bind scheduler stress grains to their activation context by @ReubenBond in #11302
- fix(durable-jobs): unregister running shards during shutdown by @ReubenBond in #11301
- fix(samples): isolate Razor compilation in CI by @ReubenBond in #11298
- test: capture Windows net10 host diagnostics by @ReubenBond in #11300
- test(adonet): drain reconnect workers during setup teardown by @ReubenBond in #11297
- fix(streaming): validate NATS stream dimensions by @ReubenBond in #11293
- fix(aws): redact DynamoDB tokens by @ReubenBond in #11288
- fix(streaming): redact NATS endpoint credentials in logs by @ReubenBond in #11291
- fix(streaming): bound NATS producer selection by @ReubenBond in #11287
- fix(aws): bind DynamoDB token and profile options by @ReubenBond in #11290
- fix(aws): honor DynamoDB endpoint credentials by @ReubenBond in #11292
- fix(testing): cancel draining after fatal silo errors by @ReubenBond in #11294
- fix(journaling): activate configured journal providers by @ReubenBond in #11289
- feat(runtime): add shared grain activation setup by @ReubenBond in #11305
- fix(membership): preserve canonical membership views by @ReubenBond in #11296
- feat(journaling): support composition on plain grains by @ReubenBond in #11279
- fix(ci): update coverage collector to 18.11.2 by @ReubenBond in #11321
- chore(deps): bump devalue from 5.8.2 to 5.9.2 in /docs/site by @dependabot[bot] in #11320
- fix(adonet): return scalar SQLite persistence versions by @ReubenBond in #11322
- fix(consul): preserve membership consistency by @ReubenBond in #11314
- fix(redis): preserve membership consistency by @ReubenBond in #11313
- fix(aws): preserve DynamoDB membership consistency by @ReubenBond in #11310
- fix(zookeeper): preserve membership consistency by @ReubenBond in #11316
- fix(cassandra): preserve membership consistency by @ReubenBond in #11315
- fix(membership): preserve core membership invariants by @ReubenBond in #11307
- feat(testing): add membership provider conformance kit by @ReubenBond in #11308
- fix(ci): select latest test-result artifacts by creation time by @ReubenBond in #11329
- fix(azure): preserve membership consistency by @ReubenBond in #11309
- fix(firestore): preserve membership consistency by @ReubenBond in #11311
- fix(cosmos): preserve membership consistency by @ReubenBond in #11312
- fix(adonet): preserve membership consistency by @ReubenBond in #11317
- revert(streaming): revert drained-subscription checkpoint advancement by @ReubenBond in #11330
- refactor(journaling): separate durable state and journal APIs by @ReubenBond in #11319
- fix(clustering): synchronize torn point-read fault injection by @ReubenBond in #11334
- fix(testing): handle narrow reminder owner ranges by @ReubenBond in #11336
- refactor(testing): guarantee reminder owner placement by @ReubenBond in #11337
- fix(testing): tolerate cancellation during client kill by @ReubenBond in #11339
- fix(zookeeper): make membership reads sequential and resilient by @ReubenBond in #11338
- test(membership): wire provider conformance suites by @ReubenBond in #11332
- ci: suppress dotnet coverage logo by @ReubenBond in #11340
- ci: remove ZooKeeper failure diagnostics by @ReubenBond in #11341
- test(streaming): stabilize publisher restart endpoint by @ReubenBond in #11343
- fix(journaling): serialize recovery retries and preserve persistence failures by @ReubenBond in #11326
- fix(firestore): preserve atomic membership reads by @ReubenBond in #11342
- test(zookeeper): make close ordering assertion deterministic by @ReubenBond in #11347
- fix(codegen): escape reserved C# keywords in generated metadata namespace by @akashchamp in #11349
- fix(testing): avoid dynamic client port allocation by @ReubenBond in #11348
- fix(docs): serialize Windows Astro output by @ReubenBond in #11357
- perf(codegen): cache LibraryTypes per compilation by @koenbeuk in #11363
- ci: pin Consul GCR mirror with Docker Hub fallback by @ReubenBond in #11366
- fix: collect idle migrated grain activations by @ReubenBond in #11365
- ci(aot): centralize NativeAOT smoke coverage by @ReubenBond in #11367
- fix(dashboard): stop statistics timer with grain service by @KSemenenko in #11359
- fix(aot): preserve grain activation constructors by @ReubenBond in #11383
- perf(analyzers): skip generated code in GenerateSerializationAttributesAnalyzer by @koenbeuk in #11384
- feat(codegen): generate AOT-safe C# private field accessors by @ReubenBond in #11372
- fix(serialization): support NativeAOT default activation by @ReubenBond in #11369
- fix(serialization): initialize serialization constructors under NativeAOT by @ReubenBond in #11373
- fix(core): construct grain references without dynamic code by @ReubenBond in #11371
- fix(zookeeper): preserve snapshot reads under contention by @ReubenBond in #11387
- fix(serialization): resolve compound-aliased array type names by @ReubenBond in #11392
- refactor(serialization): unify default object activation by @ReubenBond in #11390
- fix(adonet): prevent SQLite transaction leaks by @ReubenBond in #11354
- test(codegen): cover readonly record struct init setters by @ReubenBond in #11393
New Contributors
- @ranma42 made their first contribution in #11247
- @akashchamp made their first contribution in #11349
- @KSemenenko made their first contribution in #11359
Full Changelog: v10.3.1...v10.4.0