Repository navigation
Wolverine 6.40.0
51 commits since V6.39.1. A minor release rather than a patch, because this wave carries new capability and not only fixes.
New capability
- Capacity-aware agent assignment (#3959) — agent distribution now accounts for node capacity rather than treating every node as interchangeable. Landed as @mlh758's #4297, then hardened in #4596 and #4598 to require a real load monitor, stop a shed draining the cluster, and hold pins across every distribution path. Note that the node-load advertisement is PostgreSQL-only until #4593 lands for the other stores.
- External table transport for Oracle (#4482) — implemented by @Trasvi in #4558, with follow-ups in #4574, #4577 and #4578. The shared
ExternalTableTransportCompliancesuite now holds Oracle, PostgreSQL, SQL Server, MySQL and Sqlite to the same bar. - A deduplication claim now rides the business transaction on Marten (#4505), Polecat (#4570) and Fisher (#4571). The claim is enlisted in the same unit of work as the handler's own writes instead of being committed on a connection of its own and compensated with a release. A refusal that never commits therefore never claims the id, and there is no release left to mis-order.
Behaviour changes
- An unknown tenant id answers
404 ProblemDetailsinstead of500(#4516). - Concurrency failures can be mapped to
409with a one-line opt-in (#4512). MissingNamedConnectionStringsExceptionstays anInvalidOperationException(#4527), and every named connection string is now validated in one pass at startup.- Wolverine's Kafka error handler composes with the user's instead of replacing it (#4522).
Exception message wave
#4511–#4532 — 18 PRs making the framework's exceptions name a remedy rather than only a symptom: saga failures, handler discovery, SNS/Rabbit MQ/Azure Service Bus/Redis/SignalR configuration problems, oversized messages, unreadable HTTP bodies, and the transports' previously message-less exceptions.
Fixes
- Stop reading steady-state throughput as a stuck recovery batch, and detect a genuinely stuck outbox from the head of the queue (#4499).
- Sweep expired handled envelopes on Cosmos DB, and make
DeleteAllHandledAsyncwork (#4509). - Bound SQLite's two reaps (#4567).
- Only ever write ASP.NET Core's endpoint data sources from the composition thread (#4500).
- Grandfather a group-affinity candidate per member rather than per partition (#4562) — @erdtsieck's #4563, with blue/green Polecat coverage in #4576.
- Declare a module's ancillary store once per namespace (#4507) — @uniquelau's #4508.
- Apply an
ISendMyselfpublished from a projection side effect, on all three stores (#4556) — built on @erdtsieck's #4557. - Reject conflicting sending and listening modes on shared listeners (#4059) — built on @tmorejon's #4506.
- Say "disabled tenant" when that is what happened, and actually refuse one (#4586).
- Stop the Redis protocol version header surviving a round trip (#4595).
- Do not treat a sticky-bound listen-only endpoint as a local send target (#4510).
- Scope Polecat's and Fisher's duplicate-message
Discard()to the inbox table (#4565).
Dependencies
Unchanged from 6.39.1 — Marten 9.35.0, Polecat 5.29.0, Fisher 1.10.0, Weasel 9.32.0, JasperFx 2.74.0. This release ships exactly what its CI has been green against; the pin bump follows separately.
Contributors
Thank you to everyone who contributed code to this release:
- @mlh758 (Michael Harris) — capacity-aware agent assignment, #4297
- @Trasvi (Travis Kirke) — the external table transport for Oracle, #4558
- @erdtsieck (Anne Erdtsieck) — group-affinity grandfathering, #4563, and the
ISendMyselfprojection side effect fix, #4557 - @uniquelau (Laurence Gillian) — declaring a module's ancillary store once per namespace, #4508
- @tmorejon (Jorge L. Torres M) — rejecting conflicting sending modes on shared listeners, #4506