Record completed fail-fast OOM recovery and remaining multipath work
This commit is contained in:
1 parent
3bba05d354
commit
bbe43b9842
2 files changed
+36
-22
No files matched your search
+29
-18
@@ -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
@@ -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 резервов
|
||||
|
||||
Reference in new issue
Block a user