From d600ae20c0456e23277850ecd5ad4542e465b00b Mon Sep 17 00:00:00 2001 From: Stelios Fragkakis <52996999+stelfrag@users.noreply.github.com> Date: Mon, 14 Dec 2020 17:32:11 +0200 Subject: Fix issue with chart metadata sent multiple times over ACLK (#10381) * Add a flag RRDSET_FLAG_ACLK to mark that a chart needs to go to the cloud * Change calls to aclk_update_chart to set the RRDSET_FLAG_ACLK instead Make the call to aclk_update_chart only in rrdset_done (and in case the chart is deleted) * Fix compilation error when cloud is disabled * Skip netdata_cloud_setting check when setting the flag / calling aclk_update_chart (checked in there) --- database/rrd.h | 3 ++- database/rrddim.c | 22 ++++++++-------------- database/rrdset.c | 14 ++++++++++---- 3 files changed, 20 insertions(+), 19 deletions(-) (limited to 'database') diff --git a/database/rrd.h b/database/rrd.h index 6fafbf5710..62a2c7debe 100644 --- a/database/rrd.h +++ b/database/rrd.h @@ -450,7 +450,8 @@ typedef enum rrdset_flags { RRDSET_FLAG_OBSOLETE_DIMENSIONS = 1 << 14, // this is marked by the collector/module when a chart has obsolete dimensions // No new values have been collected for this chart since agent start or it was marked RRDSET_FLAG_OBSOLETE at // least rrdset_free_obsolete_time seconds ago. - RRDSET_FLAG_ARCHIVED = 1 << 15 + RRDSET_FLAG_ARCHIVED = 1 << 15, + RRDSET_FLAG_ACLK = 1 << 16 } RRDSET_FLAGS; #ifdef HAVE_C___ATOMIC diff --git a/database/rrddim.c b/database/rrddim.c index ac040ddf99..6a1408595c 100644 --- a/database/rrddim.c +++ b/database/rrddim.c @@ -210,8 +210,7 @@ void rrdcalc_link_to_rrddim(RRDDIM *rd, RRDSET *st, RRDHOST *host) { } } #ifdef ENABLE_ACLK - if (netdata_cloud_setting) - aclk_update_chart(st->rrdhost, st->id, ACLK_CMD_CHART); + rrdset_flag_set(st, RRDSET_FLAG_ACLK); #endif } @@ -459,8 +458,7 @@ RRDDIM *rrddim_add_custom(RRDSET *st, const char *id, const char *name, collecte rrdset_unlock(st); #ifdef ENABLE_ACLK - if (netdata_cloud_setting) - aclk_update_chart(host, st->id, ACLK_CMD_CHART); + rrdset_flag_set(st, RRDSET_FLAG_ACLK); #endif return(rd); } @@ -534,8 +532,8 @@ void rrddim_free_custom(RRDSET *st, RRDDIM *rd, int db_rotated) break; } #ifdef ENABLE_ACLK - if ((netdata_cloud_setting) && (db_rotated || RRD_MEMORY_MODE_DBENGINE != rrd_memory_mode)) - aclk_update_chart(st->rrdhost, st->id, ACLK_CMD_CHART); + if (db_rotated || RRD_MEMORY_MODE_DBENGINE != rrd_memory_mode) + rrdset_flag_set(st, RRDSET_FLAG_ACLK); #endif } @@ -556,8 +554,7 @@ int rrddim_hide(RRDSET *st, const char *id) { rrddim_flag_set(rd, RRDDIM_FLAG_HIDDEN); #ifdef ENABLE_ACLK - if (netdata_cloud_setting) - aclk_update_chart(st->rrdhost, st->id, ACLK_CMD_CHART); + rrdset_flag_set(st, RRDSET_FLAG_ACLK); #endif return 0; } @@ -574,8 +571,7 @@ int rrddim_unhide(RRDSET *st, const char *id) { rrddim_flag_clear(rd, RRDDIM_FLAG_HIDDEN); #ifdef ENABLE_ACLK - if (netdata_cloud_setting) - aclk_update_chart(st->rrdhost, st->id, ACLK_CMD_CHART); + rrdset_flag_set(st, RRDSET_FLAG_ACLK); #endif return 0; } @@ -590,8 +586,7 @@ inline void rrddim_is_obsolete(RRDSET *st, RRDDIM *rd) { rrddim_flag_set(rd, RRDDIM_FLAG_OBSOLETE); rrdset_flag_set(st, RRDSET_FLAG_OBSOLETE_DIMENSIONS); #ifdef ENABLE_ACLK - if (netdata_cloud_setting) - aclk_update_chart(st->rrdhost, st->id, ACLK_CMD_CHART); + rrdset_flag_set(st, RRDSET_FLAG_ACLK); #endif } @@ -600,8 +595,7 @@ inline void rrddim_isnot_obsolete(RRDSET *st __maybe_unused, RRDDIM *rd) { rrddim_flag_clear(rd, RRDDIM_FLAG_OBSOLETE); #ifdef ENABLE_ACLK - if (netdata_cloud_setting) - aclk_update_chart(st->rrdhost, st->id, ACLK_CMD_CHART); + rrdset_flag_set(st, RRDSET_FLAG_ACLK); #endif } diff --git a/database/rrdset.c b/database/rrdset.c index f2932798f4..959e9a3da8 100644 --- a/database/rrdset.c +++ b/database/rrdset.c @@ -647,7 +647,7 @@ RRDSET *rrdset_create_custom( aclk_add_collector(host, st->plugin_name, st->module_name); } } - aclk_update_chart(host, st->id, ACLK_CMD_CHART); + rrdset_flag_set(st, RRDSET_FLAG_ACLK); } #endif freez(old_plugin); @@ -944,10 +944,9 @@ RRDSET *rrdset_create_custom( rrdhost_unlock(host); #ifdef ENABLE_ACLK - if (netdata_cloud_setting) { + if (netdata_cloud_setting) aclk_add_collector(host, plugin, module); - aclk_update_chart(host, st->id, ACLK_CMD_CHART); - } + rrdset_flag_set(st, RRDSET_FLAG_ACLK); #endif return(st); } @@ -1383,6 +1382,13 @@ void rrdset_done(RRDSET *st) { // a read lock is OK here rrdset_rdlock(st); +#ifdef ENABLE_ACLK + if (unlikely(rrdset_flag_check(st, RRDSET_FLAG_ACLK))) { + rrdset_flag_clear(st, RRDSET_FLAG_ACLK); + aclk_update_chart(st->rrdhost, st->id, ACLK_CMD_CHART); + } +#endif + if(unlikely(rrdset_flag_check(st, RRDSET_FLAG_OBSOLETE))) { error("Chart '%s' has the OBSOLETE flag set, but it is collected.", st->id); rrdset_isnot_obsolete(st); -- cgit v1.2.3