docs: correct member file protocol and media download contracts

This commit is contained in:
evgeny committed 2026-10-21 16:01:30 +02:00
1 parent be235e01aa
commit 88e930cc0a
3 files changed
+18 -9

No files matched your search

+11 -6
View File
@@ -136,6 +136,7 @@ Windows удерживает родительские каталоги без SH
9 RENAME: owner/path/target/version. Только внутри UID/группы, без замены
существующего назначения. Активная загрузка в затрагиваемом пути — BUSY.
10 REMOVE: owner/path/version. Файл или пустой каталог, без рекурсивного удаления.
Непустой каталог возвращает DIRECTORY_NOT_EMPTY.
11 STREAM_WRITE: открытие потоковой загрузки; поля как BEGIN_WRITE,
cursor — ненулевой ID потока. Ответ подтверждает готовность temp и конечный размер.
@@ -164,8 +165,9 @@ Windows удерживает родительские каталоги без SH
При закрытии/перезапуске router-канала его handles завершаются с IO_ERROR;
байты разных эпох не смешиваются. Возобновление через новую эпоху пока не реализовано.
Статусы (0..13): OK, ACCESS_DENIED, NOT_FOUND, INVALID_PATH, INVALID_RANGE,
EXISTS, BUSY, STALE, NO_SPACE, IO_ERROR, BAD_PACKET, HASH_MISMATCH, CANCELLED, TIMEOUT.
Статусы (0..14): OK, ACCESS_DENIED, NOT_FOUND, INVALID_PATH, INVALID_RANGE,
EXISTS, BUSY, STALE, NO_SPACE, IO_ERROR, BAD_PACKET, HASH_MISMATCH, CANCELLED, TIMEOUT,
DIRECTORY_NOT_EMPTY.
Мутации COMMIT/MKDIR/RENAME/REMOVE сохраняют успешный ответ на 120 секунд
(64 квитанции); тот же request_id с другим содержимым — BAD_PACKET.
COMMIT дополнительно узнаётся по upload UUID. При заполнении квитанций новая
@@ -355,11 +357,14 @@ tests/test_member_files_network: настоящие A/B/M, подписанна
Также проверяются чужая запись, виртуальный корень и подписанное удаление читателя.
QUOTA проверяется на настоящем подписанном/зашифрованном канале; удалённый читатель не получает счётчики.
test_services — stop/start общего чат-сервиса.
Текущая диагностика выделена в категорию debug. Настройка для полного трасса:
Диагностика файлового сервиса — категория media, маршрутизатора — etcp_route.
Настройка для полного трасса этих модулей:
[debug]
debug=trace
debug=debug показывает запрос/ответ, ACL, очереди, маршрут, ACK, crypto-решения,
I/O, fd idle и состояние браузера. trace дополнительно показывает каждый
media=trace
etcp_route=trace
media=debug показывает запрос/ответ, ACL, очереди файлового сервиса, I/O и fd idle.
etcp_route=debug добавляет выбор маршрута, состояния канала и ретрансмиты.
Уровень trace дополнительно показывает каждый
read/write и передачу задач/завершений между дисковым потоком и uasync.
stream progress раз в секунду показывает ID/направление, done/total, число блоков
в кольце, активность I/O, причину ожидания и скорость B/s. Router логирует переходы
+4 -2
View File
@@ -1,5 +1,6 @@
/* media_download — загрузка канального файла по media_index_result: QUERY держателей → блоки → проверка/сборка.
* Состояние хранит inst->media_delivery; каждый подключённый держатель удерживается через CM handle.
* Состояние хранит inst->md. При открытии подключения через conn_mgr загрузчик получает CM handle.
* Найденный ETCP_CONN используется без нового handle; при отсутствии conn_mgr запрос отправляется best-effort без handle.
* Старт копирует метаданные result; callbacks и обработчики — uasync-поток, файловая проверка — media_async.
* Failover/таймер простоя ограничивают повторы; done сообщает результат, а не гарантирует доставку другим участникам. */
#ifndef MEDIA_DOWNLOAD_H
@@ -118,7 +119,8 @@ void md_dl_conn_cb(struct CONN_MGR_HANDLE* h, uint64_t node_id, uint64_t group_i
/* ── тестовые хуки (для детерминированных юнит-тестов с «фейковым» временем) ──
* md_dl_check_stall — проверка простоя: возвращает 0 (активна) / -1 (провал, нужно finish).
* md_dl_failover_block — фейловер одного блока на следующий держатель: 0 / -1 (попытки исчерпаны).
* md_dl_failover_block — переход блока к следующему держателю: 0, включая DONE/FAILED и ожидание новых держателей;
* -1 — исчерпаны попытки или не удалось начать запрос (лимит peers, ошибка conn_mgr_open).
* md_dl_dump — дамп состояния загрузки в лог (DEBUG_CATEGORY_MEDIA). */
int md_dl_check_stall(struct media_download* dl, uint64_t now_tb);
int md_dl_failover_block(struct media_download* dl, int bi, uint64_t now_tb);
+3 -1
View File
@@ -59,7 +59,9 @@ void member_files_gui_request(void* arg);
struct mf_transfer_request {
struct UTUN_INSTANCE* inst; // ядро с работающим чат-сервисом
uint64_t id, group, server, owner; // ID операции (0=авто), CHAT-группа, storage-узел и UID владельца каталога
uint64_t max_bytes; // 0 — без лимита; проверяется до открытия локального файла и передачи данных.
// Дополнительный лимит размера; 0 — без него. Upload: после открытия источника, до хеширования;
// download: по ответу STAT, до открытия локального temp и передачи данных.
uint64_t max_bytes;
int upload; // ненулевой — загрузить local на сервер, 0 — скачать remote
uint8_t version[16]; // версия из STAT; нули при создании нового серверного файла
char remote[MF_PATH_MAX + 1], local[MF_PATH_MAX + 1]; // путь в каталоге owner и локальный путь приложения