Record reproduced media replication failures and correct cursor audit

This commit is contained in:
evgeny committed 2026-10-22 20:11:06 +02:00
1 parent e8843d9499
commit 964a938437
1 file changed
+21 -8
+21 -8
View File
@@ -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 и доставленной первой пачке.