Create independent block attempts and cancel channel downloads safely
This commit is contained in:
1 parent
9b4974f02d
commit
4edf72ea14
2 files changed
+19
-39
No files matched your search
@@ -1384,40 +1384,16 @@ void media_delivery_cancel_channel(struct UTUN_INSTANCE* inst, uint64_t group_id
|
||||
if (stream->group_id == group_id) stream_free(stream);
|
||||
stream = next;
|
||||
}
|
||||
struct relay_fwd_ctx* forward = md->forwards;
|
||||
while (forward) {
|
||||
struct relay_fwd_ctx* next = forward->next;
|
||||
if (forward->group_id == group_id) relay_fwd_free(forward);
|
||||
forward = next;
|
||||
}
|
||||
|
||||
/* 1. собрать media_id активных загрузок этого канала и отменить их */
|
||||
uint8_t media_ids[MEDIA_MAX_DOWNLOADS][16];
|
||||
/* Callback отмены может изменить остальные загрузки: каждый раз ищем следующую заново. */
|
||||
int nm = 0;
|
||||
if (md->downloads) {
|
||||
struct ll_entry* de = md->downloads->head;
|
||||
while (de) {
|
||||
struct media_download* dl = (struct media_download*)de->data;
|
||||
struct ll_entry* next = de->next;
|
||||
if (dl->group_id == group_id) {
|
||||
if (nm < MEDIA_MAX_DOWNLOADS) memcpy(media_ids[nm++], dl->media_id, 16);
|
||||
media_download_cancel(inst, dl->media_id, NULL, 0);
|
||||
}
|
||||
de = next;
|
||||
}
|
||||
}
|
||||
|
||||
/* 2. удалить relay-контексты этих media (остаются после отмены загрузки) */
|
||||
for (int i = 0; i < nm; i++) {
|
||||
if (!md->relay_blocks) break;
|
||||
struct ll_entry* re = md->relay_blocks->head;
|
||||
while (re) {
|
||||
struct relay_block_ctx* rc = (struct relay_block_ctx*)re->data;
|
||||
struct ll_entry* next = re->next;
|
||||
if (memcmp(rc->media_id, media_ids[i], 16) == 0)
|
||||
md_relay_remove(md, rc->block_id);
|
||||
re = next;
|
||||
for (;;) {
|
||||
struct media_download* found = NULL;
|
||||
for (struct ll_entry* e = md->downloads ? md->downloads->head : NULL; e; e = e->next) {
|
||||
struct media_download* dl = (struct media_download*)e->data;
|
||||
if (dl->group_id == group_id) { found = dl; break; }
|
||||
}
|
||||
if (!found) break;
|
||||
media_download_cancel(inst, found->media_id, NULL, 0); nm++;
|
||||
}
|
||||
|
||||
/* 3. удалить super_peers этой группы */
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include "../routing_layer/etcp_router.h"
|
||||
#include "../routing_layer/conn_mgr.h"
|
||||
#include "../routing_layer/topo_group.h"
|
||||
#include "../routing_layer/topo_node_sqlite.h"
|
||||
#include "../transport_layer/etcp_api.h"
|
||||
#include "../transport_layer/secure_channel.h"
|
||||
#include "../lib/debug_config.h"
|
||||
@@ -24,6 +25,7 @@
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/rand.h>
|
||||
|
||||
#define MDL_ID "media_download"
|
||||
|
||||
@@ -55,11 +57,14 @@ static int md_dl_block_inflight(const struct media_download_block* block) {
|
||||
}
|
||||
|
||||
static int md_dl_reset_block_file(struct media_download* dl, int bi) {
|
||||
char tmp[2048];
|
||||
snprintf(tmp, sizeof(tmp), "%s.chunk_%d", dl->dest_path, bi);
|
||||
FILE* f = fopen(tmp, "wb");
|
||||
if (f && !fclose(f)) return 0;
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_MEDIA, "%s: cannot reset block file %s: %s", MDL_ID, tmp, strerror(errno)); return -1;
|
||||
struct media_download_block* b = &dl->blocks[bi];
|
||||
if (b->source) { md_block_abort(b->source); md_block_release(b->source); b->source = NULL; }
|
||||
if (RAND_bytes(b->transfer_id, sizeof(b->transfer_id)) != 1) {
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_MEDIA, "%s: transfer UUID generation failed block=%d", MDL_ID, bi); return -1;
|
||||
}
|
||||
b->source = md_block_create(&dl->inst->md, dl->group_id, dl->media_id, b->block_id,
|
||||
(uint32_t)bi, b->expected_size, dl->dest_path);
|
||||
return b->source ? 0 : -1;
|
||||
}
|
||||
|
||||
static struct media_download_peer* md_dl_get_peer(struct media_download* dl, uint64_t node_id) {
|
||||
@@ -130,11 +135,10 @@ static int md_dl_send_block_req(struct UTUN_INSTANCE* inst, uint64_t dst, struct
|
||||
struct media_pkt_block_req req;
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.subcmd = MEDIA_SUBCMD_BLOCK_REQ;
|
||||
req.group_id = dl->group_id;
|
||||
memcpy(req.media_id, dl->media_id, 16);
|
||||
memcpy(req.block_id, dl->blocks[bi].block_id, 16);
|
||||
memcpy(req.transfer_id, dl->blocks[bi].transfer_id, 16);
|
||||
req.chunk = (uint32_t)bi;
|
||||
req.offset = 0;
|
||||
|
||||
DEBUG_INFO(DEBUG_CATEGORY_MEDIA, "%s: BLOCK_REQ to 0x%016llx blk=%d/%d block_id=%02x%02x%02x%02x...",
|
||||
MDL_ID, (unsigned long long)dst, bi, dl->num_blocks,
|
||||
|
||||
Reference in new issue
Block a user