Describe bounded media lookup and peer slot state

This commit is contained in:
evgeny committed 2026-10-22 18:31:12 +02:00
1 parent 6267973d62
commit 92c514ce18
2 files changed
+19 -3

No files matched your search

+1
View File
@@ -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 — только суперузел
+18 -3
View File
@@ -14,16 +14,19 @@ extern "C" {
#include <stddef.h>
#include <stdio.h>
#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,