Repository navigation
Wolverine 6.63.0
This is a durability release. Most of its fixes were found by the new out-of-process durability chaos rig (src/Testing/DurabilityChaosRig), which kills, stops, pauses and starves producers and workers, then checks a ledger for lost, duplicated and stuck messages. Dependencies are unchanged from 6.62.0 (JasperFx 2.100.1, Weasel 9.49.0, Marten 9.58.0, Polecat 5.49.0, Fisher 1.28.0). Upgrading is a package bump with no breaking API change. The one schema change is a new index on the MySQL inbox table (GH-5428), applied by the usual message storage migration.
Fixes
- Envelope ids: default envelope ids no longer collide between processes on one machine. Collisions showed up as inbox duplicate-key errors and silently dropped "duplicate" deliveries (#5399).
- Stale nodes: a node that resumes after being ejected as stale does not commit work another node already handled (GH-5423), and Oracle's in-transaction mark-as-handled refuses that work too (GH-5429).
- Ambiguous commits: a commit that applied but reported an error is no longer dead-lettered, and its cascading messages run (GH-5410).
- Database queues:
- scheduled retries are atomic on SQL Server, MySQL, Oracle and SQLite (#5408), and fenced on the inbox row's owner on every store (GH-5426);
- the outbox-to-queue move is one transaction on MySQL, SQL Server and SQLite (GH-5438);
- a durable pop skips envelopes the inbox already holds instead of rolling the whole batch back (GH-5411);
- a backlog drains without waiting a polling interval per batch (GH-5413).
- SQL Server: the scheduled-message poll never waits on a lock (GH-5412).
- MySQL: the expired-handled cleanup no longer locks live inbox rows (GH-5428).
- SQLite: Balanced mode assigns node numbers and reads health checks as UTC (GH-5430).
- Multi-tenancy: tenant databases with the same name on one host are told apart by port, so each gets its own durability agent (GH-5435).
- Dead letters: a dead letter marked replayable mid-move is no longer deleted before it reaches the inbox (GH-5395).
- Interop: CloudEvents and MassTransit interop keep the inbox id of a durable envelope when they read the message id (#5396, thanks to @lahma; #5398).
- HTTP: span tags are written before anything can short-circuit the request (GH-5406).
- Testing: a tracked session no longer completes while a handler's cascading messages are still running (#5400, thanks to new contributor @haefele-octoja).
Docs
- Schema management options for message storage, linked to Weasel and the stateful resource model (#5437).
- Waiting on a message the broker fans out to several queues (GH-5416).
- The durability chaos rig has a README covering its roles,
CHAOS_*knobs and containers (GH-5409, GH-5414).
What's Changed
- Keep the inbox id of a durable envelope when a CloudEvent with a Guid id is read from its data by @lahma in #5396
- GH-5395 A dead letter marked replayable mid-move is no longer deleted without reaching the inbox by @jeremydmiller in #5397
- MassTransit interop keeps the inbox id of a durable envelope when it reads the messageId by @jeremydmiller in #5398
- Default envelope ids no longer collide between processes on one machine by @jeremydmiller in #5399
- Scheduled retries on the SQL Server, MySQL, Oracle and SQLite queues are atomic by @jeremydmiller in #5408
- GH-5406 HTTP span tags are written before anything can short-circuit the request by @jeremydmiller in #5418
- GH-5416 Document waiting on a message the broker fans out to several queues by @jeremydmiller in #5419
- GH-5409 Commit the out-of-process durability chaos rig with a README by @jeremydmiller in #5420
- GH-5411 A durable pop skips envelopes the inbox already holds instead of rolling the batch back by @jeremydmiller in #5421
- GH-5412 The SQL Server scheduled-message poll never waits on a lock by @jeremydmiller in #5422
- GH-5413 A database queue drains a backlog without waiting a polling interval per batch by @jeremydmiller in #5424
- GH-5410 A commit that applied but reported an error is not dead-lettered and its cascades run by @jeremydmiller in #5425
- GH-5423 A node resumed after being ejected as stale does not commit work another node already handled by @jeremydmiller in #5427
- GH-5428 The MySQL expired-handled cleanup no longer locks live inbox rows by @jeremydmiller in #5431
- GH-5429 Oracle's in-transaction mark-as-handled refuses work another node already handled by @jeremydmiller in #5432
- GH-5430 SQLite in Balanced mode assigns node numbers and reads health checks as UTC by @jeremydmiller in #5433
- GH-5426 A scheduled retry on a database queue is fenced on the inbox row's owner by @jeremydmiller in #5434
- GH-5435 Tenant databases with one name on one host are told apart by port by @jeremydmiller in #5436
- GH-5438 The outbox-to-queue move is one transaction on MySQL, SQL Server and SQLite by @jeremydmiller in #5439
- Docs: schema management options for message storage, linked to Weasel and the stateful resource model by @jeremydmiller in #5437
- GH-5414 Durability chaos rig, round three by @jeremydmiller in #5440
- Bump version to 6.63.0 by @jeremydmiller in #5441
- Tracked session no longer completes while a handler's cascading messages are still running by @haefele-octoja in #5400
New Contributors
- @haefele-octoja made their first contribution in #5400
Full Changelog: V6.62.0...V6.63.0