Record validated media supernode replication implementation

This commit is contained in:
evgeny committed 2026-10-22 21:21:43 +02:00
1 parent 71d3b017e6
commit 03f4cd7939
2 files changed
+17 -9

No files matched your search

+15 -7
View File
@@ -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 и доставленной первой пачке.
+2 -2
View File
@@ -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`.