7acef27e
docs: mux hosts' sum-of-timeouts cost gets a decisions.md entry and a measured date
a73x 2026-08-28 19:53
Commit message
README.md
| Old | New | ||
|---|---|---|---|
| @@ -381,8 +381,9 @@ box [unreachable] | |||
| 381 | listing dials the hosts one at a time and waits up to two seconds for each, | 381 | listing dials the hosts one at a time and waits up to two seconds for each, |
| 382 | so the cost is the SUM and not the slowest: two silent hosts is four | 382 | so the cost is the SUM and not the slowest: two silent hosts is four |
| 383 | seconds. Only a host that accepts the dial and then says nothing costs the | 383 | seconds. Only a host that accepts the dial and then says nothing costs the |
| 384 | full wait — a socket with nothing behind it is refused instantly (measured: | 384 | full wait — a socket with nothing behind it is refused instantly (measured |
| 385 | 2002 ms for one silent daemon, 4002 ms for two, ~1 ms for any number of | 385 | 2026-08-28, `docs/decisions.md`: 2002 ms for one silent daemon, 4002 ms for |
| 386 | two, ~1 ms for any number of | ||
| 386 | absent sockets). `mux hosts rm` reads the file verbatim too, so a line | 387 | absent sockets). `mux hosts rm` reads the file verbatim too, so a line |
| 387 | you hand-edited into something no longer legal can be typed back byte for | 388 | you hand-edited into something no longer legal can be typed back byte for |
| 388 | byte and removed instead of wedging every command that touches the wall. | 389 | byte and removed instead of wedging every command that touches the wall. |
docs/decisions.md
| Old | New | ||
|---|---|---|---|
| @@ -7383,3 +7383,16 @@ the link, so no reconnect can restart a box someone stopped. The local | |||
| 7383 | 7383 | ||
| 7384 | The break: an OLD client on a new remote gets no daemon from a cold `mux | 7384 | The break: an OLD client on a new remote gets no daemon from a cold `mux |
| 7385 | HOST` — `ssh HOST 'muxd start'`, as README said. No xversion probe covers it. | 7385 | HOST` — `ssh HOST 'muxd start'`, as README said. No xversion probe covers it. |
| 7386 | |||
| 7387 | ## 2026-08-28 — `mux hosts` costs the SUM of its hosts' timeouts | ||
| 7388 | |||
| 7389 | `hostsList` dials each line in a plain sequential loop with a 2000 ms budget | ||
| 7390 | (`hosts_list_ms`), and the budget starts AFTER `Transport.open` returns, so | ||
| 7391 | it bounds the daemon's reply and not the dial. Measured, Debug build, an | ||
| 7392 | isolated `XDG_STATE_HOME` and a python listener that accepts and then never | ||
| 7393 | answers the `sessions_req`: one silent daemon 2002/2002/2001 ms, two | ||
| 7394 | 4002/4001/4002 ms — the sum, not the slowest. A `--sock` path with nothing | ||
| 7395 | bound is refused by `connect(2)`: 1 ms for one and 1 ms for four, so absent | ||
| 7396 | sockets are free at any count. What this does NOT bound is a blackholed | ||
| 7397 | HOST, where ssh sits in the kernel's TCP retry schedule; `handoff.sshLine`'s | ||
| 7398 | batch recipe carries `ConnectTimeout=5` for that. | ||