diff --git a/doc/etcp_multipath_plan.txt b/doc/etcp_multipath_plan.txt index bf4fc425..07835091 100644 --- a/doc/etcp_multipath_plan.txt +++ b/doc/etcp_multipath_plan.txt @@ -3,6 +3,43 @@ ETCP: независимая обратная связь каналов и до Статус +24.10.2026: реализованы сканирование send_q, история путей пакета и быстрое застревание. +Остались прежние input_send_q/input_wait_ack: первый готовый повтор имеет приоритет, +иначе выбирается первый готовый новый DATA. Заблокированная запись остаётся на месте +и не мешает следующим. Если кандидата нет, допускается одна подгрузка из input_queue +в пределах общего бюджета unacked_bytes/optimal_inflight и приёмного окна пира. +После синхронного callback проверяются reset/close/эпоха; прежний указатель линка не используется. +Во время ограниченной burst-серии готовый повтор другого пути ждёт её завершения; +FILLER сохраняет измерение, а новые DATA не обгоняют этот повтор. + +Каждый логический пакет хранит32 байта битовой истории живых слотов local_link_id. +Пока есть неиспользованный допустимый путь, повтор ждёт его cwnd/pacer, а не начинает +новый обход уже использованных. После полного обхода прежний путь также уступает +другой допустимой альтернативе. История/last_rr_link меняются только после принятия +DATA транспортом; rollback их сохраняет. Удаление линка очищает слот до unlink и +callbacks, поэтому новый линк с тем же local_link_id не наследует старую историю. + +Три RTO физических попыток без ACK-прогресса ставят tx_stalled. Пока есть хотя бы +один незастрявший initialized+UP путь, повторы исключают застрявшие, даже когда +рабочий временно занят. Если застряли все — разрешены все UP-пути. Новые DATA +используют прежний выбор и могут проверить восстановление: флаг снимает действующий +ACK собственной попытки, отправленной после установки флага. Старый/чужой ACK +этого не делает. Reset очищает состояние; физический UP, ACK/keepalive и формула RTO +сохранены. Новых очередей, payload-копий, таймеров или ранних повторов до RTO нет. + +Windows51 сценарий PASS с управляемыми и реальными часами. Покрыты заблокированный +префикс256 записей, приоритет повторов, общий бюджет, OOM, rollback, полный обход, +ID255/переиспользование слота из callback, три RTO, старые ACK, восстановление, +все застрявшие пути и reset/close/удаление burst-линка из callback подгрузки. +Восемь профильных тестов ASAN/UBSan с detect_leaks=1 проходят без ошибок/утечек. +Контроль занятости рабочего пути1мс теперь проходит: latency377.012мс вместо736.623мс, +gap206.810мс, ready_wait2.318мс при бюджете460.552мс. Отрицательный контроль200мс +по-прежнему проваливает ready_wait (200.764мс), gap и latency; пороги не ослаблены. +Логи: /tmp/etcp-send-scan-{windows-final,real-time,busy_1ms,ready_delay_200ms}.log, +/tmp/etcp-send-scan-asan-test_*.log. + +Предыдущая диагностика (до реализации сканирования и истории): + 24.10.2026: проверки отказов разделены на RTO, готовность повтора и доставку. В этом этапе менялись только тесты/диагностика, логика ETCP сохранена. TX учитывается после принятия send транспортом, а не при подготовке пакета. diff --git a/doc/tasks.md b/doc/tasks.md index 2f0dd49e..61b353d0 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -25,6 +25,17 @@ Windows/FreeBSD runtime не проверялся. [ ] **ETCP: полезная утилизация нескольких каналов и доставка при зависании части линков** — общая задача открыта. + 24.10.2026: реализованы сканирование send_q с приоритетом готовых повторов и ограниченная подгрузка новых DATA. + Заблокированный пакет пропускается. История путей пакета (32 байта) исключает новый обход до перебора допустимых; + история/RR фиксируются после принятого send, удаление линка очищает слот до callbacks/повторной выдачи ID. + После3 RTO без ACK-прогресса tx_stalled исключает путь из повторов при наличии незастрявшего UP-пути. + Все застрявшие пути допускаются, новые DATA сохраняют прежний выбор; действующий ACK отправки после флага снимает его. + Старый/чужой ACK не восстанавливает путь; reset очищает состояние. Новых очередей/таймеров/копий нет, RTO сохранён. + Windows51 сценарий PASS с управляемыми/реальными часами; восемь ASAN/UBSan-тестов без ошибок/утечек. + Контроль занятого на1мс рабочего пути: latency377.012 вместо736.623мс, ready_wait2.318мс, профиль PASS. + Отрицательный контроль задержки готового повтора200мс остаётся FAIL по очереди и общей задержке. + Логи: /tmp/etcp-send-scan-*.log; подробности — doc/etcp_multipath_plan.txt. + Предыдущая диагностика: 24.10.2026: тесты отдельно проверяют обработку RTO (опоздание<=20мс), ожидание готового повтора (<=100мс) и доставку сверх заданной задержки канала (<=100мс). TX учитывается после принятия send. Быстрые профили сохраняют общий предел100мс; длинные учитывают по одному RTO отказавших путей плюс100мс.