Repository navigation
v1.0.42 - #110
v1.0.42#110
Conversation
…CKED
With several replicas, every worker's cleanup read the same oldest processed
rows without a lock and removed them via RemoveRange. The first commit won and
the rest failed with DbUpdateConcurrencyException ("expected to affect 1 row(s),
but actually affected 0"), logged at Error on every pod. On the outbox side the
exception also escaped to RunAsync, which returned 0 and pushed polling into
idle backoff right after publishing.
- Add IInboxCleanupStore / IOutboxCleanupStore. The Npgsql implementations run
a single DELETE ... FOR UPDATE SKIP LOCKED, so workers delete disjoint
batches without waiting or failing. The EF Core fallbacks (TryAdd) use a
set-based ExecuteDelete that never raises a concurrency error.
- Honour CleanupInterval (it was documented but never read) and add it plus
CleanupBatchSize to the outbox options. A full batch keeps cleanup due so a
backlog still drains; a short batch or a failure defers by the interval.
- Wrap outbox cleanup in its own try/catch so it cannot discard the publish count.
- Mark IInboxStore.CleanupOldMessagesAsync [Obsolete]; Aether no longer calls it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…p-locked fix(events): delete expired inbox/outbox rows with FOR UPDATE SKIP LOCKED
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Advanced Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|



No description provided.