From e02c9f7727d16c6e21b616d9571b043c27f692d5 Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 22 Oct 2026 18:12:32 +0200 Subject: [PATCH] Cancel delayed CM UP before deferring failover --- src/media_delivery/media_download.c | 6 +++++- tests/test_media_delivery_integration.c | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/media_delivery/media_download.c b/src/media_delivery/media_download.c index 6a20cc65..3893ac4e 100644 --- a/src/media_delivery/media_download.c +++ b/src/media_delivery/media_download.c @@ -197,7 +197,7 @@ static int md_dl_request_block(struct media_download* dl, int bi) { } uint64_t holder = b->holders[b->holder_idx]; struct media_download_peer* p = md_dl_get_peer(dl, holder); - if (!p) { b->state = MD_BLK_WAIT; b->wait_reason = MD_WAIT_SLOT; return 0; } + if (!p || p->pending_event) { b->state = MD_BLK_WAIT; b->wait_reason = MD_WAIT_SLOT; return 0; } if (md_dl_reset_block_file(dl, bi)) { dl->err = -1; return -1; } b->bytes_received = 0; b->last_progress_tb = now; b->state = MD_BLK_CONN; b->wait_reason = MD_WAIT_NONE; @@ -341,6 +341,10 @@ void md_dl_conn_cb(struct CONN_MGR_HANDLE* h, uint64_t node_id, uint64_t group_i MDL_ID, (unsigned long long)node_id, (void*)h); return; } p->pending_event = (uint8_t)event + 1; + if (event != CONN_EVENT_UP) { + p->cm_handle = NULL; p->connected = 0; + conn_mgr_close(h); // Сразу отменить отложенный UP, до любого следующего uasync callback. + } if (!dl->pump_timer) dl->pump_timer = uasync_call_soon(dl->inst->ua, dl, md_dl_pump_cb); if (!dl->pump_timer) { DEBUG_ERROR(DEBUG_CATEGORY_MEDIA, "%s: cannot defer CM event", MDL_ID); dl->err = -1; diff --git a/tests/test_media_delivery_integration.c b/tests/test_media_delivery_integration.c index ff20269b..358d8a04 100644 --- a/tests/test_media_delivery_integration.c +++ b/tests/test_media_delivery_integration.c @@ -177,7 +177,7 @@ static void phase3_query(void) { struct media_pkt_query* q = (struct media_pkt_query*)pkt; memset(q, 0, sizeof(*q)); q->subcmd = MEDIA_SUBCMD_QUERY; - q->group_id = TOPO_GROUP_UTUN; + memset(q->request_id, 0x91, sizeof(q->request_id)); memcpy(q->media_id, block_uuid, 16); q->num_blocks = 1; memcpy(pkt + MEDIA_QUERY_HDR_SIZE, block_uuid, 16);