From 3f4030608cbe3a029babb9584020cd9ac0cffaab Mon Sep 17 00:00:00 2001 From: fengzero Date: Wed, 12 Oct 2022 06:58:30 +0000 Subject: [PATCH] fix: delete the related subscription group when deleting a app node --- src/core/manager.c | 4 ++++ src/core/subscribe.c | 17 +++++++++++++++++ src/core/subscribe.h | 1 + 3 files changed, 22 insertions(+) diff --git a/src/core/manager.c b/src/core/manager.c index 3f28d0f5..bea77924 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -312,6 +312,10 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data) } manager_storage_del_node(manager, cmd->node); + if (neu_adapter_get_type(adapter) == NEU_NA_TYPE_APP) { + neu_subscribe_manager_unsub_all(manager->subscribe_manager, + cmd->node); + } header->type = NEU_REQ_NODE_UNINIT; forward_msg(manager, msg, header->receiver); if (neu_adapter_get_type(adapter) == NEU_NA_TYPE_DRIVER) { diff --git a/src/core/subscribe.c b/src/core/subscribe.c index 3fcbbe95..5c79a29c 100644 --- a/src/core/subscribe.c +++ b/src/core/subscribe.c @@ -127,6 +127,23 @@ UT_array *neu_subscribe_manager_get(neu_subscribe_mgr_t *mgr, const char *app) return groups; } +void neu_subscribe_manager_unsub_all(neu_subscribe_mgr_t *mgr, const char *app) +{ + sub_elem_t *el = NULL, *tmp = NULL; + + HASH_ITER(hh, mgr->ss, el, tmp) + { + utarray_foreach(el->apps, neu_app_subscribe_t *, sub_app) + { + if (strcmp(sub_app->app_name, app) == 0) { + neu_subscribe_manager_unsub(mgr, el->key.driver, app, + el->key.group); + break; + } + } + } +} + int neu_subscribe_manager_sub(neu_subscribe_mgr_t *mgr, const char *driver, const char *app, const char *group, nng_pipe pipe) { diff --git a/src/core/subscribe.h b/src/core/subscribe.h index 04906ed1..cdf33c4c 100644 --- a/src/core/subscribe.h +++ b/src/core/subscribe.h @@ -41,6 +41,7 @@ UT_array *neu_subscribe_manager_find(neu_subscribe_mgr_t *mgr, UT_array *neu_subscribe_manager_find_by_driver(neu_subscribe_mgr_t *mgr, const char * driver); UT_array *neu_subscribe_manager_get(neu_subscribe_mgr_t *mgr, const char *app); +void neu_subscribe_manager_unsub_all(neu_subscribe_mgr_t *mgr, const char *app); int neu_subscribe_manager_sub(neu_subscribe_mgr_t *mgr, const char *driver, const char *app, const char *group, nng_pipe pipe);