Skip to content

Wolverine 6.40.0

Choose a tag to compare

@jeremydmiller jeremydmiller released this 24 Sep 12:51
6f59c56

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 ExternalTableTransportCompliance suite 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 ProblemDetails instead of 500 (#4516).
  • Concurrency failures can be mapped to 409 with a one-line opt-in (#4512).
  • MissingNamedConnectionStringsException stays an InvalidOperationException (#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 DeleteAllHandledAsync work (#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 ISendMyself published 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 ISendMyself projection 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