From 5259c746d14eed6a7394ab320efe4142b4c87a7d Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 26 Oct 2026 12:19:42 +0100 Subject: [PATCH] Record INFO expiry fix and complete IPv6-isolated verification --- doc/stream.txt | 6 ++-- doc/stream_audit_findings.txt | 57 ++++++++++++++++++++++++++++++++++- doc/tasks.md | 28 +++++++++++------ 3 files changed, 78 insertions(+), 13 deletions(-) diff --git a/doc/stream.txt b/doc/stream.txt index 662102018..81b6004c0 100644 --- a/doc/stream.txt +++ b/doc/stream.txt @@ -11,9 +11,9 @@ stream_block.h, stream_source.h, stream_media.h и stream_optimizer.h; оста Дефект publisher_block устранён: помещающийся Opus уходит в отдельную аудиопачку, ожидающее видео получает следующий слот actor. Штатный test_stream_publisher проверяет 23 сценария границ, продвижения треков и OPENING/FIN; раздел 7 отчёта. -При продолжении найден дефект expire_controls: ожидается длина INFO_REQ8 вместо9, -поэтому просроченный запрос удаляется без закрытия его пробы. Аудит остановлен; -реализация не исправлена, изолированное подтверждение и вариант исправления — раздел8 отчёта. +Дефект expire_controls устранён: INFO_REQ9 сопоставляется по probe_id, просроченная +проба закрывается с OVERLOAD. Штатные проверки TTL и реальной ETCP-очереди пройдены; +полный check201/201 выполнен в отдельном IPv6 namespace — раздел9 отчёта. 1. Цель и принятые решения diff --git a/doc/stream_audit_findings.txt b/doc/stream_audit_findings.txt index 2f08bbc25..46db7ea97 100644 --- a/doc/stream_audit_findings.txt +++ b/doc/stream_audit_findings.txt @@ -9,7 +9,8 @@ описывают первоначальную диагностику и проверку архитектуры до внедрения deleted. В продолжении полностью прочитаны stream.c и stream_optimizer.c, уточнены их заголовки; теперь6[V]/12[~]/0[ ]. В частично прочитанном network подтверждён -новый дефект истечения INFO_REQ; реализация не менялась, остановка по AGENTS.md:10 (раздел8). +дефект истечения INFO_REQ (раздел8). Исправление и штатные проверки выполнены: +TTL4/4, обе реальные backpressure-сцены и check201/201 в отдельном IPv6 namespace PASS (раздел9). 1. Подтверждённый дефект: deleted не учитывается stream_member_load @@ -393,3 +394,57 @@ TTL отдельным штатным regression; дополнительно у в doc/tasks.md; текущий статус отражён в stream.txt и внешнем чек-листе. Полная сборка/check и sanitizers в этом продолжении не запускались; прежний check200/200 относится к исправлению publisher и новый дефект не покрывает. + +9. Исправление INFO expiry и проверка ETCP backpressure — 26.10.2026 + +expire_controls теперь сопоставляет полный INFO_REQ9 (ID8 + media1) с текущей +пробой. Проверка probe_id сохранена; истёкший запрос закрывает flow через прежний +flow_close(OVERLOAD,notify0). Wire, состояния и таймеры не менялись. +Существующий WARN дополнен bytes/age_ms/flow_closed: видно удаление конкретного +control и наличие связанного закрытия. Код исправления c1483512, тесты b116b20b. +Во время работы история перенесена поверх GUI-изменений; отсутствие различий +в src/lib/tests относительно собранного d89c1efa проверено отдельно. + +Штатный test_stream_control_expiry включён в общий check и напрямую использует +реальные control_put/wire parser/expire_controls. Проверены границы3999/4000/4001мс: +INFO9 media0/1 после TTL закрывают flow с OVERLOAD, несовпадающий probe_id +не закрывает текущую попытку, SUBSCRIBE8 сохраняет прежнюю обработку. +4/4 PASS; отслеживаемые allocations после cleanup восстановлены. + +В test_stream_service добавлена проверка на четырёх настоящих CHAT-ядрах с Merkle, +NCD и живым ETCP. Она выполняется в общем наборе и отдельно через --control-expiry-only. +После прогрева NCD/INFO callback настоящей send_input_q временно снимается. +Первый INFO остаётся в ETCP, второй — в control FIFO. Через4200мс в обоих media-режимах: +expired_sub0 state=CLOSED reason=OVERLOAD; held_sub1 state=INFO; publication/subscription +активны, исходное ETCP-соединение initialized/links_up. После возврата callback +приходит INFO_RESP; просроченная проба переоткрывается и получает новый ответ через +то же ETCP-соединение. Cleanup всех четырёх ядер восстанавливает tracked allocations. +В общем check этот же сценарий также прошёл внутри полного test_stream_service. + +Проверки и условия среды + +./build.sh --no-gui -j4 PASS: /tmp/stream-info-expiry-fix-build.log. +test_stream_control_expiry4/4 PASS: /tmp/stream-info-expiry-fix-unit.log. +test_stream_service --control-expiry-only PASS: /tmp/stream-info-expiry-fix-integration.log. +В изолированном сетевом прогоне включён stream=debug; unit включает video=warn, +поэтому проверен также новый WARN с bytes9/flow_closed1 и несовпадением ID/flow_closed0. +В fixture остаются логи отрицательных reachability-проб TCP; потоковые asserts, +готовность транспорта, восстановление и счётчики ресурсов проверены отдельно. + +Первый ./check.sh:198 passed,3 failed,0 skipped. Все три отказа вызваны bind(::1): +EADDRNOTAVAIL в test_ncd_faults, test_ipv6_sockets, test_route_connectivity. +IPv6 в основном namespace отключён (all/default/lo=1), ::1 отсутствует, +bind(::) работает. Сводка /tmp/stream-info-expiry-fix-full-check.log; +состояние среды /tmp/stream-info-expiry-host-ipv6.log. Код из-за этих отказов не менялся. + +Создан отдельный временный network namespace; IPv6 включён только в нём, +поднят lo/::1, сами проверки выполнялись от user. Все три прежних отказа PASS, +затем ./check.sh:201 passed,0 failed,0 skipped. Новый unit32мс, service80173мс. +Proxy9/9,burst PASS,load8/8,134217728 байт; полное время175с. +Логи /tmp/stream-info-expiry-fix-ipv6-env.log, +/tmp/stream-info-expiry-fix-ipv6-full-check.log и /tmp/stream-info-expiry-ipv6-test_*.log. +Основной namespace сохранён: all/default/lo=1 и bind(::1) по-прежнему EADDRNOTAVAIL. +Необходимость явной IPv6-диагностики runner записана отдельной задачей в doc/tasks.md. + +git diff --check PASS. Sanitizers, Qt GUI и Android на устройстве в этом исправлении +не запускались. Устранение дефекта не расширяет аудит:6[V]/12[~]/0[ ],doc/stream.txt[~]. diff --git a/doc/tasks.md b/doc/tasks.md index c4c897960..828a9a766 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -4,15 +4,25 @@ ## Текущие задачи -[ ] **stream: закрывать INFO-пробу при истечении её 9-байтового запроса** — найдено 26.10.2026. - prepare_requests создаёт INFO_REQ из probe_id8 + media_flag1; expire_controls ошибочно проверяет length8. - После TTL управляющей очереди4000мс запрос удаляется, но flow остаётся INFO до общего deadline5000мс. - По коду это меняет причину на TRANSPORT и обработку восстановления selector вместо OVERLOAD. - Изолированно проверены настоящие control_put/wire parser/expire_controls: оба media0/1 воспроизводят дефект; - устаревший probe_id и SUBSCRIBE8 обработаны правильно. Лог /tmp/stream-audit-info-expiry.log:2 failed из4. - Временная копия с проверкой9 даёт4/4 PASS; /tmp/stream-audit-info-expiry-checked.log; tracked allocations восстановлены. - Исправить проверку длины, сохранить сверку probe_id; добавить regression до/на/после TTL и с реальным backpressure. - Реализация не менялась; аудит остановлен по AGENTS.md:10. Подробности: [stream_audit_findings.txt](stream_audit_findings.txt),раздел8. +[+] **stream: закрывать INFO-пробу при истечении её 9-байтового запроса** — исправлено и проверено 26.10.2026. + expire_controls сверяет length9 и текущий probe_id; истёкший INFO закрывает flow с OVERLOAD. + Лог содержит размер, возраст control и факт закрытия flow; чужой probe_id не закрывает новую попытку. + test_stream_control_expiry4/4 PASS: обе media-формы, SUBSCRIBE8, до/на/после TTL и несовпадающий ID. + test_stream_service проверяет оба media-режима: настоящая очередь ETCP удерживается4,2с, + второй INFO истекает в control FIFO до общего deadline5с; после разблокировки ответ/повторное открытие успешны. + Общее ETCP-соединение и handles публикации/подписки сохраняются; cleanup без tracked leaks. + Сборка PASS. Первый check198/201: три отказа из-за отсутствующего ::1 при отключённом IPv6 окружения. + В отдельном IPv6 namespace check201/201 PASS,0 failed/0 skipped; proxy9/9,burst PASS,load8/8,134217728 байт,175с. + Настройки основного namespace не менялись. Логи /tmp/stream-info-expiry-fix-build.log, + /tmp/stream-info-expiry-fix-unit.log, ...-integration.log, ...-ipv6-full-check.log. + Подробности: [stream_audit_findings.txt](stream_audit_findings.txt),разделы8–9. Аудит остальных контрактов stream частичный. + +[ ] **tests: явно проверять IPv6-предпосылку полного набора** — замечено 26.10.2026. + В основном окружении disable_ipv6=1 для all/default/lo, ::1 отсутствует; bind(::1) даёт EADDRNOTAVAIL. + Из-за этого падают test_ncd_faults, test_ipv6_sockets и test_route_connectivity до проверки своей логики. + Предусмотреть ясную предварительную диагностику/подготовленный отдельный namespace без изменения сети хоста. + Все три проверки и полный набор201/201 проходят в таком namespace; пропуски не требуются. + Подтверждение: /tmp/stream-info-expiry-host-ipv6.log и /tmp/stream-info-expiry-fix-ipv6-env.log. [+] **stream: упаковывать помещающийся Opus без обязательного резерва под видео** — исправлено и проверено 26.10.2026. Без ожидающего видео используется вся ёмкость пачки, включая точное заполнение.