@cryptotaxi247 / netdata-1 / commits / f059f4da7

Reset the obsolete flag on service thread (#15892)

* reset the RRDHOST_FLAG_PENDING_OBSOLETE_CHARTS flag * do rrdset_free even when in dbengine mode * remove RRDSET_FLAG_ARCHIVED * remove commented line * use is_available_for_viewers

Emmanuel Vasilakis committed Sep 6, 2023 at 11:35 UTC f059f4da7d04deecbf1b40f2c585cd58f45debe4
10 files changed +18 -49
collectors/plugins.d/pluginsd_parser.c
+1 -1
@@ -1604,7 +1604,7 @@ static inline PARSER_RC pluginsd_begin_v2(char **words, size_t num_words, PARSER
1604 if(!pluginsd_set_scope_chart(parser, st, PLUGINSD_KEYWORD_BEGIN_V2))
1605 return PLUGINSD_DISABLE_PLUGIN(parser, NULL, NULL);
1606
1607 - if(unlikely(rrdset_flag_check(st, RRDSET_FLAG_OBSOLETE | RRDSET_FLAG_ARCHIVED)))
1607 + if(unlikely(rrdset_flag_check(st, RRDSET_FLAG_OBSOLETE)))
1608 rrdset_isnot_obsolete(st);
1609
1610 timing_step(TIMING_STEP_BEGIN2_FIND_CHART);
daemon/service.c
+8 -9
@@ -105,14 +105,11 @@ static bool svc_rrdset_archive_obsolete_dimensions(RRDSET *st, bool all_dimensio
105 return done_all_dimensions;
106 }
107
108 -static void svc_rrdset_obsolete_to_archive(RRDSET *st) {
109 - worker_is_busy(WORKER_JOB_ARCHIVE_CHART);
110 -
108 +static void svc_rrdset_obsolete_to_free(RRDSET *st) {
109 if(!svc_rrdset_archive_obsolete_dimensions(st, true))
110 return;
111
114 - rrdset_flag_set(st, RRDSET_FLAG_ARCHIVED);
115 - rrdset_flag_clear(st, RRDSET_FLAG_OBSOLETE);
112 + worker_is_busy(WORKER_JOB_FREE_CHART);
113
114 rrdcalc_unlink_all_rrdset_alerts(st);
115
@@ -130,10 +127,9 @@ static void svc_rrdset_obsolete_to_archive(RRDSET *st) {
127 worker_is_busy(WORKER_JOB_SAVE_CHART);
128 rrdset_save(st);
129 }
133 -
134 - worker_is_busy(WORKER_JOB_FREE_CHART);
135 - rrdset_free(st);
130 }
131 +
132 + rrdset_free(st);
133 }
134
135 static void svc_rrdhost_cleanup_obsolete_charts(RRDHOST *host) {
@@ -150,12 +146,15 @@ static void svc_rrdhost_cleanup_obsolete_charts(RRDHOST *host) {
146 && st->last_updated.tv_sec + rrdset_free_obsolete_time_s < now
147 && st->last_collected_time.tv_sec + rrdset_free_obsolete_time_s < now
148 )) {
153 - svc_rrdset_obsolete_to_archive(st);
149 + svc_rrdset_obsolete_to_free(st);
150 }
151 else if(rrdset_flag_check(st, RRDSET_FLAG_OBSOLETE_DIMENSIONS)) {
152 rrdset_flag_clear(st, RRDSET_FLAG_OBSOLETE_DIMENSIONS);
153 svc_rrdset_archive_obsolete_dimensions(st, false);
154 }
155 + else if (unlikely(rrdset_flag_check(st, RRDSET_FLAG_OBSOLETE))) {
156 + rrdhost_flag_set(host, RRDHOST_FLAG_PENDING_OBSOLETE_CHARTS);
157 + }
158 }
159 rrdset_foreach_done(st);
160 }
database/contexts/instance.c
+1 -1
@@ -494,7 +494,7 @@ inline void rrdinstance_updated_rrdset_flags(RRDSET *st) {
494 RRDINSTANCE *ri = rrdset_get_rrdinstance(st);
495 if(unlikely(!ri)) return;
496
497 - if(unlikely(rrdset_flag_check(st, RRDSET_FLAG_ARCHIVED|RRDSET_FLAG_OBSOLETE)))
497 + if(unlikely(rrdset_flag_check(st, RRDSET_FLAG_OBSOLETE)))
498 rrd_flag_set_archived(ri);
499
500 rrdinstance_updated_rrdset_flags_no_action(ri, st);
database/rrd.h
+3 -12
@@ -693,9 +693,7 @@ typedef enum __attribute__ ((__packed__)) rrdset_flags {
693 RRDSET_FLAG_HIDDEN = (1 << 12), // if set, do not show this chart on the dashboard, but use it for exporting
694 RRDSET_FLAG_SYNC_CLOCK = (1 << 13), // if set, microseconds on next data collection will be ignored (the chart will be synced to now)
695 RRDSET_FLAG_OBSOLETE_DIMENSIONS = (1 << 14), // this is marked by the collector/module when a chart has obsolete dimensions
696 - // No new values have been collected for this chart since agent start, or it was marked RRDSET_FLAG_OBSOLETE at
697 - // least rrdset_free_obsolete_time seconds ago.
698 - RRDSET_FLAG_ARCHIVED = (1 << 15),
696 +
697 RRDSET_FLAG_METADATA_UPDATE = (1 << 16), // Mark that metadata needs to be stored
698 RRDSET_FLAG_ANOMALY_DETECTION = (1 << 18), // flag to identify anomaly detection charts.
699 RRDSET_FLAG_INDEXED_ID = (1 << 19), // the rrdset is indexed by its id
@@ -1403,8 +1401,6 @@ void rrdset_acquired_release(RRDSET_ACQUIRED *rsa);
1401 static inline RRDSET *rrdset_find_active_localhost(const char *id)
1402 {
1403 RRDSET *st = rrdset_find_localhost(id);
1406 - if (unlikely(st && rrdset_flag_check(st, RRDSET_FLAG_ARCHIVED)))
1407 - return NULL;
1404 return st;
1405 }
1406
@@ -1414,8 +1410,6 @@ RRDSET *rrdset_find_bytype(RRDHOST *host, const char *type, const char *id);
1410 static inline RRDSET *rrdset_find_active_bytype_localhost(const char *type, const char *id)
1411 {
1412 RRDSET *st = rrdset_find_bytype_localhost(type, id);
1417 - if (unlikely(st && rrdset_flag_check(st, RRDSET_FLAG_ARCHIVED)))
1418 - return NULL;
1413 return st;
1414 }
1415
@@ -1425,8 +1419,6 @@ RRDSET *rrdset_find_byname(RRDHOST *host, const char *name);
1419 static inline RRDSET *rrdset_find_active_byname_localhost(const char *name)
1420 {
1421 RRDSET *st = rrdset_find_byname_localhost(name);
1428 - if (unlikely(st && rrdset_flag_check(st, RRDSET_FLAG_ARCHIVED)))
1429 - return NULL;
1422 return st;
1423 }
1424
@@ -1442,9 +1434,8 @@ void rrdset_is_obsolete(RRDSET *st);
1434 void rrdset_isnot_obsolete(RRDSET *st);
1435
1436 // checks if the RRDSET should be offered to viewers
1445 -#define rrdset_is_available_for_viewers(st) (!rrdset_flag_check(st, RRDSET_FLAG_HIDDEN) && !rrdset_flag_check(st, RRDSET_FLAG_OBSOLETE) && !rrdset_flag_check(st, RRDSET_FLAG_ARCHIVED) && rrdset_number_of_dimensions(st) && (st)->rrd_memory_mode != RRD_MEMORY_MODE_NONE)
1446 -#define rrdset_is_available_for_exporting_and_alarms(st) (!rrdset_flag_check(st, RRDSET_FLAG_OBSOLETE) && !rrdset_flag_check(st, RRDSET_FLAG_ARCHIVED) && rrdset_number_of_dimensions(st))
1447 -#define rrdset_is_archived(st) (rrdset_flag_check(st, RRDSET_FLAG_ARCHIVED) && rrdset_number_of_dimensions(st))
1437 +#define rrdset_is_available_for_viewers(st) (!rrdset_flag_check(st, RRDSET_FLAG_HIDDEN) && !rrdset_flag_check(st, RRDSET_FLAG_OBSOLETE) && rrdset_number_of_dimensions(st) && (st)->rrd_memory_mode != RRD_MEMORY_MODE_NONE)
1438 +#define rrdset_is_available_for_exporting_and_alarms(st) (!rrdset_flag_check(st, RRDSET_FLAG_OBSOLETE) && rrdset_number_of_dimensions(st))
1439
1440 time_t rrddim_first_entry_s(RRDDIM *rd);
1441 time_t rrddim_first_entry_s_of_tier(RRDDIM *rd, size_t tier);
database/rrdset.c
-10
@@ -292,11 +292,6 @@ static bool rrdset_conflict_callback(const DICTIONARY_ITEM *item __maybe_unused,
292
293 ctr->react_action = RRDSET_REACT_NONE;
294
295 - if (rrdset_flag_check(st, RRDSET_FLAG_ARCHIVED)) {
296 - rrdset_flag_clear(st, RRDSET_FLAG_ARCHIVED);
297 - ctr->react_action |= RRDSET_REACT_CHART_ACTIVATED;
298 - }
299 -
295 if (rrdset_reset_name(st, (ctr->name && *ctr->name) ? ctr->name : ctr->id) == 2)
296 ctr->react_action |= RRDSET_REACT_UPDATED;
297
@@ -657,11 +652,6 @@ void rrdset_get_retention_of_tier_for_collected_chart(RRDSET *st, time_t *first_
652 }
653
654 inline void rrdset_is_obsolete(RRDSET *st) {
660 - if(unlikely(rrdset_flag_check(st, RRDSET_FLAG_ARCHIVED))) {
661 - netdata_log_info("Cannot obsolete already archived chart %s", rrdset_name(st));
662 - return;
663 - }
664 -
655 if(unlikely(!(rrdset_flag_check(st, RRDSET_FLAG_OBSOLETE)))) {
656 rrdset_flag_set(st, RRDSET_FLAG_OBSOLETE);
657 rrdhost_flag_set(st->rrdhost, RRDHOST_FLAG_PENDING_OBSOLETE_CHARTS);
health/health.c
-11
@@ -376,9 +376,6 @@ static void health_reload_host(RRDHOST *host) {
376
377 // link the loaded alarms to their charts
378 rrdset_foreach_write(st, host) {
379 - if (rrdset_flag_check(st, RRDSET_FLAG_ARCHIVED))
380 - continue;
381 -
379 rrdcalc_link_matching_alerts_to_rrdset(st);
380 rrdcalctemplate_link_matching_templates_to_rrdset(st);
381 }
@@ -724,11 +721,6 @@ static inline int rrdcalc_isrunnable(RRDCALC *rc, time_t now, time_t *next_run)
721 return 0;
722 }
723
727 - if(unlikely(rrdset_flag_check(rc->rrdset, RRDSET_FLAG_ARCHIVED))) {
728 - netdata_log_debug(D_HEALTH, "Health not running alarm '%s.%s'. The chart has been marked as archived", rrdcalc_chart_name(rc), rrdcalc_name(rc));
729 - return 0;
730 - }
731 -
724 if(unlikely(!rc->rrdset->last_collected_time.tv_sec || rc->rrdset->counter_done < 2)) {
725 netdata_log_debug(D_HEALTH, "Health not running alarm '%s.%s'. Chart is not fully collected yet.", rrdcalc_chart_name(rc), rrdcalc_name(rc));
726 return 0;
@@ -854,9 +846,6 @@ static void initialize_health(RRDHOST *host)
846 // link the loaded alarms to their charts
847 RRDSET *st;
848 rrdset_foreach_reentrant(st, host) {
857 - if (rrdset_flag_check(st, RRDSET_FLAG_ARCHIVED))
858 - continue;
859 -
849 rrdcalc_link_matching_alerts_to_rrdset(st);
850 rrdcalctemplate_link_matching_templates_to_rrdset(st);
851 }
ml/ml.cc
+1 -1
@@ -1152,7 +1152,7 @@ ml_acquired_dimension_get(char *machine_guid, STRING *chart_id, STRING *dimensio
1152 acq_rs = rrdset_find_and_acquire(rh, string2str(chart_id));
1153 if (acq_rs) {
1154 RRDSET *rs = rrdset_acquired_to_rrdset(acq_rs);
1155 - if (rs && !rrdset_flag_check(rs, RRDSET_FLAG_ARCHIVED | RRDSET_FLAG_OBSOLETE)) {
1155 + if (rs && !rrdset_flag_check(rs, RRDSET_FLAG_OBSOLETE)) {
1156 acq_rd = rrddim_find_and_acquire(rs, string2str(dimension_id));
1157 if (acq_rd) {
1158 RRDDIM *rd = rrddim_acquired_to_rrddim(acq_rd);
web/api/formatters/charts2json.c
+2 -2
@@ -36,7 +36,7 @@ const char* get_release_channel() {
36 return (use_stable)?"stable":"nightly";
37 }
38
39 -void charts2json(RRDHOST *host, BUFFER *wb, int skip_volatile, int show_archived) {
39 +void charts2json(RRDHOST *host, BUFFER *wb, int skip_volatile) {
40 static char *custom_dashboard_info_js_filename = NULL;
41 size_t c, dimensions = 0, memory = 0, alarms = 0;
42 RRDSET *st;
@@ -70,7 +70,7 @@ void charts2json(RRDHOST *host, BUFFER *wb, int skip_volatile, int show_archived
70
71 c = 0;
72 rrdset_foreach_read(st, host) {
73 - if ((!show_archived && rrdset_is_available_for_viewers(st)) || (show_archived && rrdset_is_archived(st))) {
73 + if (rrdset_is_available_for_viewers(st)) {
74 if(c) buffer_strcat(wb, ",");
75 buffer_strcat(wb, "\n\t\t\"");
76 buffer_strcat(wb, rrdset_id(st));
web/api/formatters/charts2json.h
+1 -1
@@ -5,7 +5,7 @@
5
6 #include "rrd2json.h"
7
8 -void charts2json(RRDHOST *host, BUFFER *wb, int skip_volatile, int show_archived);
8 +void charts2json(RRDHOST *host, BUFFER *wb, int skip_volatile);
9 const char* get_release_channel();
10
11 #endif //NETDATA_API_FORMATTER_CHARTS2JSON_H
web/api/web_api_v1.c
+1 -1
@@ -644,7 +644,7 @@ inline int web_client_api_request_v1_charts(RRDHOST *host, struct web_client *w,
644
645 buffer_flush(w->response.data);
646 w->response.data->content_type = CT_APPLICATION_JSON;
647 - charts2json(host, w->response.data, 0, 0);
647 + charts2json(host, w->response.data, 0);
648 return HTTP_RESP_OK;
649 }
650