From 00151562145df50cc65e9902d52d5fa77f89fe50 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Thu, 9 Jun 2022 06:52:47 +0200 Subject: Merging upstream version 1.35.0. Signed-off-by: Daniel Baumann --- collectors/plugins.d/pluginsd_parser.c | 99 +++++++++++++++++++--------------- 1 file changed, 57 insertions(+), 42 deletions(-) (limited to 'collectors/plugins.d/pluginsd_parser.c') diff --git a/collectors/plugins.d/pluginsd_parser.c b/collectors/plugins.d/pluginsd_parser.c index 22b77362f..f014a29d0 100644 --- a/collectors/plugins.d/pluginsd_parser.c +++ b/collectors/plugins.d/pluginsd_parser.c @@ -125,26 +125,36 @@ PARSER_RC pluginsd_dimension_action(void *user, RRDSET *st, char *id, char *name UNUSED(algorithm); RRDDIM *rd = rrddim_add(st, id, name, multiplier, divisor, algorithm_type); - rrddim_flag_clear(rd, RRDDIM_FLAG_HIDDEN); + int unhide_dimension = 1; + rrddim_flag_clear(rd, RRDDIM_FLAG_DONT_DETECT_RESETS_OR_OVERFLOWS); if (options && *options) { if (strstr(options, "obsolete") != NULL) rrddim_is_obsolete(st, rd); else rrddim_isnot_obsolete(st, rd); - if (strstr(options, "hidden") != NULL) { - rrddim_flag_set(rd, RRDDIM_FLAG_HIDDEN); - (void) sql_set_dimension_option(&rd->state->metric_uuid, "hidden"); - } - else - (void) sql_set_dimension_option(&rd->state->metric_uuid, NULL); + + unhide_dimension = !strstr(options, "hidden"); + if (strstr(options, "noreset") != NULL) rrddim_flag_set(rd, RRDDIM_FLAG_DONT_DETECT_RESETS_OR_OVERFLOWS); if (strstr(options, "nooverflow") != NULL) rrddim_flag_set(rd, RRDDIM_FLAG_DONT_DETECT_RESETS_OR_OVERFLOWS); - } else { - (void) sql_set_dimension_option(&rd->state->metric_uuid, NULL); + } else rrddim_isnot_obsolete(st, rd); + + if (likely(unhide_dimension)) { + rrddim_flag_clear(rd, RRDDIM_FLAG_HIDDEN); + if (rrddim_flag_check(rd, RRDDIM_FLAG_META_HIDDEN)) { + (void)sql_set_dimension_option(&rd->state->metric_uuid, NULL); + rrddim_flag_clear(rd, RRDDIM_FLAG_META_HIDDEN); + } + } else { + rrddim_flag_set(rd, RRDDIM_FLAG_HIDDEN); + if (!rrddim_flag_check(rd, RRDDIM_FLAG_META_HIDDEN)) { + (void)sql_set_dimension_option(&rd->state->metric_uuid, "hidden"); + rrddim_flag_set(rd, RRDDIM_FLAG_META_HIDDEN); + } } return PARSER_RC_OK; } @@ -725,6 +735,11 @@ PARSER_RC metalog_pluginsd_host(char **words, void *user, PLUGINSD_ACTION *plug return PARSER_RC_OK; } +static void pluginsd_process_thread_cleanup(void *ptr) { + PARSER *parser = (PARSER *)ptr; + parser_destroy(parser); +} + // New plugins.d parser inline size_t pluginsd_process(RRDHOST *host, struct plugind *cd, FILE *fp, int trust_durations) @@ -743,50 +758,50 @@ inline size_t pluginsd_process(RRDHOST *host, struct plugind *cd, FILE *fp, int } clearerr(fp); - PARSER_USER_OBJECT *user = callocz(1, sizeof(*user)); - ((PARSER_USER_OBJECT *) user)->enabled = cd->enabled; - ((PARSER_USER_OBJECT *) user)->host = host; - ((PARSER_USER_OBJECT *) user)->cd = cd; - ((PARSER_USER_OBJECT *) user)->trust_durations = trust_durations; - - PARSER *parser = parser_init(host, user, fp, PARSER_INPUT_SPLIT); - - if (unlikely(!parser)) { - error("Failed to initialize parser"); - cd->serial_failures++; - return 0; - } - - parser->plugins_action->begin_action = &pluginsd_begin_action; - parser->plugins_action->flush_action = &pluginsd_flush_action; - parser->plugins_action->end_action = &pluginsd_end_action; - parser->plugins_action->disable_action = &pluginsd_disable_action; - parser->plugins_action->variable_action = &pluginsd_variable_action; - parser->plugins_action->dimension_action = &pluginsd_dimension_action; - parser->plugins_action->label_action = &pluginsd_label_action; - parser->plugins_action->overwrite_action = &pluginsd_overwrite_action; - parser->plugins_action->chart_action = &pluginsd_chart_action; - parser->plugins_action->set_action = &pluginsd_set_action; - - user->parser = parser; + PARSER_USER_OBJECT user = { + .enabled = cd->enabled, + .host = host, + .cd = cd, + .trust_durations = trust_durations + }; + + PARSER *parser = parser_init(host, &user, fp, PARSER_INPUT_SPLIT); + + // this keeps the parser with its current value + // so, parser needs to be allocated before pushing it + netdata_thread_cleanup_push(pluginsd_process_thread_cleanup, parser); + + parser->plugins_action->begin_action = &pluginsd_begin_action; + parser->plugins_action->flush_action = &pluginsd_flush_action; + parser->plugins_action->end_action = &pluginsd_end_action; + parser->plugins_action->disable_action = &pluginsd_disable_action; + parser->plugins_action->variable_action = &pluginsd_variable_action; + parser->plugins_action->dimension_action = &pluginsd_dimension_action; + parser->plugins_action->label_action = &pluginsd_label_action; + parser->plugins_action->overwrite_action = &pluginsd_overwrite_action; + parser->plugins_action->chart_action = &pluginsd_chart_action; + parser->plugins_action->set_action = &pluginsd_set_action; + parser->plugins_action->clabel_commit_action = &pluginsd_clabel_commit_action; + parser->plugins_action->clabel_action = &pluginsd_clabel_action; + + user.parser = parser; while (likely(!parser_next(parser))) { if (unlikely(netdata_exit || parser_action(parser, NULL))) break; } - info("PARSER ended"); - - parser_destroy(parser); - cd->enabled = ((PARSER_USER_OBJECT *) user)->enabled; - size_t count = ((PARSER_USER_OBJECT *) user)->count; + // free parser with the pop function + netdata_thread_cleanup_pop(1); - freez(user); + cd->enabled = user.enabled; + size_t count = user.count; if (likely(count)) { cd->successful_collections += count; cd->serial_failures = 0; - } else + } + else cd->serial_failures++; return count; -- cgit v1.2.3