Skip to content

Bump the nuget-weekly group with 2 updates - #149

Open
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/nuget/nuget-weekly-d0a6fb4866
Open

Bump the nuget-weekly group with 2 updates#149
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/nuget/nuget-weekly-d0a6fb4866

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Aug 6, 2026

Copy link
Copy Markdown
Contributor

Updated WolverineFx from 6.24.2 to 6.24.7.

Release notes

Sourced from WolverineFx's releases.

6.24.7

This is a fix release. Its centre of gravity is agent assignment: a leader that re-decided the same placements every cycle, and — hidden underneath that churn — a serial stop path that made every rebalance far slower than it needed to be.

Agent assignment converges much faster

#​3852 — the leader re-decided placements it had already made. The GH-3698 pending-assignment ledger armed on a ReassignAgent but could never apply one: an agent being moved is still listed in its source node's persisted ActiveAgents, so the guard that skips agents with a known original node skipped every reassignment. GH-3698 closed this hole for first-time placement and left it open for moves.

On a 512-database / 5-node / ~8,700-agent cluster that reproduced as 3,468 decisions every cycle against a frozen snapshot, indefinitely — matching the ~45,000 decisions over six minutes reported from production. It converged in spite of itself, because the batched command carries set-based value equality and the dispatcher collapses an identical re-emitted batch while its lane is busy, so it read as benign. The telemetry was not deduplicated at all: AssignmentsChanged fires before batching, so every one of those decisions wrote an AssignmentChanged node record.

The churn was concealing a second defect. StartAgents got bounded parallelism back in GH-3604 — a 50-agent chunk started one at a time was seconds of dead wall-clock that blew the reply window. The stop side is the same shape and never got it: a plain foreach, so at AgentStartBatchSize = 50 an entire chunk's stop cost ran in series before a single start could cascade. It survived only because the per-cycle churn was trickling agents onto the destination alongside the batch. Fixing the churn exposed it.

Measured against the 512-database reproduction:

6.24.6 ledger fix only 6.24.7
work reaching fresh nodes 38.0s 74.1s 14.0s
full convergence 176.3s 176.3s 31.1s

Net 5.7x faster to converge than 6.24.6, not merely quieter.

#​3850 — the cached node-number release is now bounded by a high-water mark, so a newcomer's messages cannot be released by a stale cache. Follow-up to GH-3846.

