Record reproduced media replication failures and correct cursor audit
This commit is contained in:
1 parent
e8843d9499
commit
964a938437
1 file changed
+21
-8
+21
-8
@@ -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 и доставленной первой пачке.
|
||||
|
||||
Reference in new issue
Block a user