@@ -299,21 +299,41 @@ on ack, so the count is exactly the undelivered backlog):
299299 drains.
300300
301301Both default to zero (disabled) on the config structs; the bound is opted
302- into per actor. Messages with priority ` >= RestartPriority ` are always
303- exempt, because the ` RestartMessage ` that would un-wedge a stuck actor must
304- not be refused by the very backlog it exists to drain. A store that does not
305- implement ` actor.MailboxDepthStore ` runs without watermarks entirely, and a
306- failed depth probe fails OPEN (the send is admitted): a broken monitoring
307- read must not become message loss.
302+ into per actor. Two message classes are always exempt:
303+
304+ - ** Control-priority messages** (` priority >= actor.ControlPriority ` , which
305+ includes ` RestartPriority ` ): the restart, restore, and resume messages
306+ that would un-wedge a stuck actor must not be refused by the very backlog
307+ they exist to drain. Boot-time restores (` RestoreNonTerminalRequest ` in
308+ OOR, ` ResumeUnrollRequest ` in unroll, ` ResumeCreditOpRequest ` in credit)
309+ carry this priority because the daemon treats their failure as fatal: a
310+ refusal there would turn a backed-up mailbox into a restart crash loop.
311+ - ** Outbox-propagated deliveries** (detected via the outbox ID the
312+ publisher stamps into the context): the message was already accepted at
313+ its true producer and durably committed to the outbox, so refusing the
314+ CDC hand-off sheds nothing. Worse, the publisher's claim path bumps
315+ delivery attempts in its own transaction, so repeated refusals would
316+ dead-letter the committed outbox row (and any DurableAsk response it
317+ carries) instead of exerting backpressure.
318+
319+ A store that does not implement ` actor.MailboxDepthStore ` runs without
320+ watermarks entirely, and a failed depth probe fails OPEN (the send is
321+ admitted): a broken monitoring read must not become message loss.
308322
309323### The probe
310324
311325The depth read is TTL-cached (one second) with a local count of sends
312326accepted since the last probe added on top, so the common send path pays no
313- extra query. The estimate is deliberately one-sided: local sends push it up
314- immediately, while acks and remote sends only surface at the next probe.
315- Overshooting is the safe direction for an admission check, and the
316- enforcement error is bounded by one probe window.
327+ extra query. The estimate is one-sided for local traffic (local sends push
328+ it up immediately, acks surface at the next probe; overshooting is the safe
329+ direction for an admission check), while sends from other processes stay
330+ invisible for up to one window, so the bound is approximate rather than
331+ exact. The probe is single-flighted (concurrent senders use the cached
332+ estimate rather than stacking behind the query) and runs with the sender's
333+ ambient transaction stripped (` WithoutTx ` ): joining a SERIALIZABLE writer
334+ would take predicate locks over the whole mailbox partition and manufacture
335+ serialization conflicts with the consumer's acks, precisely when the system
336+ is already contended.
317337
318338### Who refuses, and what callers do
319339
@@ -326,11 +346,18 @@ enforcement error is bounded by one probe window.
326346- ** Local producers** (RPC handlers, other actors) see the error from
327347 ` Tell ` /` Ask ` and propagate it; at ten thousand parked messages, failing
328348 loudly is the only move that helps.
329- - ** The OutboxPublisher's folded delivery path is deliberately unthrottled** :
330- it enqueues into the target mailbox inside the publisher's own write
331- transaction, bypassing ` DurableMailbox.Send ` , so CDC delivery is never
332- refused. Throttling it would only move the backlog from the target mailbox
333- to the outbox table while breaking the claim-expiry retry contract.
349+ - ** The OutboxPublisher's folded delivery path is exempt** via the outbox-ID
350+ context marker described above, so CDC delivery is never refused and the
351+ claim-expiry retry contract is untouched.
352+
353+ ** Known residual** : an actor turn that Tells into a saturated peer inside
354+ its own commit (e.g. an OOR session's transport send into serverconn
355+ egress) fails the whole turn, which nacks the INBOUND message and burns one
356+ of its finite delivery attempts; a long enough saturation episode
357+ dead-letters it. The dead-letter tooling (#1119 ) makes those visible and
358+ requeueable, and the planned postpone semantics (re-enqueue without burning
359+ attempts) are the structural fix; until then, saturation-driven turn
360+ failures ride the ordinary retry/dead-letter path.
334361
335362### Observability
336363
0 commit comments