Browse Source

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)
Stelios Fragkakis 4 years ago
parent
commit
d600ae20c0
3 changed files with 20 additions and 19 deletions
  1. 2 1
      database/rrd.h
  2. 8 14
      database/rrddim.c
  3. 10 4
      database/rrdset.c

+ 2 - 1
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

+ 8 - 14
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
 }
 

+ 10 - 4
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);