|
|
|
|
@ -46,6 +46,7 @@ struct network_test {
|
|
|
|
|
uint64_t disk_started_tb; |
|
|
|
|
int disk_released, disk_error; |
|
|
|
|
unsigned peak_inflight; |
|
|
|
|
int (*server_receive_ready)(struct UTUN_INSTANCE*, uint64_t, uint64_t, const uint8_t*, size_t); |
|
|
|
|
int (*saved_receive_ready)(struct UTUN_INSTANCE*, uint64_t, uint64_t, const uint8_t*, size_t); |
|
|
|
|
unsigned restart_tick; |
|
|
|
|
struct api_case api[8]; |
|
|
|
|
@ -80,10 +81,17 @@ static void capture_log(int level, const char* category, const char* message) {
|
|
|
|
|
(void)level; (void)category; |
|
|
|
|
struct network_test* t = active; |
|
|
|
|
if (strstr(message, "router receive paused:")) t->receive_pauses++; |
|
|
|
|
if (!t->slow_queued && strstr(message, "member_files: rx") && strstr(message, "kind=1 cmd=DATA")) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Задержка диска начинается с первого DATA; сценарий не зависит от текста и уровня логов. */ |
|
|
|
|
static int server_receive_ready(struct UTUN_INSTANCE* inst, uint64_t group, uint64_t peer, const uint8_t* payload, size_t bytes) { |
|
|
|
|
struct network_test* t = active; |
|
|
|
|
if (!t->slow_queued && bytes >= MF_WIRE_HEADER && payload[1] == MF_REQUEST && payload[2] == MF_STREAM_DATA) { |
|
|
|
|
t->slow_queued = 1; |
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_MEDIA, "member_files test: first DATA received; delaying disk worker"); |
|
|
|
|
mf_worker_submit(t->nodes[SERVER]->member_files->disk, slow_disk, t, slow_done, t); |
|
|
|
|
} |
|
|
|
|
return t->server_receive_ready(inst, group, peer, payload, bytes); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void api_event(void* arg, const struct mf_transfer_progress* p) { |
|
|
|
|
@ -325,7 +333,6 @@ again:
|
|
|
|
|
int main(void) { |
|
|
|
|
debug_config_init(); debug_set_level(DEBUG_LEVEL_ERROR); debug_set_category_level(DEBUG_CATEGORY_MEDIA, DEBUG_LEVEL_DEBUG); |
|
|
|
|
test_clock_init(1000); |
|
|
|
|
debug_set_category_level(DEBUG_CATEGORY_DEBUG, DEBUG_LEVEL_TRACE); |
|
|
|
|
debug_set_category_level(DEBUG_CATEGORY_ETCPROUTE, DEBUG_LEVEL_DEBUG); |
|
|
|
|
utun_instance_set_tun_init_enabled(0); |
|
|
|
|
struct network_test t = { .disk_mutex = PTHREAD_MUTEX_INITIALIZER, .disk_condition = PTHREAD_COND_INITIALIZER }; active = &t; |
|
|
|
|
@ -341,6 +348,8 @@ int main(void) {
|
|
|
|
|
chat_event_set_handler(t.nodes[i], event); |
|
|
|
|
} |
|
|
|
|
if (setup(&t)) { t.failed = 1; goto stop; } |
|
|
|
|
t.server_receive_ready = t.nodes[SERVER]->router_bindings.receive_ready[ETCP_RT_ID_MEMBER_FILES]; |
|
|
|
|
etcp_router_set_receive_ready(t.nodes[SERVER], ETCP_RT_ID_MEMBER_FILES, server_receive_ready); |
|
|
|
|
t.timer = uasync_set_timeout(t.ua, 100, &t, tick, "member_files_test"); test_clock_mainloop(t.ua); |
|
|
|
|
if (!t.failed) { |
|
|
|
|
// Stop/destroy вне callbacks: server cleanup ещё использует storage после текущего I/O.
|
|
|
|
|
|