diff --git a/doc/etcp_multipath_plan.txt b/doc/etcp_multipath_plan.txt index dbda06ab..49b785e5 100644 --- a/doc/etcp_multipath_plan.txt +++ b/doc/etcp_multipath_plan.txt @@ -40,14 +40,29 @@ RTT20/200мс: 13.552/16Мбит/с, длинный канал wire7.173/8Мби ограничение нижележащей STCP-очереди ещё не реализованы. Полный лог: /tmp/etcp-attempts-matrix.log. -Дополнительно подтверждена потеря уже ACKed DATA при OOM в pn_unpacker_cb: -ll_alloc_lldgram не выделяется, исходный фрагмент освобождается, till=1, -ACK_queued=1, messages=0, удерживаемых данных нет. Повтор отбрасывается как дубликат. -Это существующий дефект следующей ступени приёма, не устранённый переносом ACK -после recv_q. Воспроизведение: /tmp/etcp-unpack-admission-review.c/.mk/.log -(exit=1, учёт памяти при teardown проверен). Следующее исправление должно -сохранять недообработанный фрагмент и cursor при OOM до повторной сборки, -а reset/close — снимать retry и освобождать его ровно один раз. +OOM следующей ступени приёма исправлен аварийным перезапуском сессии. +До сохранения RX DATA в recv_q отказ остаётся обычной потерей без ACK. +После принятия данных OOM в packer/unpacker или TX inflight запускает новую +локальную эпоху: старый поток отбрасывается, DATA блокируются до подтверждения. +Физические линки сохраняются; владельцы после REINIT восстанавливают операции +своего протокола. Это прерывание сессии, без гарантии воспроизведения старых DATA. +Удалено восстановление старых inflight-фрагментов через realloc и normalizer. +queue_clear и очистка etcp_conn_reset не выделяют память; normalizer не получил +новых OOM-очередей, cursor или retry-таймеров. Отдельно от очистки согласование +эпох требует памяти: OOM control-пакета допускает повтор в пределах исходных 10с, +отказ обязательного таймера или RNG локальной эпохи приводит к явному закрытию. +После reset/close из пользовательского callback разбор старого фрагмента прекращается. + +Новые проверки: windows31 сценарий PASS, ll_queue_regressions77/77 PASS. +Инъекции отказов покрывают RX первую/следующую кодограмму фрагмента, TX буфер, +метаданные фрагмента/inflight, flush/waiter, отказ очереди, RNG и session-таймеры. +При запрете всех allocator-ов etcp_conn_reset не делает ни одной попытки выделения. +Шифрованный двусторонний тест проходит настоящий HELLO/CHALLENGE/CONFIRM: +REINIT у обоих владельцев, четыре линка UP, старые DATA отклонены, новые доставлены. +Десять тестов очередей/normalizer/ETCP/STCP/NCD/метрик проходят ASAN/UBSan +с detect_leaks=1. Логи: /tmp/etcp-oom-reinit-asan-test_*.log, +/tmp/etcp-abort-faults-final.log, /tmp/etcp-abort-encrypted-recovery.log. +Исходное воспроизведение потери: /tmp/etcp-unpack-admission-review.c/.mk/.log. Исходные нарушения до реализации (пункты 1–5 и вход recv_q из пункта 8 исправлены) @@ -98,7 +113,7 @@ ACK_queued=1, messages=0, удерживаемых данных нет. Повт Инъекция отказа data_pool подтвердила: ACK_queued=1, DATA_stored=0, delivered_till=0. Это дефект надёжности, а не только неточность статистики BBR. После исправления этой ступени дополнительно проверен unpacker: его OOM - также не должен уничтожать уже подтверждённые фрагменты (см. текущий статус). + теперь явно прерывает сессию вместо продолжения повреждённого потока (см. статус). Экспериментальная проверка причин @@ -282,15 +297,11 @@ uint8: хранить факт состоявшейся отправки отд без смены алгоритма выбора DATA, поэтому дополнительная эвристика пока лишняя. 3. Быстрое восстановление и здоровье каналов. - До изменения этой политики исправить удержание ACKed DATA при OOM unpacker: - ограниченный retry сборки, сохранённый fragment/cursor, reentrant reset/close, - OOM на первой и последующей кодограмме одного фрагмента, повтор DATA во время OOM. - Чистый вариант владения: не извлекать head из output_queue до полного разбора; - normalizer хранит cursor и единственный retry-token, очередь владеет фрагментом. - При OOM callback остаётся приостановленным, повтор сборки не меняет seq/ACK/BBR. - reset/close отменяет token и сбрасывает cursor; фрагменты освобождает владелец очереди. - После callback приложения проверять epoch/close до следующего обращения к заимствованному head: - reentrant reset мог уже очистить очередь. Отдельно проверить OOM самого retry-таймера. + Предварительное исправление OOM завершено: выбран сброс всей сессии с сохранением + линков, без удержания старого fragment/cursor и без отдельного OOM retry. + Очистка не выделяет память, старые callbacks/ожидания отменяются; активные + обработчики удерживают teardown и проверяют reset_count/close после callbacks. + Проверены OOM на первой/следующей кодограмме и восстановление новой эпохи. Собственный RTT/RTO и ротация уже обязательны в этапе 2. Проверить срок первой повторной отправки, отдельно от объявления потери/снятия окна старой попытки. При потере ограничить новые DATA на проблемном пути, пробовать восстановление diff --git a/doc/tasks.md b/doc/tasks.md index 5d05420f..338ac7cf 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -15,12 +15,15 @@ Полная штатная multipath-матрица: FAIL, 20 нарушений. Есть недобор RTT20/200мс и bidirectional; slow-drop даёт паузу401мс, два зависших пути676мс, DROP/HOLD под нагрузкой229–243мс. Ранние копии до RTO, здоровье/пробы каналов и STCP backpressure пока не реализованы; пороги тестов сохранены. - Приоритетный новый результат проверки: pn_unpacker_cb при OOM уничтожает уже ACKed фрагмент, - продвигает till, повтор отбрасывает как дубликат. Подтверждено fault injection: ACK=1, till=1, messages=0. - Нужны удержание fragment/cursor и повтор сборки с корректным reset/close, затем возврат к отказоустойчивости. + OOM после принятия данных исправлен аварийной сменой эпохи с сохранением физических линков. + Старый поток отбрасывается без воспроизведения; после согласования владельцы получают REINIT. + Очистка reset не выделяет память; убрана реконструкция inflight, новых OOM-очередей/таймеров нет. + Проверены отказы RX/TX, flush/waiter/session-таймеров, RNG, reset/close из callback и ноль выделений при reset. + windows31 сценарий, queue_regressions77/77 и шифрованное восстановление обеих сторон PASS; + десять тестов ASAN/UBSan с detect_leaks=1 PASS. Далее — ранние повторы и здоровье каналов. План и подробные результаты: [doc/etcp_multipath_plan.txt](etcp_multipath_plan.txt). Логи: /tmp/etcp-attempts-matrix.log, /tmp/etcp-attempts-asan-test_*.log, - /tmp/etcp-unpack-admission-review.log; диагностический стенд OOM оставлен в /tmp. + /tmp/etcp-oom-reinit-asan-test_*.log, /tmp/etcp-abort-encrypted-recovery.log. [+] **ETCP/BBR: бюджет очереди в установившемся режиме** — реализовано 23.10.2026 по выбору пользователя: В PROBE_BW окно ограничено max(4*MSS, BDP + BW*20мс), с насыщением арифметики и учётом ACK/PROBE_UP резервов