Document media lookup lifetimes and remove obsolete shared state
This commit is contained in:
1 parent
093e537fed
commit
a3f3b2fff2
3 files changed
+48
-20
No files matched your search
@@ -393,7 +393,7 @@ static void md_dl_pump_cb(void* arg) {
|
||||
|
||||
/* Только суперузлы запрошенной CHAT-группы; автор всегда имеет отдельное последнее место. */
|
||||
static void md_dl_collect_supernodes(struct UTUN_INSTANCE* inst, struct media_download* dl) {
|
||||
dl->super_count = 0; dl->super_current = 0;
|
||||
dl->super_count = 0;
|
||||
struct TOPO_GROUP* g = inst->topo_groups ? topo_groups_find(inst->topo_groups, dl->group_id) : NULL;
|
||||
if (g && g->group_type == TOPO_GROUP_TYPE_CHAT && g->channel_id[0] && inst->topo_sqlite_db) {
|
||||
char sql[256];
|
||||
@@ -446,7 +446,7 @@ static int md_dl_query_pump(struct media_download* dl, uint64_t now_tb) {
|
||||
if (media_index_generate_uuid(dl->query_id)) {
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_MEDIA, "%s: QUERY UUID failed", MDL_ID); return -1;
|
||||
}
|
||||
dl->super_current = source; dl->query_node = dl->super_nodes[source];
|
||||
dl->query_node = dl->super_nodes[source];
|
||||
uint8_t packet[MEDIA_QUERY_HDR_SIZE + MEDIA_QUERY_MAX_BLOCKS * 16] = {0};
|
||||
struct media_pkt_query* q = (struct media_pkt_query*)packet;
|
||||
q->subcmd = MEDIA_SUBCMD_QUERY; q->num_blocks = (uint16_t)dl->query_count;
|
||||
@@ -556,8 +556,7 @@ void media_download_handle_chunk(struct UTUN_INSTANCE* inst,
|
||||
uint32_t off = ch->offset;
|
||||
uint32_t end = off + (uint32_t)wlen;
|
||||
if (end > b->bytes_received) b->bytes_received = end;
|
||||
dl->last_activity_tb = get_time_tb();
|
||||
b->last_progress_tb = dl->last_activity_tb;
|
||||
b->last_progress_tb = get_time_tb();
|
||||
if (b->state == MD_BLK_REQ || b->state == MD_BLK_CONN) b->state = MD_BLK_RECV;
|
||||
|
||||
/* rate-limited progress: log at block start, every 1MB, and when block data is complete */
|
||||
@@ -641,7 +640,6 @@ void media_download_handle_done(struct UTUN_INSTANCE* inst,
|
||||
|
||||
struct media_download_block* b = &dl->blocks[bi];
|
||||
if (b->state == MD_BLK_DONE) return;
|
||||
dl->last_activity_tb = get_time_tb();
|
||||
|
||||
/* verify block data: Ed25519 signature from author, or size-only fallback */
|
||||
int sig_ok = 0;
|
||||
@@ -914,7 +912,6 @@ int media_download_start(struct UTUN_INSTANCE* inst, uint64_t group_id,
|
||||
dl = (struct media_download*)qe->data;
|
||||
|
||||
md_dl_collect_supernodes(inst, dl);
|
||||
dl->last_activity_tb = get_time_tb();
|
||||
|
||||
DEBUG_INFO(DEBUG_CATEGORY_GENERAL, "%s: download started media=%02x%02x... blocks=%d supers=%d",
|
||||
MDL_ID, dl->media_id[0], dl->media_id[1], dl->num_blocks, dl->super_count);
|
||||
|
||||
@@ -2,7 +2,10 @@
|
||||
* Состояние хранит inst->md. При открытии подключения через conn_mgr загрузчик получает CM handle.
|
||||
* Найденный ETCP_CONN используется без нового handle; при отсутствии conn_mgr запрос отправляется best-effort без handle.
|
||||
* Старт копирует метаданные result; callbacks, обработчики и файловые операции выполняются в uasync-потоке.
|
||||
* Failover/таймер простоя ограничивают повторы; done сообщает результат, а не гарантирует доставку другим участникам. */
|
||||
* QUERY: одна пачка до 32 блоков в полёте, отдельный UUID/дедлайн, источники только своей группы и автор.
|
||||
* До четырёх кандидатов на блок; до десяти используемых узлов, слоты переиспользуются после освобождения.
|
||||
* Повторы ограничены источниками и бюджетом провалов блока; OVERLOADED соблюдает retry_after.
|
||||
* done сообщает результат, а не гарантирует доставку другим участникам. */
|
||||
#ifndef MEDIA_DOWNLOAD_H
|
||||
#define MEDIA_DOWNLOAD_H
|
||||
|
||||
@@ -33,7 +36,7 @@ enum md_block_state {
|
||||
MD_BLK_CONN, /* conn_mgr_open в процессе, BLOCK_REQ ещё не отправлен */
|
||||
MD_BLK_REQ, /* BLOCK_REQ отправлен, ждём первый чанк */
|
||||
MD_BLK_RECV, /* чанки идут */
|
||||
MD_BLK_WAIT, /* перегружен/нет свободного держателя — ретрай позже */
|
||||
MD_BLK_WAIT, /* Причина в wait_reason: поиск, занятые слоты или retry_at_tb. */
|
||||
MD_BLK_DONE, /* BLOCK_DONE + сигнатура валидна */
|
||||
MD_BLK_FAILED /* попытки исчерпаны */
|
||||
};
|
||||
@@ -83,7 +86,6 @@ struct media_download {
|
||||
int err;
|
||||
uint64_t super_nodes[10];
|
||||
int super_count;
|
||||
int super_current;
|
||||
uint64_t announce_node; /* Адресат HAVE_BLOCK, независимый от текущего QUERY. */
|
||||
uint8_t query_id[16]; /* UUID ожидающей попытки; поздние ответы игнорируются. */
|
||||
uint64_t query_node;
|
||||
@@ -92,8 +94,7 @@ struct media_download {
|
||||
int query_blocks[MEDIA_QUERY_MAX_BLOCKS]; /* Индексы пачки в blocks, в порядке QUERY. */
|
||||
void* pump_timer; /* Отложенная обработка CM; отменяется до освобождения dl. */
|
||||
uint64_t author_node_id; /* fallback, когда у суперноды нет инфо */
|
||||
void* watchdog_timer; /* таймер простоя (2с) */
|
||||
uint64_t last_activity_tb; /* любая входящая активность (chunk/done/query_resp) */
|
||||
void* watchdog_timer; /* Ближайший QUERY/простой блока/retry_at; отменяется до done_cb. */
|
||||
int num_peers;
|
||||
struct media_download_peer peers[MD_MAX_PEERS];
|
||||
void (*done_cb)(void* arg, int err);
|
||||
@@ -120,6 +121,9 @@ int media_download_cancel(struct UTUN_INSTANCE* inst,
|
||||
const uint8_t* media_id, const uint8_t* block_id, uint32_t chunk);
|
||||
|
||||
/* ── handlers for incoming data, called from md_etcp_recv dispatch ── */
|
||||
/* Полный ответ пачки. group_id/from_node — из router; несовпадающие/истёкшие попытки игнорируются.
|
||||
* Повреждённый пакет не меняет состояние; ошибка поиска продолжает обход источников.
|
||||
* Может завершить загрузку и вызвать done_cb; после возврата прежний dl может быть освобождён. */
|
||||
void media_download_handle_query_resp(struct UTUN_INSTANCE* inst,
|
||||
uint64_t group_id, uint64_t from_node, const uint8_t* data, size_t len);
|
||||
void media_download_handle_chunk(struct UTUN_INSTANCE* inst,
|
||||
@@ -139,9 +143,9 @@ void md_dl_conn_cb(struct CONN_MGR_HANDLE* h, uint64_t node_id, uint64_t group_i
|
||||
enum conn_mgr_event event, void* arg);
|
||||
|
||||
/* ── тестовые хуки (для детерминированных юнит-тестов с «фейковым» временем) ──
|
||||
* md_dl_check_stall — проверка простоя: возвращает 0 (активна) / -1 (провал, нужно finish).
|
||||
* md_dl_check_stall — обработать QUERY/простой/ожидание, запустить готовые блоки; 0 / -1 (нужен finish).
|
||||
* md_dl_failover_block — переход блока к следующему держателю: 0, включая DONE/FAILED и ожидание новых держателей;
|
||||
* -1 — исчерпаны попытки или не удалось начать запрос (лимит peers, ошибка conn_mgr_open).
|
||||
* -1 — исчерпаны попытки или локальная ошибка; занятые peer-слоты возвращают 0.
|
||||
* 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);
|
||||
|
||||
Reference in new issue
Block a user