fix(drill): no in-box probe can hang the run again #22
No reviewers
Labels
No labels
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-triage
ready
release
scope:cli
scope:drill
scope:host
scope:installer
scope:templates
scope:tiers
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/box#22
Loading…
Reference in a new issue
No description provided.
Delete branch "drill/hangproof-exec"
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?
Run 4 hung 10+ minutes at C4 — the sibling probe, the last open item in #15. Everything before it passed.
The cause is a shell trap, not a network one
$( )waits for stdout to close, not for the command to exit. A grandchild that inherits the exec session's stdout holds the substitution open forever — andtimeoutdoes not save you: it kills the wrapper, not the process holding the pipe. Usingclaudebox execmade it likelier still, since that becomessudo -u claude -i— a login zsh with oh-my-zsh, a lot of machinery to keep an fd alive.The fix
Every in-box read now goes through two helpers:
in_box—incus execdirectly (no login shell), stdin pinned to/dev/null, output landed in a file rather than a pipe,timeout -kto hard-kill.box_curl— same discipline, and it returns curl's exit code as the finding. For A3 the exit code is the answer:0connected (isolation broken),7refused (the packet arrived — the egress drop isn't covering siblings),28timed out (dropped, as designed).C4 also prints what it's probing before it probes, so a stall is locatable instead of silent.
A3 can be answered right now, without waiting for this merge
On the stuck server, after Ctrl-C:
28 = isolation holds · 7 = packets arrive (#16 becomes a fix) · 0 = broken.
🤖 Generated with Claude Code