Shared pool: ~2-min DEGRADED after a cross-channel steal (hop join timeout → 120s quarantine) #23
Labels
No labels
bug
duplicate
enhancement
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
dark/nether-voicebridge#23
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Symptom (observed live 2026-06-17, 3 bridges sharing a 4-bot pool). When a channel activates and the pool is full, it steals a bot from a donor channel. The stolen bot must leave its old Discord voice channel and join the new one (a leave→join hop). Under concurrent load this hop sometimes times out, and the channel then logs
puppet join failed and no healthy pool bot free — channel DEGRADEDrepeatedly for ~2 minutes before the bot finally re-joins.Root cause. A join timeout calls
on_join_failed(crates/discord/src/puppet.rs), which quarantines the stuck bot viaunhealthy=true. The quarantine is only cleared afterQUARANTINE_COOLDOWN = 120s(puppet.rs:54) byrecover_bot, which then re-activates the channel. So the ~2-min DEGRADED window is exactly the 120s quarantine cooldown: the steal hop fails, the only candidate bot is quarantined, no spare exists, and the channel waits the full cooldown to recover.Why it needs its own fix. This is a voice-join-reliability / timing problem (the leave→join hop is racy under load), distinct from the allocation-bookkeeping bug just fixed (cross-channel overflow re-promotion). Fixing it safely needs concurrent-load reproduction to tell a transient hop timeout from a genuinely stuck bot.
Candidate directions (not yet validated):
manager.remove(leave) fully settles beforemanager.join(re-join) — the hop may be joining too soon after leaving.Related: the cross-channel re-promotion fix (same session) and the earlier
puppet-channel-hop-join-timeoutquarantine+failover work.Filed from a live investigation; see the steal path
steal_for_activationandon_join_failed/recover_botincrates/discord/src/puppet.rs.Fixed in
4733459— replaced the flat 120s quarantine cooldown with per-bot exponential backoff (15→30→60→120s cap, reset on a successful join). Live-verified via fault injection (forcedmanager.jointimeouts): one bot cycled 15→30→60→120→120s, each interval accurate to ~2ms, then reset on success. Closing.