Skip to content

Wolverine 6.51.3

Choose a tag to compare

@jeremydmiller jeremydmiller released this 23 Oct 01:16

Wolverine 6.51.3 is a durability release. Nearly everything in it came out of a run of reports against the durable inbox and outbox, plus a new durable receiver compliance rig (src/Testing/DurableComplianceRig, Bobcat specs across PostgreSQL, SQL Server, Marten and EF Core over local, database, RabbitMQ and SQS endpoints) that turned up the rest. There are no breaking API changes; the one schema addition (a nullable envelope_id column on the deduplication table) is optional and an unmigrated table keeps working.

Many thanks to everyone who reported these with reproductions: @billshuck, @dbelinsky-accureference, @endava-marinela-marchitan, @devployment, @kowalczb, @Patrick2607 and @ahmetvayhan.

Durable inbox hardening

  • Durable inbox hardening, part 1: transactions, idempotency, deduplication, GH-5123 and the CISqlServer split by @jeremydmiller in #5129
    • A late DbTransaction dispose in MessageContext.ClearState() could kill another handler's Npgsql transaction
    • Eager idempotency now writes its placeholder inside the handler's transaction (Marten, EF Core, Polecat, Fisher), so a requeued failure is no longer dead lettered as a duplicate of itself
    • EF Core marks the inbox row Handled only after its own commit, and inside the tenant transaction for database-per-tenant
    • A handler that calls ReScheduleAsync and then returns normally keeps its retry
    • A [Deduplicated] claim stranded by a crash can be taken over by the same envelope (new nullable envelope_id column, opt-in IEnvelopeAwareDeduplicationStore)
    • Envelope.DeduplicationId now crosses RabbitMQ, the generic EnvelopeMapper brokers and MQTT
    • Two copies of one envelope in a single batch are reported as DuplicateIncomingEnvelopeException instead of pausing the listener or tripping the tenant write brake (PostgreSQL, SQL Server, MySQL, SQLite, Oracle)
    • RabbitMQ quorum queues: opt-in x-delivery-limit (.DeliveryLimit(n), DeliveryLimitForDurableQuorumQueues(n)), a startup warning, and DeferAsync publishes before it acks. New docs section "Quorum Queues and the Durable Inbox"
  • Durable receiver hardening, part 2: batch member settlement, inbox ownership, paused local queues by @jeremydmiller in #5157
  • Durable receiver hardening, part 3: drain release vs. a new receiver's first claim; heartbeat only while holding (F18) by @jeremydmiller in #5158

Durable bug fixes

Testing

Full Changelog: V6.51.2...V6.51.3