diff --git a/doc/tasks.md b/doc/tasks.md index e48c298f..1cde3d08 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -138,7 +138,7 @@ Десять целевых наборов ASAN+UBSan с detect_leaks=1: PASS (/tmp/media-block-asan-test_*.log). Windows runtime/сборка не проверялись. Синхронные проверка и сборка блоков остаются в uasync. -[ ] **media_delivery: исправить репликацию суперузлов** — воспроизведено 22.10.2026 через реальные router callbacks/SQLite: +[+] **media_delivery: исправить репликацию суперузлов** — исправлено 22.10.2026. Воспроизведения прежней реализации: 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, обмен сам не завершается. @@ -153,12 +153,20 @@ 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-эха. Исправление кода ещё не выполнялось. + Реализованы receiver-driven SYNC_REQ/SYNC_RESP и CHANGED вместо HELLO/ACK/inflight: одна страница с UUID на (group,peer). + Группа/источник только из router, актуальные подписанные роли обоих участников; CM владеет прямым/непрямым путём. + Страницы до 32 строк, little endian, 64-битные ID; high-water из sqlite_sequence, сохранённая эпоха каталога. + Весь RX packet и курсор фиксируются собственной транзакцией после полной проверки, включая ошибки commit/rollback SQLite. + Идемпотентный максимум (status,timestamp) выдаёт новый локальный ID только при изменении; собственные блоки сеются из media_files. + Таймаут повторяет прежний запрос, CHANGED/dirty и периодическая сверка не теряют обновление около последней страницы. + Репликация соблюдает backpressure; ограниченный слот ответа и watchdog восстанавливаются после reset router send_q. + Потеря роли/удаление канала очищают строки вместе с RX-курсорами только своей группы; обычный stop сохраняет БД. + test_media_replication: 10000 строк, id>2^32, усечения/дубли/чужие ответы, SQL read/write/commit faults, + потеря запросов/ответов/CHANGED, DOWN/UP, новая эпоха, две группы, смена роли, три узла, заполнение/reset очередей. + SQL-тест использует настоящую схему; сетевые full/chat/integration — CHAT-группы и подписанные роли member_sync. + Финальный ./check.sh: 180/180, proxy 9/9, burst/load PASS (/tmp/media-repl-full-check-final.log). + 11 целевых наборов ASAN+UBSan с detect_leaks=1: PASS (/tmp/media-repl-asan-final-test_*.log). + Контракты обновлены в media_delivery.h/media_delivery_proto.h, sync.md и doc/service_lifecycle.md. Windows не проверялся. [+] **test_stream_service: убрать зависимость bootstrap-проверки от гонки TCP-handshake** — исправлено 22.10.2026: Падение на строке 409: REINIT=0 при probes=1/subflows=1/failures=0 и доставленной первой пачке. diff --git a/src/media_delivery/sync.md b/src/media_delivery/sync.md index a9e34997..1e8865de 100644 --- a/src/media_delivery/sync.md +++ b/src/media_delivery/sync.md @@ -53,7 +53,7 @@ Raw ETCP DOWN и потеря BGP-маршрута не удаляют объя Все числа SYNC кодируются little endian. UUID запроса и эпоха — непрозрачные 16 байт. ID строк/курсоры ограничены INT64_MAX. Максимум ответа — 1493 байта. -После CM UP получатель создаёт запрос с новым UUID и сохранёнными эпохой/курcором +После CM UP получатель создаёт запрос с новым UUID и сохранёнными эпохой/курсором источника. На пару «группа–пир» приходится один ожидающий запрос. При таймауте повторяются его прежние UUID и параметры, с задержками 2, 4, 8, 16, 30 секунд. Успешный commit сбрасывает задержку до 2 секунд. DOWN отменяет RPC; UP создаёт новый UUID. @@ -124,7 +124,7 @@ Watchdog каждые 200ms проверяет дедлайны, повторя настоящую схему, restart/reset и сохранность media_files. Full/chat/integration проверяют реальные транспорт, CHAT-членство и подписанные роли. -## 12. Попытки передачи и relay +## Попытки передачи и relay Актуальные структуры пакетов находятся в `media_delivery_proto.h`, владение загрузкой — в `media_download.h`, источником байтов и выдачами — в `media_delivery.h`.