diff --git a/src/dm/dm_media.c b/src/dm/dm_media.c index d8170da76..229da3b5a 100644 --- a/src/dm/dm_media.c +++ b/src/dm/dm_media.c @@ -859,6 +859,18 @@ static struct dm_file_probe* dm_probe_find(struct dm_media_state* media, const u return NULL; } +void dm_media_revalidate_members(struct UTUN_INSTANCE* inst, uint64_t group) { + struct dm_media_state* media = inst ? inst->dm_media : NULL; + if (!media || media->closing) return; + for (struct dm_file_probe* p = media->probes; p; p = p->next) for (unsigned i = 0; i < p->count; i++) { + struct dm_probe_source* s = p->sources + i; + if (s->used || s->group != group || topo_group_chat_allowed(inst, group, s->node)) continue; + s->used = 1; s->rtt = 0; + DEBUG_INFO(DEBUG_CATEGORY_DM, "DM sources: probe revoked conv=%s group=%llu peer=%llu token=%llu", p->conv, + (unsigned long long)group, (unsigned long long)s->node, (unsigned long long)p->token); + } +} + static void dm_probe_add(struct dm_media_state* media, struct dm_file_probe* p, uint64_t node, uint64_t preferred) { for (unsigned i = 0; i < p->count; i++) if (p->sources[i].node == node) return; uint64_t group = preferred; diff --git a/src/dm/dm_media.h b/src/dm/dm_media.h index 9fd296e1b..0541ffe02 100644 --- a/src/dm/dm_media.h +++ b/src/dm/dm_media.h @@ -64,6 +64,9 @@ void dm_media_quiesce(struct UTUN_INSTANCE* inst); /* После drain/destroy media_async, до групп/core/mailbox: освободить owner, сохранить durable данные. * При живых jobs/cleanup_active логирует ошибку и оставляет owner для повторного destroy. NULL допустим. */ void dm_media_destroy(struct UTUN_INSTANCE* inst); +/* После изменения допуска группы отменить её ожидающие HAVE-пробы; поздний ответ их не оживляет. + * Файлы/назначения остаются; следующий поиск выберет свежий маршрут. FILE_TRANSFER отменяется своим owner. */ +void dm_media_revalidate_members(struct UTUN_INSTANCE* inst, uint64_t group); /* Передать подготовку копии и enqueue file-сообщения в media_async. * Строки conv/path и info копируются при вызове; сам файл должен быть доступен worker до завершения. diff --git a/src/routing_layer/topo_group.c b/src/routing_layer/topo_group.c index 389154767..4fcdd3e98 100644 --- a/src/routing_layer/topo_group.c +++ b/src/routing_layer/topo_group.c @@ -39,6 +39,7 @@ #include "../chat/chat_attachment.h" #include "../member_files/member_files.h" #include "../media_delivery/file_transfer.h" +#include "../dm/dm_media.h" #define TOPO_GROUP_UTUN 0x8000000000000000ULL @@ -448,6 +449,7 @@ void topo_group_revalidate_members(struct TOPO_GROUP* group) { multicast_revalidate_members(group->instance, group->group_id); etcp_router_revalidate_group(group->instance, group->group_id); file_transfer_revalidate_members(group->instance->file_transfer, group->group_id); + dm_media_revalidate_members(group->instance, group->group_id); conn_mgr_revalidate_members(group->conn_mgr); radio_revalidate_members(group); radio_call_revalidate_members(group->instance, group->group_id);