Revoke CHAT service work when its group starts teardown
This commit is contained in:
1 parent
47082e966c
commit
faca1266dd
2 files changed
+21
-1
No files matched your search
@@ -441,7 +441,7 @@ int topo_group_data_allowed(struct TOPO_GROUP* group, struct ETCP_CONN* conn) {
|
||||
}
|
||||
|
||||
void topo_group_revalidate_members(struct TOPO_GROUP* group) {
|
||||
if (!group || group->group_type != TOPO_GROUP_TYPE_CHAT || group->stopping) return;
|
||||
if (!group || group->group_type != TOPO_GROUP_TYPE_CHAT) return;
|
||||
etcp_router_revalidate_group(group->instance, group->group_id);
|
||||
conn_mgr_revalidate_members(group->conn_mgr);
|
||||
radio_revalidate_members(group);
|
||||
@@ -450,6 +450,7 @@ void topo_group_revalidate_members(struct TOPO_GROUP* group) {
|
||||
group_avatar_revalidate_members(group->instance, group->group_id);
|
||||
chat_join_revalidate_members(group->instance, group->group_id);
|
||||
chat_sync_revalidate_join(group->instance, group->group_id);
|
||||
if (group->stopping) return;
|
||||
/* Удаление вызывает callbacks и меняет список; каждый раз ищем следующего заново. */
|
||||
for (;;) {
|
||||
struct TOPO_GROUP_CONN_ITEM* invalid = NULL;
|
||||
@@ -680,6 +681,8 @@ fail:
|
||||
static void topo_group_destroy(struct TOPO_GROUP* group) {
|
||||
if (!group) return;
|
||||
group->stopping = 1;
|
||||
/* Отменить и локальные ожидания без router-сессии до освобождения ресурсов группы. */
|
||||
topo_group_revalidate_members(group);
|
||||
multicast_close_group(group->instance, group->group_id);
|
||||
nat_detection_cancel_group(group->instance->nat_det, group->group_id);
|
||||
stream_cancel_group(group->instance, group->group_id);
|
||||
|
||||
@@ -492,6 +492,22 @@ static int join_isolation(void) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int stop_isolation(void) {
|
||||
struct UTUN_INSTANCE* server = fixture.nodes[0];
|
||||
REQUIRE(!chat_join_init(server) && !chat_join_store_local_key(server, 112, 9000));
|
||||
int status = 99;
|
||||
REQUIRE(chat_join_register_key(server, 112, 0, 9001, join_registered, &status));
|
||||
REQUIRE(status == 99);
|
||||
topo_groups_remove_group(server->topo_groups, 112);
|
||||
fixture.groups[0][1] = NULL;
|
||||
check("group removal cancels local JOIN before its timer", status == CHAT_JOIN_CANCELLED &&
|
||||
!server->join_keys && !server->join_registrations && !topo_groups_find(server->topo_groups, 112));
|
||||
unsigned before = fixture.broadcast[0];
|
||||
REQUIRE(!send_broadcast(0, 9002));
|
||||
check("removing B preserves A and shared transport", fixture.broadcast[0] == before + 1 && fixture.transport->links_up);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
debug_config_init(); debug_set_level(DEBUG_LEVEL_WARN);
|
||||
debug_set_category_level(DEBUG_CATEGORY_DEBUG, DEBUG_LEVEL_INFO);
|
||||
@@ -517,6 +533,7 @@ int main(void) {
|
||||
#ifdef __linux__
|
||||
if (!fixture.failed && file_isolation(1)) fixture.failed++;
|
||||
#endif
|
||||
if (!fixture.failed && stop_isolation()) fixture.failed++;
|
||||
}
|
||||
}
|
||||
pthread_mutex_lock(&fixture.disk_mutex); fixture.disk_released = 1; pthread_cond_signal(&fixture.disk_condition);
|
||||
|
||||
Reference in new issue
Block a user