Node-number lookups happen once per node instead of once per database (#​3847, thanks @​erdtsieck) — a real saving on multi-database deployments, where the old shape scaled with the shard count.

Durability/projection affinity now reports whether it engaged

#​3785 shipped in 6.24.5: a shard database's durability agent follows that database's event-subscription agents, so the database attracts one node's connection pool instead of two.

That join is deliberately fail-silent — a miss falls back to the even spread, because a miss is never wrong, only not-better. The problem is diagnostic: a join that never fires because the two descriptor pipelines spell the same database differently looks exactly like the feature working, minus the benefit. Verifying it meant joining pg_stat_activity against the assignment table on a live cluster.

It now says so directly, once, when the numbers change:

Durability/projection database affinity (GH-3785) co-located 446 of 446 durability agents
with their database's event subscription agents across 446 databases

and escalates to a warning in the one unambiguous case — projection agents present, database-bearing durability agents present, zero matched. On a multi-database store that is a spelling divergence, not a coincidence. An application with no projections has nothing to follow and stays quiet.

Transport and listener fixes

#​3832 — a deliberately paused listener now reports the distinct ListeningStatus.Paused instead of being indistinguishable from back-pressure TooBusy. The contract now matches what the code actually does.

#​3842RabbitMqListener.CreateAsync no longer dereferences a null Channel when the agent is disposed mid-startup.

Testing and build

  • #​3799 — Pulsar tests share one digest-pinned broker per job rather than starting a heavy container per worker process on an unpinned :latest, which used to hang silently when Docker ran out of memory.
  • #​3800 — the CloudEvents compliance harness carries an exception type name rather than an Exception, so dead-lettering by exception type can actually be tested; ErrorCausingMessage never round-tripped through System.Text.Json.
  • #​3839 / #​3841 — the solution builds every project, including two shipping packages that previously compiled only during Pack, and the Polecat incident-service sample (whose tests had not compiled since April, with nothing noticing).

... (truncated)

6.24.6

A bug-fix release. The headline is a message ordering regression affecting every transport built on BatchedSender — if you rely on FIFO ordering anywhere, this release matters to you.

Highlights

Message ordering restored in BatchedSender (#​3825). BatchedSender ran its serializing stage at Environment.ProcessorCount, so envelopes reached the batching block in serialization-completion order rather than enqueue order.

This was a silent regression from the switch off TPL Dataflow. ActionBlock defaults MaxDegreeOfParallelism to 1 — ordered by default — and the Channels rewrite raised it without the ordering guarantee being restated anywhere. The block was ordered for years, then quietly wasn't. The practical effect: FIFO ordering was not honored under Azure Service Bus sessions, SQS FIFO message groups, or global partitioning, on every transport that uses BatchedSender. Nothing was lost; messages arrived out of order. Fixed by returning the stage to a degree of parallelism of 1 — everything downstream was already serial.

A second, independent defect fell out of the same investigation: TrackedSession.AllRecordsInOrder() sorted by SessionTime, which is ElapsedMilliseconds — whole milliseconds. An entire receive batch ties, and the stable sort then fell back to enumerating a Guid-keyed cache with no relation to real order. Every ordering assertion in the test suite was at the mercy of this. Records now carry a monotonic sequence number.

Back-pressure now works on the right number, and says what it is (#​3831, jasperfx#​632). A latched listener logged exactly one too busy line and then nothing — forever. An operator watching a queue grow for 40 minutes could not distinguish "still draining" from "wedged". Underneath that, the count a PartitionProcessingByGroupId endpoint latched and resumed against was wrong: the downstream block holding the backlog was invisible to it, so Count reported zero for work that was really there.

  • BackPressureAgent logs a periodic warning while a listener stays latched, carrying the queue count and the restart threshold the resume decision is made from.
  • The timer-driven check is exception-safe. A throw during an attempted resume was an unobserved ValueTask fault, and the listener silently never resumed.
  • BufferedReceiver/DurableReceiver wire the receiving block's OnError to ILogger. A terminally-faulted block freezes the queue count and permanently latches the listener; that now logs at Critical instead of vanishing to stderr.

A tenanted Azure Service Bus endpoint could not send at all (#​3826) — tenanted or untenanted. TenantedSender deliberately does not implement ISenderRequiresCallback, but callback registration did not recurse, so a BatchedSender underneath it kept a null callback and threw InvalidOperationException: This sender has not been registered. on every batch. The tenanted path now uses inline senders, matching how Redis, MQTT, and Pub/Sub already worked around this.

Oracle queue identity round-trip (#​3820). System.Uri lowercases the authority component while Oracle uppercases its queue identifiers, so ToOracleQueue() resolved a second endpoint over the same physical tables. Also fixes a dead final-attempt error handler: a when clause that included the loop counter made the descriptive exception at the bottom of the retry loop unreachable.

Behavior change worth reading

TrackedSession now completes only when all conditions are satisfied, not the first (#​3824). This is a public testing API. A tracked session configured with several expectations previously returned as soon as any one of them was met, which means some existing tests were passing vacuously. After upgrading, such a test waits for every condition — and may now fail where it previously passed. That failure is generally revealing a real gap rather than introducing one.

Other changes

  • JasperFx upgraded to 2.39.5. Beyond the block Count fix above, this carries jasperfx#​600/#​601 — the application-assembly stack walk could adopt a test-runner assembly and then scan an assembly holding none of your types — and jasperfx#​599, where DatabaseId's escaping now survives a System.Uri round trip.
  • EventSubscriptionAgentFamily.DatabaseKeyOf and TenantNeutralKeyOf are now public (#​3819).

Testing and CI

No runtime behavior changes here, but this is why the fixes above became findable. The Category=Flaky exclusion list went from 12 tagged classes to zero (#​3763) — and several of those tags turned out to have been added in the very commit that introduced the feature they test, hiding working code rather than broken code. Every CI readiness gate now fails loudly instead of warning and continuing; the Kafka gate in particular was a no-op that passed in 0.0s against a broker that would not serve metadata for another 3 seconds (#​3814). The retry ledger records why a test flaked rather than only which one (#​3787), and CIAzureServiceBus was sharded three ways on measured per-class durations (#​3790).

What's Changed

6.24.5

Note: 6.24.4 shipped on NuGet without a GitHub release, so these notes cover everything since V6.24.3.

Highlights

Multi-database projection & subscription assignment got a major reliability pass. For sharded event stores, Wolverine assigns the agents for projections and subscriptions in groups by database — so connection pools scale with the number of databases rather than nodes × databases:

  • A blue/green rollout carrying a projection version bump no longer assigns the new version's agents to nodes that cannot build them — previously the new version could never start anywhere for the whole rollout (#​3792, thanks @​erdtsieck). A split database now costs exactly one owner per version.
  • Database affinity is now a property of the database across agent families (#​3785): a shard database's durability agent follows that database's projection agents onto the same node, so the database attracts one node's connection pool instead of two. Measured on a 512-database production cluster, 73% of databases were split across two nodes, wasting ~425 connection slots. Expect a one-time wave of durability-agent reassignments on first deploy as an existing cluster converges.
  • The settled assignment state is now pinned as a fixed point — re-evaluating a converged cluster moves nothing — and a new deterministic simulation drives the real leader evaluation through the exact deploy shape of GH-3753: slow agent starts and a blue/green capability split at once.

Durable outbox to SNS/SQS FIFO destinations is fixed (#​3793): EnvelopeSerializer never round-tripped Envelope.DeduplicationId, so any envelope recovered from durable storage after an outage was re-sent without MessageDeduplicationId and rejected deterministically by a FIFO destination without content-based deduplication — retrying forever or dead-lettering. Also fixed alongside it: the circuit-resume ping could never reach a FIFO destination (a latched sender could never unlatch), and SNS sent MessageDeduplicationId to standard topics, which AWS rejects. The same fix is merged to the 5.x maintenance branch and will ship in the next 5.40.x release for .NET 8 users.

Balanced-mode host shutdown no longer hangs (#​3781): stopping a node while agent commands were queued could pay a full agent-batch reply window per queued command — measured at 17+ minutes. Now ~2 minutes on the same reproduction.

Azure Service Bus conventional routing sanitizes entity names (#​3786): a handler for an array message type (e.g. Handle(Foo[])) produced an illegal ASB entity name that broke broker startup for the whole assembly, and the real reason was lost. Names are sanitized and failures now carry the offending name.

What's Changed

Full Changelog: JasperFx/wolverine@V6.24.3...V6.24.5

6.24.3

What's Changed

New Contributors

Full Changelog: JasperFx/wolverine@V6.24.2...V6.24.3

Commits viewable in compare view.

Updated WolverineFx.RuntimeCompilation from 6.24.2 to 6.24.7.

Release notes

Sourced from WolverineFx.RuntimeCompilation's releases.

6.24.7

This is a fix release. Its centre of gravity is agent assignment: a leader that re-decided the same placements every cycle, and — hidden underneath that churn — a serial stop path that made every rebalance far slower than it needed to be.

Agent assignment converges much faster

#​3852 — the leader re-decided placements it had already made. The GH-3698 pending-assignment ledger armed on a ReassignAgent but could never apply one: an agent being moved is still listed in its source node's persisted ActiveAgents, so the guard that skips agents with a known original node skipped every reassignment. GH-3698 closed this hole for first-time placement and left it open for moves.

On a 512-database / 5-node / ~8,700-agent cluster that reproduced as 3,468 decisions every cycle against a frozen snapshot, indefinitely — matching the ~45,000 decisions over six minutes reported from production. It converged in spite of itself, because the batched command carries set-based value equality and the dispatcher collapses an identical re-emitted batch while its lane is busy, so it read as benign. The telemetry was not deduplicated at all: AssignmentsChanged fires before batching, so every one of those decisions wrote an AssignmentChanged node record.

The churn was concealing a second defect. StartAgents got bounded parallelism back in GH-3604 — a 50-agent chunk started one at a time was seconds of dead wall-clock that blew the reply window. The stop side is the same shape and never got it: a plain foreach, so at AgentStartBatchSize = 50 an entire chunk's stop cost ran in series before a single start could cascade. It survived only because the per-cycle churn was trickling agents onto the destination alongside the batch. Fixing the churn exposed it.

Measured against the 512-database reproduction:

6.24.6 ledger fix only 6.24.7
work reaching fresh nodes 38.0s 74.1s 14.0s
full convergence 176.3s 176.3s 31.1s

Net 5.7x faster to converge than 6.24.6, not merely quieter.

#​3850 — the cached node-number release is now bounded by a high-water mark, so a newcomer's messages cannot be released by a stale cache. Follow-up to GH-3846.

Node-number lookups happen once per node instead of once per database (#​3847, thanks @​erdtsieck) — a real saving on multi-database deployments, where the old shape scaled with the shard count.

Durability/projection affinity now reports whether it engaged

#​3785 shipped in 6.24.5: a shard database's durability agent follows that database's event-subscription agents, so the database attracts one node's connection pool instead of two.

That join is deliberately fail-silent — a miss falls back to the even spread, because a miss is never wrong, only not-better. The problem is diagnostic: a join that never fires because the two descriptor pipelines spell the same database differently looks exactly like the feature working, minus the benefit. Verifying it meant joining pg_stat_activity against the assignment table on a live cluster.

It now says so directly, once, when the numbers change:

Durability/projection database affinity (GH-3785) co-located 446 of 446 durability agents
with their database's event subscription agents across 446 databases

and escalates to a warning in the one unambiguous case — projection agents present, database-bearing durability agents present, zero matched. On a multi-database store that is a spelling divergence, not a coincidence. An application with no projections has nothing to follow and stays quiet.

Transport and listener fixes

#​3832 — a deliberately paused listener now reports the distinct ListeningStatus.Paused instead of being indistinguishable from back-pressure TooBusy. The contract now matches what the code actually does.

#​3842RabbitMqListener.CreateAsync no longer dereferences a null Channel when the agent is disposed mid-startup.

Testing and build

  • #​3799 — Pulsar tests share one digest-pinned broker per job rather than starting a heavy container per worker process on an unpinned :latest, which used to hang silently when Docker ran out of memory.
  • #​3800 — the CloudEvents compliance harness carries an exception type name rather than an Exception, so dead-lettering by exception type can actually be tested; ErrorCausingMessage never round-tripped through System.Text.Json.
  • #​3839 / #​3841 — the solution builds every project, including two shipping packages that previously compiled only during Pack, and the Polecat incident-service sample (whose tests had not compiled since April, with nothing noticing).

... (truncated)

6.24.6

A bug-fix release. The headline is a message ordering regression affecting every transport built on BatchedSender — if you rely on FIFO ordering anywhere, this release matters to you.

Highlights

Message ordering restored in BatchedSender (#​3825). BatchedSender ran its serializing stage at Environment.ProcessorCount, so envelopes reached the batching block in serialization-completion order rather than enqueue order.

This was a silent regression from the switch off TPL Dataflow. ActionBlock defaults MaxDegreeOfParallelism to 1 — ordered by default — and the Channels rewrite raised it without the ordering guarantee being restated anywhere. The block was ordered for years, then quietly wasn't. The practical effect: FIFO ordering was not honored under Azure Service Bus sessions, SQS FIFO message groups, or global partitioning, on every transport that uses BatchedSender. Nothing was lost; messages arrived out of order. Fixed by returning the stage to a degree of parallelism of 1 — everything downstream was already serial.

A second, independent defect fell out of the same investigation: TrackedSession.AllRecordsInOrder() sorted by SessionTime, which is ElapsedMilliseconds — whole milliseconds. An entire receive batch ties, and the stable sort then fell back to enumerating a Guid-keyed cache with no relation to real order. Every ordering assertion in the test suite was at the mercy of this. Records now carry a monotonic sequence number.

Back-pressure now works on the right number, and says what it is (#​3831, jasperfx#​632). A latched listener logged exactly one too busy line and then nothing — forever. An operator watching a queue grow for 40 minutes could not distinguish "still draining" from "wedged". Underneath that, the count a PartitionProcessingByGroupId endpoint latched and resumed against was wrong: the downstream block holding the backlog was invisible to it, so Count reported zero for work that was really there.

  • BackPressureAgent logs a periodic warning while a listener stays latched, carrying the queue count and the restart threshold the resume decision is made from.
  • The timer-driven check is exception-safe. A throw during an attempted resume was an unobserved ValueTask fault, and the listener silently never resumed.
  • BufferedReceiver/DurableReceiver wire the receiving block's OnError to ILogger. A terminally-faulted block freezes the queue count and permanently latches the listener; that now logs at Critical instead of vanishing to stderr.

A tenanted Azure Service Bus endpoint could not send at all (#​3826) — tenanted or untenanted. TenantedSender deliberately does not implement ISenderRequiresCallback, but callback registration did not recurse, so a BatchedSender underneath it kept a null callback and threw InvalidOperationException: This sender has not been registered. on every batch. The tenanted path now uses inline senders, matching how Redis, MQTT, and Pub/Sub already worked around this.

Oracle queue identity round-trip (#​3820). System.Uri lowercases the authority component while Oracle uppercases its queue identifiers, so ToOracleQueue() resolved a second endpoint over the same physical tables. Also fixes a dead final-attempt error handler: a when clause that included the loop counter made the descriptive exception at the bottom of the retry loop unreachable.

Behavior change worth reading

TrackedSession now completes only when all conditions are satisfied, not the first (#​3824). This is a public testing API. A tracked session configured with several expectations previously returned as soon as any one of them was met, which means some existing tests were passing vacuously. After upgrading, such a test waits for every condition — and may now fail where it previously passed. That failure is generally revealing a real gap rather than introducing one.

Other changes

  • JasperFx upgraded to 2.39.5. Beyond the block Count fix above, this carries jasperfx#​600/#​601 — the application-assembly stack walk could adopt a test-runner assembly and then scan an assembly holding none of your types — and jasperfx#​599, where DatabaseId's escaping now survives a System.Uri round trip.
  • EventSubscriptionAgentFamily.DatabaseKeyOf and TenantNeutralKeyOf are now public (#​3819).

Testing and CI

No runtime behavior changes here, but this is why the fixes above became findable. The Category=Flaky exclusion list went from 12 tagged classes to zero (#​3763) — and several of those tags turned out to have been added in the very commit that introduced the feature they test, hiding working code rather than broken code. Every CI readiness gate now fails loudly instead of warning and continuing; the Kafka gate in particular was a no-op that passed in 0.0s against a broker that would not serve metadata for another 3 seconds (#​3814). The retry ledger records why a test flaked rather than only which one (#​3787), and CIAzureServiceBus was sharded three ways on measured per-class durations (#​3790).

What's Changed

6.24.5

Note: 6.24.4 shipped on NuGet without a GitHub release, so these notes cover everything since V6.24.3.

Highlights

Multi-database projection & subscription assignment got a major reliability pass. For sharded event stores, Wolverine assigns the agents for projections and subscriptions in groups by database — so connection pools scale with the number of databases rather than nodes × databases:

  • A blue/green rollout carrying a projection version bump no longer assigns the new version's agents to nodes that cannot build them — previously the new version could never start anywhere for the whole rollout (#​3792, thanks @​erdtsieck). A split database now costs exactly one owner per version.
  • Database affinity is now a property of the database across agent families (#​3785): a shard database's durability agent follows that database's projection agents onto the same node, so the database attracts one node's connection pool instead of two. Measured on a 512-database production cluster, 73% of databases were split across two nodes, wasting ~425 connection slots. Expect a one-time wave of durability-agent reassignments on first deploy as an existing cluster converges.
  • The settled assignment state is now pinned as a fixed point — re-evaluating a converged cluster moves nothing — and a new deterministic simulation drives the real leader evaluation through the exact deploy shape of GH-3753: slow agent starts and a blue/green capability split at once.

Durable outbox to SNS/SQS FIFO destinations is fixed (#​3793): EnvelopeSerializer never round-tripped Envelope.DeduplicationId, so any envelope recovered from durable storage after an outage was re-sent without MessageDeduplicationId and rejected deterministically by a FIFO destination without content-based deduplication — retrying forever or dead-lettering. Also fixed alongside it: the circuit-resume ping could never reach a FIFO destination (a latched sender could never unlatch), and SNS sent MessageDeduplicationId to standard topics, which AWS rejects. The same fix is merged to the 5.x maintenance branch and will ship in the next 5.40.x release for .NET 8 users.

Balanced-mode host shutdown no longer hangs (#​3781): stopping a node while agent commands were queued could pay a full agent-batch reply window per queued command — measured at 17+ minutes. Now ~2 minutes on the same reproduction.

Azure Service Bus conventional routing sanitizes entity names (#​3786): a handler for an array message type (e.g. Handle(Foo[])) produced an illegal ASB entity name that broke broker startup for the whole assembly, and the real reason was lost. Names are sanitized and failures now carry the offending name.

What's Changed

Full Changelog: JasperFx/wolverine@V6.24.3...V6.24.5

6.24.3

What's Changed

New Contributors

Full Changelog: JasperFx/wolverine@V6.24.2...V6.24.3

Commits viewable in compare view.

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore <dependency name> major version will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)
  • @dependabot ignore <dependency name> minor version will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)
  • @dependabot ignore <dependency name> will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)
  • @dependabot unignore <dependency name> will remove all of the ignore conditions of the specified dependency
  • @dependabot unignore <dependency name> <ignore condition> will remove the ignore condition of the specified dependency and ignore conditions

Bumps WolverineFx from 6.24.2 to 6.24.7
Bumps WolverineFx.RuntimeCompilation from 6.24.2 to 6.24.7

---
updated-dependencies:
- dependency-name: WolverineFx
  dependency-version: 6.24.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: nuget-weekly
- dependency-name: WolverineFx.RuntimeCompilation
  dependency-version: 6.24.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: nuget-weekly
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added .NET Pull requests that update .NET code dependencies Pull requests that update a dependency file labels Aug 6, 2026
@github-actions
github-actions Bot enabled auto-merge (squash) August 6, 2026 00:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file .NET Pull requests that update .NET code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants