Симптом
tunnelvault --status сразу после открытия ноута (естественный момент проверки) отваливается по таймауту с ошибкой — выглядит как «демон умер», хотя он жив и просто ещё реконнектит тоннели после сна.
Причина
CLIENT_TIMEOUT = 10.0 (tv/ipc_protocol.py:16), но сервер на mutating-командах держит reconnect_lock (tv/ipc_server.py:256,286, timeout=30), а keepalive держит тот же lock весь реконнект целиком (tunnelvault.py). Реконнект нескольких мёртвых тоннелей серийный (for tc, pid in dead: reconnect_one), каждый — disconnect + keepalive_reconnect_pause + DNS-резолвы + connect() c ожиданием интерфейса (openvpn 30с / openconnect 20с). При 2-3 мёртвых после сна суммарно 60-90с+, всё это время lock занят → status клиент отваливается через 10с.
Направление фикса
Read-only команды (status, check) не должны ждать reconnect_lock — читать снапшот engine.results/engine.tunnels без захвата лока (снапшот уже делается в _cmd_status, tv/ipc_server.py:203-205, надо только убрать блокировку). Плюс поднять CLIENT_TIMEOUT до реалистичного худшего реконнекта хотя бы для mutating-команд.
UX-проблема (ложная тревога), не потеря данных.
Найдено адверсариальным ревью (sleep/wake ось), 2026-07-02.
Симптом
tunnelvault --statusсразу после открытия ноута (естественный момент проверки) отваливается по таймауту с ошибкой — выглядит как «демон умер», хотя он жив и просто ещё реконнектит тоннели после сна.Причина
CLIENT_TIMEOUT = 10.0(tv/ipc_protocol.py:16), но сервер на mutating-командах держитreconnect_lock(tv/ipc_server.py:256,286,timeout=30), а keepalive держит тот же lock весь реконнект целиком (tunnelvault.py). Реконнект нескольких мёртвых тоннелей серийный (for tc, pid in dead: reconnect_one), каждый — disconnect +keepalive_reconnect_pause+ DNS-резолвы +connect()c ожиданием интерфейса (openvpn 30с / openconnect 20с). При 2-3 мёртвых после сна суммарно 60-90с+, всё это время lock занят →statusклиент отваливается через 10с.Направление фикса
Read-only команды (
status,check) не должны ждатьreconnect_lock— читать снапшотengine.results/engine.tunnelsбез захвата лока (снапшот уже делается в_cmd_status,tv/ipc_server.py:203-205, надо только убрать блокировку). Плюс поднятьCLIENT_TIMEOUTдо реалистичного худшего реконнекта хотя бы для mutating-команд.UX-проблема (ложная тревога), не потеря данных.
Найдено адверсариальным ревью (sleep/wake ось), 2026-07-02.