Say what becomes of an event a handler gives up on (hq issue 330)
mesh/merge-gate pass: builds mesh-tools, node-tools → ace, g14, novox, shanks; no bus step; every machine composes with the change as it did without (4 of …
mesh/repo-check pass: its merge-check.sh passed
mesh/delivery delivered
mesh/delivery-group group fix/330-a-message-given-up-on-is-kept delivered: every member is delivered
mesh/merge-gate pass: builds mesh-tools, node-tools → ace, g14, novox, shanks; no bus step; every machine composes with the change as it did without (4 of …
mesh/repo-check pass: its merge-check.sh passed
mesh/delivery delivered
mesh/delivery-group group fix/330-a-message-given-up-on-is-kept delivered: every member is delivered
The comments said a failing event dead-letters, which nothing did; the controller now keeps it, and delivers it again under a subject this runtime reads the same key from (ADR 0264).
This commit is contained in:
@@ -498,9 +498,9 @@ async function deliver(
|
||||
try {
|
||||
env = toEnvelope<unknown>(msg);
|
||||
} catch {
|
||||
// Unparseable: acknowledge it. Redelivering a message no version of this code can read is
|
||||
// an infinite loop, and the stream's dead-letter is for handlers that fail, not for bytes
|
||||
// that were never an envelope.
|
||||
// Unparseable: terminate it. Redelivering a message no version of this code can read is
|
||||
// an infinite loop, and what the controller keeps of a message given up on (DEAD_LETTERS,
|
||||
// novox/hq issue 330) is for handlers that fail, not for bytes that were never an envelope.
|
||||
msg.term();
|
||||
return;
|
||||
}
|
||||
@@ -517,8 +517,11 @@ async function deliver(
|
||||
msg.ack();
|
||||
} catch {
|
||||
// Negative-acknowledge with a delay, so a handler failing on a transient cause gets another
|
||||
// attempt, and one failing permanently exhausts max-deliver and dead-letters rather than
|
||||
// spinning. The consumer's limits are the controller's; this only says "not done".
|
||||
// attempt, and one failing permanently exhausts max-deliver rather than spinning: the consumer
|
||||
// gives the event up, and the controller keeps it in DEAD_LETTERS until a person delivers it
|
||||
// again or drops it (novox/hq issue 330). Delivered again, it arrives under
|
||||
// `mesh.again.<consumer>.…`, and keyFromSubject reads the same key from it. The consumer's
|
||||
// limits are the controller's; this only says "not done".
|
||||
msg.nak(5_000);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user