conn_mgr: verify route loss and document handle lifetime recovery

This commit is contained in:
evgeny committed 2026-10-01 01:06:56 +03:00
1 parent 464575ef44
commit 426fc2f4e8
2 files changed
+134 -5

No files matched your search

+37 -5
View File
@@ -61,8 +61,36 @@ DIRECT/REVERSE/INDIRECT/NONE. Событие `CHAT_EVT_CALL_CONNECTION` соде
После готовности прямого пути новые дополнительные пробы не запускаются.
Уже начатое согласование INDIRECT может завершиться и сохранить резерв.
После начального бюджета поздние NCD/READY всё ещё могут улучшить путь. Бесконечные
повторные поиски посредников и гарантированное восстановление не предусмотрены.
## Восстановление
Потребность в доставке живёт столько же, сколько сервисные handles. Начальный
TIMEOUT и срок очередного цикла проб независимы: начальный TIMEOUT приходит один
раз, если до начального дедлайна ни один путь не заработал. Он не прекращает поиск.
При потере прямого пути сразу используется пригодный подтверждённый резерв.
Если потеряны все пути, сервис получает DOWN. Затем новый цикл запускает DIRECT
и LOCAL сразу, REVERSE через 0/500 мс; при отсутствии пригодного резерва INDIRECT
запускается сразу независимо от NAT. Рабочий посредник сохраняется во время проб.
Каждый цикл ограничен 15 секундами. Между неудачными циклами пауза растёт:
1 → 2 → 4 → 8 → 15 секунд, далее остаётся 15 секунд. Подтверждённый прямой READY
останавливает поиск и сбрасывает паузу.
Свежая версия записи пира или изменение локальных сокетов обходят паузу и запускают
новую пробу. Изменения сокетов передаются через `conn_mgr_network_changed()`.
Работающие прямые соединения дополнительных проб не требуют. NCD сохраняется
между циклами; новый handle создаётся только после CLOSED. Существующие UDP-пробы
и TCP reconnect продолжаются; отсутствующие адресные линки добавляются без дублей.
Каждый исходящий цикл имеет новые request_id. Ответы старых/завершённых циклов
игнорируются. Входящие запросы имеют отдельный срок обработки: новый request_id
начинает новый срок, повтор того же запроса его не продлевает. Входящая запись
без сервисного владельца обслуживает запрос, затем освобождается и сама постоянное
восстановление не запускает. Закрытие последнего сервисного handle отменяет таймеры
и отложенные callbacks; групповые владельцы транспорта продолжают жить независимо.
Восстановление зависит от доступных адресов, маршрутов и READY-сессий. Оно не меняет
порог обнаружения транспортного обрыва ETCP и таймаут завершения звонка без медиа.
## INDIRECT
@@ -97,7 +125,8 @@ INTERM_SELECTED и INTERM_ACK содержат request_id и до трёх `{nod
- UP означает появление пригодного пути. Улучшение пути не повторяет UP.
- DOWN означает потерю рабочих путей; при живом резерве DOWN не доставляется.
- TIMEOUT означает, что начальное подключение не получило ни одного рабочего пути.
Ошибка отдельной пробы при живом посреднике не становится TIMEOUT для сервиса.
При живом handle поиск продолжается. Ошибка отдельной пробы при живом посреднике
не становится TIMEOUT для сервиса; после первого UP начального TIMEOUT уже не будет.
- DOWN/TIMEOUT не освобождают handle. Владелец обязан вызвать `conn_mgr_close()`.
- Закрытие последнего handle отменяет CM timer и callbacks и закрывает только
NCD-владение CM. Группа и другие NCD-владельцы сохраняют транспорт.
@@ -105,10 +134,13 @@ INTERM_SELECTED и INTERM_ACK содержат request_id и до трёх `{nod
при INDIRECT/отсоединённом handle. Данные следует отправлять через router.
Диагностика CM — категория `general`: INFO показывает расписание, выбор и смену
пути с временем от старта; DEBUG — события NCD, RTT и обработку ответов; WARN/ERROR —
пути с временем от старта, новые циклы и паузы; DEBUG — события NCD, RTT и обработку ответов; WARN/ERROR —
ошибки, недоступные пути и некорректные пакеты. Создание адресных линков NCD —
категория `connection`.
Проверки: `test_conn_mgr`, `test_conn_mgr_handles`, `test_conn_mgr_already_connected`,
`test_conn_mgr_phases`. Последний проверяет расписание, LAN, односторонний INDIRECT,
поздний DIRECT после NCD TIMEOUT, резерв, реальные данные и обработку кандидатов.
поздний DIRECT после NCD TIMEOUT, резерв, реальные данные и обработку кандидатов,
обрыв после начального срока, повторные циклы с реальными паузами 1/2/4с, смену адресов
и локальных сокетов, потерю маршрута посредника, устаревший ACK, начальный TIMEOUT
с последующим UP и закрытие последнего handle из TIMEOUT callback.