Describe bounded media lookup and peer slot state
This commit is contained in:
1 parent
6267973d62
commit
92c514ce18
2 files changed
+19
-3
No files matched your search
@@ -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 — только суперузел
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in new issue
Block a user