From bb50acdcb8073654ea667b8c0272e335bd43f844 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Thu, 14 Apr 2022 20:12:14 +0200 Subject: Merging upstream version 1.34.0. Signed-off-by: Daniel Baumann --- database/rrdset.c | 140 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 99 insertions(+), 41 deletions(-) (limited to 'database/rrdset.c') diff --git a/database/rrdset.c b/database/rrdset.c index 19af449d8..f8e471be7 100644 --- a/database/rrdset.c +++ b/database/rrdset.c @@ -144,25 +144,38 @@ int rrdset_set_name(RRDSET *st, const char *name) { debug(D_RRD_CALLS, "rrdset_set_name() old: '%s', new: '%s'", st->name?st->name:"", name); - char b[CONFIG_MAX_VALUE + 1]; - char n[RRD_ID_LENGTH_MAX + 1]; + char full_name[RRD_ID_LENGTH_MAX + 1]; + char sanitized_name[CONFIG_MAX_VALUE + 1]; + char new_name[CONFIG_MAX_VALUE + 1]; - snprintfz(n, RRD_ID_LENGTH_MAX, "%s.%s", st->type, name); - rrdset_strncpyz_name(b, n, CONFIG_MAX_VALUE); + snprintfz(full_name, RRD_ID_LENGTH_MAX, "%s.%s", st->type, name); + rrdset_strncpyz_name(sanitized_name, full_name, CONFIG_MAX_VALUE); + strncpyz(new_name, sanitized_name, CONFIG_MAX_VALUE); - if(rrdset_index_find_name(host, b, 0)) { - info("RRDSET: chart name '%s' on host '%s' already exists.", b, host->hostname); - return 0; + if(rrdset_index_find_name(host, new_name, 0)) { + debug(D_RRD_CALLS, "RRDSET: chart name '%s' on host '%s' already exists.", new_name, host->hostname); + if(!strcmp(st->id, full_name) && !st->name) { + unsigned i = 1; + + do { + snprintfz(new_name, CONFIG_MAX_VALUE, "%s_%u", sanitized_name, i); + i++; + } while (rrdset_index_find_name(host, new_name, 0)); + + info("RRDSET: using name '%s' for chart '%s' on host '%s'.", new_name, full_name, host->hostname); + } else { + return 0; + } } if(st->name) { rrdset_index_del_name(host, st); - st->name = config_set_default(st->config_section, "name", b); + st->name = strdupz(new_name); st->hash_name = simple_hash(st->name); rrdsetvar_rename_all(st); } else { - st->name = config_get(st->config_section, "name", b); + st->name = strdupz(new_name); st->hash_name = simple_hash(st->name); } @@ -177,8 +190,6 @@ int rrdset_set_name(RRDSET *st, const char *name) { rrdset_flag_clear(st, RRDSET_FLAG_EXPORTING_SEND); rrdset_flag_clear(st, RRDSET_FLAG_EXPORTING_IGNORE); - rrdset_flag_clear(st, RRDSET_FLAG_BACKEND_SEND); - rrdset_flag_clear(st, RRDSET_FLAG_BACKEND_IGNORE); rrdset_flag_clear(st, RRDSET_FLAG_UPSTREAM_SEND); rrdset_flag_clear(st, RRDSET_FLAG_UPSTREAM_IGNORE); rrdset_flag_clear(st, RRDSET_FLAG_UPSTREAM_EXPOSED); @@ -384,6 +395,13 @@ void rrdset_free(RRDSET *st) { netdata_rwlock_destroy(&st->state->labels.labels_rwlock); // free directly allocated members + freez((void *)st->name); + freez(st->type); + freez(st->family); + freez(st->title); + freez(st->units); + freez(st->context); + freez(st->cache_dir); freez(st->config_section); freez(st->plugin_name); freez(st->module_name); @@ -617,10 +635,8 @@ RRDSET *rrdset_create_custom( mark_rebuild |= META_CHART_UPDATED; } - RRDSET_TYPE new_chart_type = - rrdset_type_id(config_get(st->config_section, "chart type", rrdset_type_name(chart_type))); - if (st->chart_type != new_chart_type) { - st->chart_type = new_chart_type; + if (st->chart_type != chart_type) { + st->chart_type = chart_type; mark_rebuild |= META_CHART_UPDATED; } @@ -709,19 +725,11 @@ RRDSET *rrdset_create_custom( // get the options from the config, we need to create it long entries; - if(memory_mode == RRD_MEMORY_MODE_DBENGINE) { - // only sets it the first time - entries = config_get_number(config_section, "history", 5); - } else { - long rentries = config_get_number(config_section, "history", history_entries); - entries = align_entries_to_pagesize(memory_mode, rentries); - if (entries != rentries) entries = config_set_number(config_section, "history", entries); - - if (memory_mode == RRD_MEMORY_MODE_NONE && entries != rentries) - entries = config_set_number(config_section, "history", 10); - } int enabled = config_get_boolean(config_section, "enabled", 1); - if(!enabled) entries = 5; + if(!enabled || memory_mode == RRD_MEMORY_MODE_DBENGINE) + entries = 5; + else + entries = align_entries_to_pagesize(memory_mode, history_entries); unsigned long size = sizeof(RRDSET); char *cache_dir = rrdset_cache_dir(host, fullid, config_section); @@ -840,22 +848,25 @@ RRDSET *rrdset_create_custom( st->cache_dir = cache_dir; - st->chart_type = rrdset_type_id(config_get(st->config_section, "chart type", rrdset_type_name(chart_type))); - st->type = config_get(st->config_section, "type", type); + st->chart_type = chart_type; + st->type = strdupz(type); st->state = callocz(1, sizeof(*st->state)); - st->family = config_get(st->config_section, "family", family?family:st->type); + + st->family = family ? strdupz(family) : strdupz(st->type); json_fix_string(st->family); - st->units = config_get(st->config_section, "units", units?units:""); + st->state->is_ar_chart = strcmp(st->id, ML_ANOMALY_RATES_CHART_ID) == 0; + + st->units = units ? strdupz(units) : strdupz(""); json_fix_string(st->units); - st->context = config_get(st->config_section, "context", context?context:st->id); + st->context = context ? strdupz(context) : strdupz(st->id); st->state->old_context = strdupz(st->context); json_fix_string(st->context); st->hash_context = simple_hash(st->context); - st->priority = config_get_number(st->config_section, "priority", priority); + st->priority = priority; if(enabled) rrdset_flag_set(st, RRDSET_FLAG_ENABLED); else @@ -866,8 +877,6 @@ RRDSET *rrdset_create_custom( rrdset_flag_clear(st, RRDSET_FLAG_OBSOLETE); rrdset_flag_clear(st, RRDSET_FLAG_EXPORTING_SEND); rrdset_flag_clear(st, RRDSET_FLAG_EXPORTING_IGNORE); - rrdset_flag_clear(st, RRDSET_FLAG_BACKEND_SEND); - rrdset_flag_clear(st, RRDSET_FLAG_BACKEND_IGNORE); rrdset_flag_clear(st, RRDSET_FLAG_UPSTREAM_SEND); rrdset_flag_clear(st, RRDSET_FLAG_UPSTREAM_IGNORE); rrdset_flag_clear(st, RRDSET_FLAG_UPSTREAM_EXPOSED); @@ -905,7 +914,7 @@ RRDSET *rrdset_create_custom( // could not use the name, use the id rrdset_set_name(st, id); - st->title = config_get(st->config_section, "title", title); + st->title = strdupz(title); st->state->old_title = strdupz(st->title); json_fix_string(st->title); @@ -1392,9 +1401,9 @@ void rrdset_done(RRDSET *st) { rrdset_rdlock(st); #ifdef ENABLE_ACLK - if (unlikely(!rrdset_flag_check(st, RRDSET_FLAG_ACLK))) { - if (st->counter_done >= RRDSET_MINIMUM_LIVE_COUNT && st->dimensions) { - if (likely(!queue_chart_to_aclk(st))) + if (likely(!st->state->is_ar_chart)) { + if (unlikely(!rrdset_flag_check(st, RRDSET_FLAG_ACLK))) { + if (likely(st->dimensions && st->counter_done && !queue_chart_to_aclk(st))) rrdset_flag_set(st, RRDSET_FLAG_ACLK); } } @@ -1475,7 +1484,14 @@ void rrdset_done(RRDSET *st) { // check if we will re-write the entire page if(unlikely(st->rrd_memory_mode == RRD_MEMORY_MODE_DBENGINE && dt_usec(&st->last_collected_time, &st->last_updated) > (RRDENG_BLOCK_SIZE / sizeof(storage_number)) * update_every_ut)) { - info("%s: too old data (last updated at %ld.%ld, last collected at %ld.%ld). Resetting it. Will not store the next entry.", st->name, st->last_updated.tv_sec, st->last_updated.tv_usec, st->last_collected_time.tv_sec, st->last_collected_time.tv_usec); + info( + "%s: too old data (last updated at %" PRId64 ".%" PRId64 ", last collected at %" PRId64 ".%" PRId64 "). " + "Resetting it. Will not store the next entry.", + st->name, + (int64_t)st->last_updated.tv_sec, + (int64_t)st->last_updated.tv_usec, + (int64_t)st->last_collected_time.tv_sec, + (int64_t)st->last_collected_time.tv_usec); rrdset_reset(st); rrdset_init_last_updated_time(st); @@ -1815,8 +1831,10 @@ after_second_database_work: continue; #if defined(ENABLE_ACLK) && defined(ENABLE_NEW_CLOUD_PROTOCOL) + if (likely(!st->state->is_ar_chart)) { if (!rrddim_flag_check(rd, RRDDIM_FLAG_HIDDEN)) { - int live = ((mark - rd->last_collected_time.tv_sec) < (RRDSET_MINIMUM_LIVE_COUNT * rd->update_every)); + int live = + ((mark - rd->last_collected_time.tv_sec) < RRDSET_MINIMUM_DIM_LIVE_MULTIPLIER * rd->update_every); if (unlikely(live != rd->state->aclk_live_status)) { if (likely(rrdset_flag_check(st, RRDSET_FLAG_ACLK))) { if (likely(!queue_dimension_to_aclk(rd))) { @@ -1826,6 +1844,7 @@ after_second_database_work: } } } + } #endif if(unlikely(!rd->updated)) continue; @@ -1926,6 +1945,9 @@ after_second_database_work: delete_dimension_uuid(&rd->state->metric_uuid); } else { /* Do not delete this dimension */ +#if defined(ENABLE_ACLK) && defined(ENABLE_NEW_CLOUD_PROTOCOL) + aclk_send_dimension_update(rd); +#endif last = rd; rd = rd->next; continue; @@ -2021,3 +2043,39 @@ struct label *rrdset_lookup_label_key(RRDSET *st, char *key, uint32_t key_hash) } return ret; } + +static inline int k8s_space(char c) { + switch(c) { + case ':': + case ',': + return 1; + default: + return 0; + } +} + +int rrdset_matches_label_keys(RRDSET *st, char *keylist, char *words[], uint32_t *hash_key_list, int *word_count, int size) +{ + struct label_index *labels = &st->state->labels; + + if (!labels->head) + return 0; + + struct label *one_label; + + if (!*word_count) { + *word_count = quoted_strings_splitter(keylist, words, size, k8s_space, NULL, NULL, 0); + for (int i = 0; i < *word_count - 1; i += 2) { + hash_key_list[i] = simple_hash(words[i]); + } + } + + int ret = 1; + netdata_rwlock_rdlock(&labels->labels_rwlock); + for (int i = 0; ret && i < *word_count - 1; i += 2) { + one_label = label_list_lookup_key(labels->head, words[i], hash_key_list[i]); + ret = (one_label && !strcmp(one_label->value, words[i + 1])); + } + netdata_rwlock_unlock(&labels->labels_rwlock); + return ret; +} -- cgit v1.2.3