From 0ac0e0aa8696893551817be67add0a5efbc0ddfc Mon Sep 17 00:00:00 2001 From: eeff <33566201+eeff@users.noreply.github.com> Date: Thu, 25 Apr 2024 16:36:24 +0800 Subject: [PATCH] fix: start/stop group timer when driver started/stopped --- src/adapter/adapter.c | 17 ++-- src/adapter/adapter_internal.h | 7 ++ src/adapter/driver/driver.c | 158 +++++++++++++++------------------ 3 files changed, 89 insertions(+), 93 deletions(-) diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c index f5531c69..df067bf3 100644 --- a/src/adapter/adapter.c +++ b/src/adapter/adapter.c @@ -426,13 +426,6 @@ static int adapter_update_metric(neu_adapter_t *adapter, return neu_node_metrics_update(adapter->metrics, group, metric_name, n); } -static inline void adapter_reset_metrics(neu_adapter_t *adapter) -{ - if (NULL != adapter->metrics) { - neu_node_metrics_reset(adapter->metrics); - } -} - static int adapter_command(neu_adapter_t *adapter, neu_reqresp_head_t header, void *data) { @@ -1389,6 +1382,10 @@ int neu_adapter_start(neu_adapter_t *adapter) if (error == NEU_ERR_SUCCESS) { adapter->state = NEU_NODE_RUNNING_STATE_RUNNING; adapter_storage_state(adapter->name, adapter->state); + if (NEU_NA_TYPE_DRIVER == neu_adapter_get_type(adapter)) { + neu_adapter_driver_start_group_timer( + (neu_adapter_driver_t *) adapter); + } } return error; @@ -1427,7 +1424,11 @@ int neu_adapter_stop(neu_adapter_t *adapter) if (error == NEU_ERR_SUCCESS) { adapter->state = NEU_NODE_RUNNING_STATE_STOPPED; adapter_storage_state(adapter->name, adapter->state); - adapter_reset_metrics(adapter); + if (NEU_NA_TYPE_DRIVER == neu_adapter_get_type(adapter)) { + neu_adapter_driver_stop_group_timer( + (neu_adapter_driver_t *) adapter); + } + neu_adapter_reset_metrics(adapter); } return error; diff --git a/src/adapter/adapter_internal.h b/src/adapter/adapter_internal.h index 156f4349..7afa19c8 100644 --- a/src/adapter/adapter_internal.h +++ b/src/adapter/adapter_internal.h @@ -96,6 +96,13 @@ int neu_adapter_set_setting(neu_adapter_t *adapter, const char *config); int neu_adapter_get_setting(neu_adapter_t *adapter, char **config); neu_node_state_t neu_adapter_get_state(neu_adapter_t *adapter); +static inline void neu_adapter_reset_metrics(neu_adapter_t *adapter) +{ + if (NULL != adapter->metrics) { + neu_node_metrics_reset(adapter->metrics); + } +} + int neu_adapter_register_group_metric(neu_adapter_t *adapter, const char *group_name, const char *name, const char *help, neu_metric_type_e type, diff --git a/src/adapter/driver/driver.c b/src/adapter/driver/driver.c index 38e48fc3..eca00593 100644 --- a/src/adapter/driver/driver.c +++ b/src/adapter/driver/driver.c @@ -102,8 +102,11 @@ static void update_with_meta(neu_adapter_t *adapter, const char *group, const char *tag, neu_dvalue_t value, neu_tag_meta_t *metas, int n_meta); static void write_response(neu_adapter_t *adapter, void *r, neu_error error); -static group_t *find_group(neu_adapter_driver_t *driver, const char *name); -static void store_write_tag(group_t *group, to_be_write_tag_t *tag); +static group_t * find_group(neu_adapter_driver_t *driver, const char *name); +static void store_write_tag(group_t *group, to_be_write_tag_t *tag); +static inline void start_group_timer(neu_adapter_driver_t *driver, + group_t * grp); +static inline void stop_group_timer(neu_adapter_driver_t *driver, group_t *grp); static void write_response(neu_adapter_t *adapter, void *r, neu_error error) { @@ -324,9 +327,7 @@ int neu_adapter_driver_uninit(neu_adapter_driver_t *driver) HASH_DEL(driver->groups, el); neu_adapter_driver_try_del_tag(driver, neu_group_tag_size(el->group)); - neu_adapter_del_timer((neu_adapter_t *) driver, el->report); - neu_event_del_timer(driver->driver_events, el->read); - neu_event_del_timer(driver->driver_events, el->write); + stop_group_timer(driver, el); if (el->grp.group_free != NULL) { el->grp.group_free(&el->grp); } @@ -349,34 +350,67 @@ int neu_adapter_driver_uninit(neu_adapter_driver_t *driver) return 0; } +static inline void start_group_timer(neu_adapter_driver_t *driver, group_t *grp) +{ + uint32_t interval = neu_group_get_interval(grp->group); + + neu_event_timer_param_t param = { + .second = interval / 1000, + .millisecond = interval % 1000, + .usr_data = (void *) grp, + .type = NEU_EVENT_TIMER_NOBLOCK, + }; + + param.type = driver->adapter.module->timer_type; + param.cb = read_callback; + grp->read = neu_event_add_timer(driver->driver_events, param); + + struct timespec t1 = { + .tv_sec = 0, + .tv_nsec = 1000 * 1000 * 20, + }; + struct timespec t2 = { 0 }; + nanosleep(&t1, &t2); + + param.type = NEU_EVENT_TIMER_NOBLOCK; + param.cb = report_callback; + grp->report = neu_adapter_add_timer((neu_adapter_t *) driver, param); + + param.second = 0; + param.millisecond = 3; + param.cb = write_callback; + grp->write = neu_event_add_timer(driver->driver_events, param); +} + 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, - }; + start_group_timer(driver, el); + neu_adapter_update_group_metric( + &driver->adapter, neu_group_get_name(el->group), + NEU_METRIC_GROUP_TAGS_TOTAL, neu_group_tag_size(el->group)); + } - param.type = driver->adapter.module->timer_type; - param.cb = read_callback; - el->read = neu_event_add_timer(driver->driver_events, param); + driver->adapter.cb_funs.update_metric( + &driver->adapter, NEU_METRIC_TAGS_TOTAL, driver->tag_cnt, NULL); +} - struct timespec t1 = { - .tv_sec = 0, - .tv_nsec = 1000 * 1000 * 20, - }; - struct timespec t2 = { 0 }; - nanosleep(&t1, &t2); - - param.type = NEU_EVENT_TIMER_NOBLOCK; - param.cb = report_callback; - el->report = neu_adapter_add_timer((neu_adapter_t *) driver, param); +static inline void stop_group_timer(neu_adapter_driver_t *driver, group_t *grp) +{ + if (grp->report) { + neu_adapter_del_timer((neu_adapter_t *) driver, grp->report); + grp->report = NULL; + } + if (grp->read) { + neu_event_del_timer(driver->driver_events, grp->read); + grp->read = NULL; + } + if (grp->write) { + neu_event_del_timer(driver->driver_events, grp->write); + grp->write = NULL; } } @@ -384,13 +418,7 @@ 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; - } + HASH_ITER(hh, driver->groups, el, tmp) { stop_group_timer(driver, el); } } void neu_adapter_driver_read_group(neu_adapter_driver_t *driver, @@ -919,13 +947,6 @@ int neu_adapter_driver_add_group(neu_adapter_driver_t *driver, const char *name, if (find == NULL) { find = calloc(1, sizeof(group_t)); - neu_event_timer_param_t param = { - .second = interval / 1000, - .millisecond = interval % 1000, - .usr_data = (void *) find, - .type = NEU_EVENT_TIMER_NOBLOCK, - }; - pthread_mutex_init(&find->wt_mtx, NULL); pthread_mutex_init(&find->apps_mtx, NULL); @@ -939,25 +960,9 @@ int neu_adapter_driver_add_group(neu_adapter_driver_t *driver, const char *name, neu_group_split_static_tags(find->group, &find->static_tags, &find->grp.tags); - param.type = driver->adapter.module->timer_type; - param.cb = read_callback; - find->read = neu_event_add_timer(driver->driver_events, param); - - struct timespec t1 = { - .tv_sec = 0, - .tv_nsec = 1000 * 1000 * 20, - }; - struct timespec t2 = { 0 }; - nanosleep(&t1, &t2); - - param.type = NEU_EVENT_TIMER_NOBLOCK; - param.cb = report_callback; - find->report = neu_adapter_add_timer((neu_adapter_t *) driver, param); - - param.second = 0; - param.millisecond = 3; - param.cb = write_callback; - find->write = neu_event_add_timer(driver->driver_events, param); + if (NEU_NODE_RUNNING_STATE_RUNNING == driver->adapter.state) { + start_group_timer(driver, find); + } REGISTER_GROUP_METRIC(&driver->adapter, find->name, NEU_METRIC_GROUP_TAGS_TOTAL, @@ -1004,8 +1009,9 @@ int neu_adapter_driver_update_group(neu_adapter_driver_t *driver, } // stop the timer first to avoid race condition - neu_adapter_del_timer((neu_adapter_t *) driver, find->report); - neu_event_del_timer(driver->driver_events, find->read); + if (NEU_NODE_RUNNING_STATE_RUNNING == driver->adapter.state) { + stop_group_timer(driver, find); + } // a diminutive value should keep the interval untouched if (interval < NEU_GROUP_INTERVAL_LIMIT) { @@ -1034,31 +1040,12 @@ int neu_adapter_driver_update_group(neu_adapter_driver_t *driver, } } - neu_event_timer_param_t param = { - .second = interval / 1000, - .millisecond = interval % 1000, - .usr_data = (void *) find, - .type = NEU_EVENT_TIMER_NOBLOCK, - }; - neu_group_set_interval(find->group, interval); // restore the timers - - param.type = driver->adapter.module->timer_type; - param.cb = read_callback; - find->read = neu_event_add_timer(driver->driver_events, param); - - struct timespec t1 = { - .tv_sec = 0, - .tv_nsec = 1000 * 1000 * 20, - }; - struct timespec t2 = { 0 }; - nanosleep(&t1, &t2); - - param.type = NEU_EVENT_TIMER_NOBLOCK; - param.cb = report_callback; - find->report = neu_adapter_add_timer((neu_adapter_t *) driver, param); + if (NEU_NODE_RUNNING_STATE_RUNNING == driver->adapter.state) { + start_group_timer(driver, find); + } return ret; } @@ -1074,9 +1061,10 @@ int neu_adapter_driver_del_group(neu_adapter_driver_t *driver, const char *name) neu_adapter_driver_try_del_tag(driver, neu_group_tag_size(find->group)); - neu_adapter_del_timer((neu_adapter_t *) driver, find->report); - neu_event_del_timer(driver->driver_events, find->read); - neu_event_del_timer(driver->driver_events, find->write); + if (NEU_NODE_RUNNING_STATE_RUNNING == driver->adapter.state) { + stop_group_timer(driver, find); + } + if (find->grp.group_free != NULL) { find->grp.group_free(&find->grp); }