diff --git a/doc/tasks.md b/doc/tasks.md index 50b616c1..e48c298f 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -138,14 +138,27 @@ Десять целевых наборов ASAN+UBSan с detect_leaks=1: PASS (/tmp/media-block-asan-test_*.log). Windows runtime/сборка не проверялись. Синхронные проверка и сборка блоков остаются в uasync. -[ ] **media_delivery: отдельно проверить и исправить репликацию суперузлов** — выявлено чтением кода 22.10.2026: - md_handle_super_repl проверяет только заголовок, затем читает num_entries записей по 56 байт без проверки payload. - md_handle_super_ack без проверки уменьшает uint8_t inflight_count: повторный/чужой ACK может исказить счётчик. - super_sync.last_recv_id записывается при приёме репликации и при ACK, а затем используется для SUPER_HELLO: - требуется разделить направление курсоров и сопоставить ACK с реально ожидающей пачкой. - Проверить также сужение 64-битных SQLite id до uint32_t seq/ack_seq и повторную отправку той же пачки в inflight. - Это отдельный участок; завершённые исправления BLOCK_CHUNK/BLOCK_DONE/relay не означают его корректность. - Динамическое воспроизведение этих дефектов и план исправления ещё не выполнены. +[ ] **media_delivery: исправить репликацию суперузлов** — воспроизведено 22.10.2026 через реальные router callbacks/SQLite: + SUPER_REPL с num_entries=1 и одним заголовком: ASAN use-after-poison при чтении id в media_delivery.c:622. + ACK от известного пира в другой router-группе без ожидающей пачки: inflight 0→255, tx_cursor=77, запускается timer. + HELLO двух пустых узлов: после 20 доставок остаётся следующий HELLO, обмен сам не завершается. + Для 9 записей sender ставит 4 одинаковые пачки первых 4 записей. По таймауту 20000→40000 при inflight=4 + отправляет 0 повторов, хотя timer снова вооружён. На потерю ACK эта схема не восстанавливается. + При id=4294967297 первая запись остаётся 64-битной, но seq максимума пачки усечён до 4. + Ошибка INSERT второй строки оставляет первую применённой, сохраняет RX cursor=2 и отправляет ACK=2: теряются данные. + Группа из тела HELLO переопределяет router-группу (111→333); ответ включает записи групп 111 и 222. + Старая пачка уменьшает сохранённый RX cursor 2→1. После supernode stop/start чужие записи удалены, + но cursor=2 сохранён и рекламируется в HELLO. Принятая запись не будит выдачу третьему готовому супер-пиру. + Уточнение прежней записи: смешения направлений курсоров в БД нет — md_ss_set вызывается только при приёме REPL; + ACK обновляет peer_last_recv_id в памяти. Исправлять нужно подтверждение ожидающей пачки и жизненный цикл курсоров. + Стенд вне репозитория /tmp/media-super-audit.c; обычные логи /tmp/media-super-audit-{ack,hello,pages,timeout,wide,sql,group,purge,replay,forward}.log. + ASAN: /tmp/media-super-audit-truncated-asan.log, exit=1 ожидаем из-за подтверждённой ошибки, не успешный regression. + Направление исправления: peer/state по (group,node), группа только из router, проверка ролей обоих участников; + bounded HELLO request/response с корреляцией и поколениями, 64-битные ID, одна неизменяемая ожидающая пачка с UUID; + ACK только этой пачки, retry тех же байтов с backpressure; весь RX packet + cursor в одном savepoint после полной проверки. + При удалении принятых данных инвалидировать соответствующие RX cursors, после commit будить остальных пиров своей группы. + Регрессии: потеря/дубли/перестановка/старые сеансы, id>2^32, SQL rollback, две группы/один пир, role stop/start, + восстановление БД источника и сходимость трёх узлов без HELLO-эха. Исправление кода ещё не выполнялось. [+] **test_stream_service: убрать зависимость bootstrap-проверки от гонки TCP-handshake** — исправлено 22.10.2026: Падение на строке 409: REINIT=0 при probes=1/subflows=1/failures=0 и доставленной первой пачке.