Record completed fail-fast OOM recovery and remaining multipath work

This commit is contained in:
evgeny committed 2026-10-23 12:41:14 +02:00
1 parent 3bba05d354
commit bbe43b9842
2 files changed
+36 -22

No files matched your search

+29 -18
View File
@@ -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 на проблемном пути, пробовать восстановление
+7 -4
View File
@@ -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 резервов