From 92c514ce186859adc2a398dd592d82bbc691c614 Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 22 Oct 2026 18:07:14 +0200 Subject: [PATCH] Describe bounded media lookup and peer slot state --- src/media_delivery/media_delivery.h | 1 + src/media_delivery/media_download.h | 21 ++++++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/media_delivery/media_delivery.h b/src/media_delivery/media_delivery.h index 28b39fad..232e1832 100644 --- a/src/media_delivery/media_delivery.h +++ b/src/media_delivery/media_delivery.h @@ -122,6 +122,7 @@ struct media_delivery_ctx { uint8_t stream_completed; // 1 = хотя бы один стрим завершился (для тестов) uint8_t streams_started; // монотонный счётчик запущенных стримов (для тестов) int dl_stall_timeout_tb; // таймаут простоя загрузки (по умолч. MEDIA_DL_STALL_TIMEOUT_TB) + int query_timeout_tb; // Дедлайн одной попытки QUERY, независимо от входящих чанков; 0 — 2с. int dl_max_attempts; // попыток на блок (по умолч. MEDIA_DL_MAX_ATTEMPTS) sqlite3* db; // = inst->topo_sqlite_db (кешируем для удобства) struct ll_queue* served_nodes; // media_served_node — только суперузел diff --git a/src/media_delivery/media_download.h b/src/media_delivery/media_download.h index 26de0b8f..79bf91ee 100644 --- a/src/media_delivery/media_download.h +++ b/src/media_delivery/media_download.h @@ -14,16 +14,19 @@ extern "C" { #include #include #include "../lib/ll_queue.h" +#include "media_delivery_proto.h" struct UTUN_INSTANCE; struct media_index_result; struct CONN_MGR_HANDLE; /* максимальное число узлов-держателей одного блока (кандидатов на фейловер) */ -#define MD_MAX_HOLDERS_PER_BLOCK 4 -/* максимальное число уникальных узлов-держателей в загрузке */ +#define MD_MAX_HOLDERS_PER_BLOCK MEDIA_QUERY_MAX_HOLDERS +/* Максимальное число одновременно используемых держателей; свободные слоты переиспользуются. */ #define MD_MAX_PEERS 10 +enum md_wait_reason { MD_WAIT_NONE, MD_WAIT_SEARCH, MD_WAIT_SLOT, MD_WAIT_RETRY }; + /* ── состояние блока в конечном автомате загрузки ── */ enum md_block_state { MD_BLK_IDLE = 0, /* ещё не запрошен */ @@ -46,6 +49,10 @@ struct media_download_block { uint32_t expected_size; /* реальный размер блока (последний короче) */ uint8_t state; /* enum md_block_state */ uint64_t last_progress_tb; /* get_time_tb() последнего чанка/прогресса */ + uint64_t retry_at_tb; /* Не запрашивать блок до этого срока после OVERLOADED. */ + int query_next; /* Следующий источник поиска; QUERY не сбрасывает attempts. */ + uint8_t author_tried; /* Прямой fallback автора уже запускался. */ + uint8_t wait_reason; /* enum md_wait_reason; нехватка слота не расходует attempts. */ }; /* ── соединение с узлом-держателем ── */ @@ -53,6 +60,7 @@ struct media_download_peer { uint64_t node_id; uint8_t connected; struct CONN_MGR_HANDLE* cm_handle; /* Один запрос на держателя; закрывается после DOWN/TIMEOUT или завершения загрузки. */ + uint8_t pending_event; /* CM event + 1; обработка отложена, чтобы open не вызывал рекурсивный pump. */ }; /* ── внутреннее состояние загрузки (доступно для тестов) ── */ @@ -76,6 +84,13 @@ struct media_download { 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; + uint64_t query_deadline_tb; /* 0 — нет ожидающего QUERY; чанки не меняют дедлайн. */ + int query_count; + 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) */ @@ -106,7 +121,7 @@ int media_download_cancel(struct UTUN_INSTANCE* inst, /* ── handlers for incoming data, called from md_etcp_recv dispatch ── */ void media_download_handle_query_resp(struct UTUN_INSTANCE* inst, - const uint8_t* data, size_t len); + uint64_t group_id, uint64_t from_node, const uint8_t* data, size_t len); void media_download_handle_chunk(struct UTUN_INSTANCE* inst, const uint8_t* data, size_t len); void media_download_handle_done(struct UTUN_INSTANCE* inst,