fix: harden queue retry debounce and add regression tests

This commit is contained in:
Peter Steinberger
2026-02-24 03:52:31 +00:00
parent a216f2dabe
commit 6c1ed9493c
9 changed files with 257 additions and 6 deletions

View File

@@ -183,9 +183,10 @@ function scheduleAnnounceDrain(key: string) {
queue.consecutiveFailures++;
// Exponential backoff on consecutive failures: 2s, 4s, 8s, ... capped at 60s.
const errorBackoffMs = Math.min(1000 * Math.pow(2, queue.consecutiveFailures), 60_000);
queue.lastEnqueuedAt = Date.now() + errorBackoffMs - queue.debounceMs;
const retryDelayMs = Math.max(errorBackoffMs, queue.debounceMs);
queue.lastEnqueuedAt = Date.now() + retryDelayMs - queue.debounceMs;
defaultRuntime.error?.(
`announce queue drain failed for ${key} (attempt ${queue.consecutiveFailures}, retry in ${Math.round(errorBackoffMs / 1000)}s): ${String(err)}`,
`announce queue drain failed for ${key} (attempt ${queue.consecutiveFailures}, retry in ${Math.round(retryDelayMs / 1000)}s): ${String(err)}`,
);
} finally {
queue.draining = false;
@@ -205,7 +206,8 @@ export function enqueueAnnounce(params: {
send: (item: AnnounceQueueItem) => Promise<void>;
}): boolean {
const queue = getAnnounceQueue(params.key, params.settings, params.send);
queue.lastEnqueuedAt = Date.now();
// Preserve any retry backoff marker already encoded in lastEnqueuedAt.
queue.lastEnqueuedAt = Math.max(queue.lastEnqueuedAt, Date.now());
const shouldEnqueue = applyQueueDropPolicy({
queue,