Record INFO expiry fix and complete IPv6-isolated verification

This commit is contained in:
evgeny committed 2026-10-26 12:19:42 +01:00
1 parent b116b20b11
commit 5259c746d1
3 files changed
+78 -13

No files matched your search

+3 -3
View File
@@ -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. Цель и принятые решения
+56 -1
View File
@@ -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[~].
+19 -9
View File
@@ -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.
Без ожидающего видео используется вся ёмкость пачки, включая точное заполнение.