-
Notifications
You must be signed in to change notification settings - Fork 42
Description
Droid updater startup hang on Linux VPS with partial IPv6 egress
Summary
On a Hetzner Ubuntu 24.04 VPS, droid hangs at startup when auto-update is enabled. The hang is reproducible for both droid and droid --version.
The same Droid version works on WSL2. Current stable workaround on VPS is:
export FACTORY_DROID_AUTO_UPDATE_ENABLED=falseWith this workaround, interactive Droid starts normally.
Impact
- Interactive CLI is blocked on affected host when updater is enabled.
- Non-interactive version checks also hang (
--version). - User can work only with updater disabled.
Environment
- Droid:
0.57.15 - Failing host: Hetzner VPS, Ubuntu 24.04, kernel
6.8.0-100-generic - Working host: WSL2 Ubuntu 24.04, kernel
6.6.87.2-microsoft-standard-WSL2
Reproduction
# Hangs on VPS
env -u FACTORY_DROID_AUTO_UPDATE_ENABLED ~/.local/bin/droid --version
# Works immediately on VPS
env FACTORY_DROID_AUTO_UPDATE_ENABLED=false ~/.local/bin/droid --versionExpected
Updater check should fail fast and CLI should still start/exit promptly.
Actual
Updater-enabled startup enters a long-running wait loop and never completes in observed runs (>40s, and continued until externally terminated).
Key evidence
-
VPS behavior split by updater flag
- See
vps_droid_behavior.txt(noenv_ec:124,dis_ec:0,dis_out:0.57.15)
- See
-
Endpoint connectivity differs by IP family on VPS
vps_downloads_connectivity.txt: IPv6 connects todownloads.factory.ai:443time out; IPv4 succeeds quicklyvps_curl_ipv4_ipv6.txt:curl -4succeeds,curl -6times out
-
Hanging process socket state on VPS
vps_hung_socket_snapshot.txt: multiple IPv6 sockets inSYN-SENTto CloudFront v6 addresses while IPv4 sockets are established
-
WSL contrast
wsl_downloads_connectivity.txt: IPv6 fails immediately withENETUNREACHand IPv4 succeeds; Droid does not hang there
-
Source-address clue on VPS
vps_ipv6_source_binding.txt: IPv6 requests fail from2a01:4ff:f2:4002::2but succeed from2a01:4ff:f0:733e::1
-
Strace shape
vps_strace_excerpt_tail.txt: repeatedepoll_pwait2+ periodic timerfd reads during hang (no forward progress to version output)
Working workaround (currently in use)
FACTORY_DROID_AUTO_UPDATE_ENABLED=false exported in shell profile. Confirmed working in Termius session (droid --version and full interactive droid).
Likely fix direction
- Ensure updater check never blocks startup/exit path.
- Use strict per-address connection timeouts and robust Happy Eyeballs/IPv4 fallback when IPv6 handshakes stall.
- Treat stalled IPv6 paths as non-fatal and continue.