fix(drill): read curl's message — the exit code cannot tell you what happened #41
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#41
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/probe-reads-the-message"
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?
Boxes are isolated. They have been since #38. The drill was lying.
The kernel, on the live host:
A box probing its sibling:
That is not
Connection refused— a refusal comes back instantly, with an RST. This is a frame that went nowhere: three seconds of silence, then give up, and ICMP totally unanswered. Box A cannot reach box B.The bug
curlexit 7 is "failed to connect". It covers both:Connection refusedCould not connect to server/No route to hostOpposite conclusions, one exit code. The drill mapped
7 → arrived, so for two full runs after the isolation fix had landed and was working, it reported a working boundary as a broken one — and sent me chasing a fourth mechanism for a hole that was already closed.The fix
box_probereturnsreachable | refused | droppedby reading curl's message, withpingcorroborating. Every isolation probe uses it: sibling, box→host, RFC1918, host→box.A refusal is instant; an unreachable host burns the timeout. The words say which; the number cannot.
RUNS.mdgains trap 12Which is the same disease as the eleven traps before it, and as the original bug itself: trusting a proxy for the fact instead of the fact. The box→box hole existed because a code reading stood in for a measurement; it stayed "open" for two extra runs because an exit code stood in for a message.
Expect A3 to read:
🤖 Generated with Claude Code