From 5b99bb951abbde1b90e5e177645d7b376ac4d83b Mon Sep 17 00:00:00 2001 From: eeff <33566201+eeff@users.noreply.github.com> Date: Fri, 19 May 2023 15:05:06 +0800 Subject: [PATCH 1/2] refactor: adapter start/stop timer into function --- src/adapter/adapter.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c index a8ddef4b..c816df3e 100644 --- a/src/adapter/adapter.c +++ b/src/adapter/adapter.c @@ -89,18 +89,31 @@ static const adapter_callbacks_t callback_funs = { REGISTER_METRIC(adapter, NEU_METRIC_SEND_MSG_ERRORS_TOTAL, 0); \ REGISTER_METRIC(adapter, NEU_METRIC_RECV_MSGS_TOTAL, 0); -neu_adapter_t *neu_adapter_create(neu_adapter_info_t *info) +static inline void start_log_level_timer(neu_adapter_t *adapter) { - int rv = 0; - neu_adapter_t * adapter = NULL; - neu_event_io_param_t param = { 0 }; neu_event_timer_param_t timer_level = { .second = 30, .millisecond = 0, .cb = level_check, + .usr_data = adapter, .type = NEU_EVENT_TIMER_BLOCK, }; + adapter->timer_lev = neu_event_add_timer(adapter->events, timer_level); +} + +static inline void stop_log_level_timer(neu_adapter_t *adapter) +{ + neu_event_del_timer(adapter->events, adapter->timer_lev); + adapter->timer_lev = NULL; +} + +neu_adapter_t *neu_adapter_create(neu_adapter_info_t *info) +{ + int rv = 0; + neu_adapter_t * adapter = NULL; + neu_event_io_param_t param = { 0 }; + switch (info->module->type) { case NEU_NA_TYPE_DRIVER: adapter = (neu_adapter_t *) neu_adapter_driver_create(); @@ -178,8 +191,7 @@ neu_adapter_t *neu_adapter_create(neu_adapter_info_t *info) rv = nng_dial(adapter->sock, neu_manager_get_url(), &adapter->dialer, 0); assert(rv == 0); - timer_level.usr_data = (void *) adapter; - adapter->timer_lev = neu_event_add_timer(adapter->events, timer_level); + start_log_level_timer(adapter); nlog_info("Success to create adapter: %s", adapter->name); @@ -823,7 +835,7 @@ int neu_adapter_uninit(neu_adapter_t *adapter) neu_adapter_driver_destroy((neu_adapter_driver_t *) adapter); } - neu_event_del_timer(adapter->events, adapter->timer_lev); + stop_log_level_timer(adapter); nlog_info("Stop the adapter(%s)", adapter->name); return 0; From 0f571748198e983c4cf4631b3e996dd6bfe91ea6 Mon Sep 17 00:00:00 2001 From: eeff <33566201+eeff@users.noreply.github.com> Date: Fri, 19 May 2023 15:09:30 +0800 Subject: [PATCH 2/2] feat: add function neu_adapter_rename --- src/adapter/adapter.c | 48 ++++++++++++++++++++++++++++ src/adapter/adapter_internal.h | 2 ++ src/adapter/driver/driver.c | 36 +++++++++++++++++++++ src/adapter/driver/driver_internal.h | 3 ++ src/base/metrics.c | 5 --- 5 files changed, 89 insertions(+), 5 deletions(-) diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c index c816df3e..0f0fc9b6 100644 --- a/src/adapter/adapter.c +++ b/src/adapter/adapter.c @@ -199,6 +199,49 @@ neu_adapter_t *neu_adapter_create(neu_adapter_info_t *info) return adapter; } +int neu_adapter_rename(neu_adapter_t *adapter, const char *new_name) +{ + char *name = strdup(new_name); + if (NULL == name) { + return NEU_ERR_EINTERNAL; + } + + zlog_category_t *log = zlog_get_category(name); + if (NULL == log) { + free(name); + return NEU_ERR_EINTERNAL; + } + + stop_log_level_timer(adapter); + if (NEU_NA_TYPE_DRIVER == adapter->module->type) { + neu_adapter_driver_stop_group_timer((neu_adapter_driver_t *) adapter); + } + + // fix metrics + if (adapter->metrics) { + neu_metrics_del_node(adapter); + } + free(adapter->name); + adapter->name = name; + adapter->metrics->name = name; + if (adapter->metrics) { + neu_metrics_add_node(adapter); + } + + // fix log + neu_plugin_common_t *common = neu_plugin_to_plugin_common(adapter->plugin); + common->log = log; + strcpy(common->name, adapter->name); + zlog_level_switch(common->log, default_log_level); + + start_log_level_timer(adapter); + if (NEU_NA_TYPE_DRIVER == adapter->module->type) { + neu_adapter_driver_start_group_timer((neu_adapter_driver_t *) adapter); + } + + return 0; +} + void neu_adapter_init(neu_adapter_t *adapter, bool auto_start) { neu_reqresp_head_t header = { .type = NEU_REQ_NODE_INIT }; @@ -808,6 +851,11 @@ void neu_adapter_destroy(neu_adapter_t *adapter) if (NULL != adapter->metrics) { neu_metrics_del_node(adapter); + neu_metric_entry_t *e = NULL; + HASH_LOOP(hh, adapter->metrics->entries, e) + { + neu_metrics_unregister_entry(e->name); + } neu_node_metrics_free(adapter->metrics); } diff --git a/src/adapter/adapter_internal.h b/src/adapter/adapter_internal.h index 27c9418b..e53da836 100644 --- a/src/adapter/adapter_internal.h +++ b/src/adapter/adapter_internal.h @@ -66,6 +66,8 @@ typedef struct adapter_msg_handler { neu_adapter_t *neu_adapter_create(neu_adapter_info_t *info); void neu_adapter_init(neu_adapter_t *adapter, bool auto_start); +int neu_adapter_rename(neu_adapter_t *adapter, const char *new_name); + int neu_adapter_start(neu_adapter_t *adapter); int neu_adapter_start_single(neu_adapter_t *adapter); int neu_adapter_stop(neu_adapter_t *adapter); diff --git a/src/adapter/driver/driver.c b/src/adapter/driver/driver.c index 2a6849f3..98dc7386 100644 --- a/src/adapter/driver/driver.c +++ b/src/adapter/driver/driver.c @@ -190,6 +190,42 @@ int neu_adapter_driver_uninit(neu_adapter_driver_t *driver) return 0; } +void neu_adapter_driver_start_group_timer(neu_adapter_driver_t *driver) +{ + group_t *el = NULL, *tmp = NULL; + + HASH_ITER(hh, driver->groups, el, tmp) + { + uint32_t interval = neu_group_get_interval(el->group); + neu_event_timer_param_t param = { + .second = interval / 1000, + .millisecond = interval % 1000, + .usr_data = el, + .type = NEU_EVENT_TIMER_NOBLOCK, + }; + + param.cb = report_callback; + el->report = neu_adapter_add_timer((neu_adapter_t *) driver, param); + + param.type = driver->adapter.module->timer_type; + param.cb = read_callback; + el->read = neu_event_add_timer(driver->driver_events, param); + } +} + +void neu_adapter_driver_stop_group_timer(neu_adapter_driver_t *driver) +{ + group_t *el = NULL, *tmp = NULL; + + HASH_ITER(hh, driver->groups, el, tmp) + { + neu_adapter_del_timer((neu_adapter_t *) driver, el->report); + el->report = NULL; + neu_event_del_timer(driver->driver_events, el->read); + el->read = NULL; + } +} + void neu_adapter_driver_read_group(neu_adapter_driver_t *driver, neu_reqresp_head_t * req) { diff --git a/src/adapter/driver/driver_internal.h b/src/adapter/driver/driver_internal.h index 04afedcc..e0e584d0 100644 --- a/src/adapter/driver/driver_internal.h +++ b/src/adapter/driver/driver_internal.h @@ -30,6 +30,9 @@ int neu_adapter_driver_stop(neu_adapter_driver_t *driver); int neu_adapter_driver_init(neu_adapter_driver_t *driver); int neu_adapter_driver_uninit(neu_adapter_driver_t *driver); +void neu_adapter_driver_start_group_timer(neu_adapter_driver_t *driver); +void neu_adapter_driver_stop_group_timer(neu_adapter_driver_t *driver); + void neu_adapter_driver_read_group(neu_adapter_driver_t *driver, neu_reqresp_head_t * req); diff --git a/src/base/metrics.c b/src/base/metrics.c index 5c85dd7e..5d11a31a 100644 --- a/src/base/metrics.c +++ b/src/base/metrics.c @@ -244,11 +244,6 @@ void neu_metrics_del_node(const neu_adapter_t *adapter) { pthread_rwlock_wrlock(&g_metrics_mtx_); HASH_DEL(g_metrics_.node_metrics, adapter->metrics); - neu_metric_entry_t *e = NULL; - HASH_LOOP(hh, adapter->metrics->entries, e) - { - metrics_unregister_entry(e->name); - } pthread_rwlock_unlock(&g_metrics_mtx_); }