summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCosta Tsaousis <costa@netdata.cloud>2022-07-19 13:31:39 +0300
committerCosta Tsaousis <costa@netdata.cloud>2022-07-19 13:31:39 +0300
commitc81c0e645d0e42a336b26574d03566d5252c1ccb (patch)
treebf1a0ed0463fc6405549c6719ab4aaa71c7f546a
parentbf6237438dd6c784eb70b7048e7ee544fa256e24 (diff)
fixed non-retention updates not propagated upstream
-rw-r--r--database/rrdcontext.c61
1 files changed, 30 insertions, 31 deletions
diff --git a/database/rrdcontext.c b/database/rrdcontext.c
index 6f97eff567..d33abc1620 100644
--- a/database/rrdcontext.c
+++ b/database/rrdcontext.c
@@ -11,6 +11,7 @@ int rrdcontext_enabled = CONFIG_BOOLEAN_YES;
#define MESSAGES_PER_BUNDLE_TO_SEND_TO_HUB_PER_HOST 5000
#define FULL_RETENTION_SCAN_DELAY_AFTER_DB_ROTATION_SECS 120
#define RRDCONTEXT_WORKER_THREAD_HEARTBEAT_SECS 1
+#define RRDCONTEXT_MINIMUM_ALLOWED_PRIORITY 10
// #define LOG_TRANSITIONS 1
// #define LOG_RRDINSTANCES 1
@@ -637,6 +638,9 @@ static inline bool rrdmetric_should_be_deleted(RRDMETRIC *rm) {
static void rrdmetric_trigger_updates(RRDMETRIC *rm, bool force, bool escalate) {
if(likely(!force && !(rm->flags & RRD_FLAG_UPDATED))) return;
+ if(unlikely(rrd_flag_is_collected(rm) && !rm->rrddim))
+ rrd_flag_set_archived(rm);
+
if(unlikely((rm->flags & RRD_FLAG_UPDATE_REASON_DISCONNECTED_CHILD) && rrd_flag_is_collected(rm)))
rrd_flag_set_archived(rm);
@@ -731,26 +735,6 @@ static inline void rrdmetric_collected_rrddim(RRDDIM *rd) {
// ----------------------------------------------------------------------------
// RRDINSTANCE
-static void rrdinstance_check(RRDINSTANCE *ri) {
- if(unlikely(!ri->id))
- fatal("RRDINSTANCE: created without an id");
-
- if(unlikely(!ri->name))
- fatal("RRDINSTANCE: '%s' created without a name", string2str(ri->id));
-
- if(unlikely(!ri->title))
- fatal("RRDINSTANCE: '%s' created without a title", string2str(ri->id));
-
- if(unlikely(!ri->units))
- fatal("RRDINSTANCE: '%s' created without units", string2str(ri->id));
-
- if(unlikely(!ri->priority))
- fatal("RRDINSTANCE: '%s' created without a priority", string2str(ri->id));
-
- if(unlikely(!ri->update_every))
- fatal("RRDINSTANCE: '%s' created without an update_every", string2str(ri->id));
-}
-
static void rrdinstance_free(RRDINSTANCE *ri) {
if(ri->flags & RRD_FLAG_OWN_LABELS)
@@ -783,8 +767,6 @@ static void rrdinstance_insert_callback(const char *id __maybe_unused, void *val
if(!ri->name)
ri->name = string_dup(ri->id);
- rrdinstance_check(ri);
-
if(ri->rrdset && ri->rrdset->state) {
ri->rrdlabels = ri->rrdset->state->chart_labels;
if(ri->flags & RRD_FLAG_OWN_LABELS)
@@ -796,7 +778,6 @@ static void rrdinstance_insert_callback(const char *id __maybe_unused, void *val
}
rrdmetrics_create(ri);
-
rrdinstance_log(ri, "INSERT");
// signal the react callback to do the job
@@ -820,8 +801,6 @@ static void rrdinstance_conflict_callback(const char *id __maybe_unused, void *o
RRDINSTANCE *ri = (RRDINSTANCE *)oldv;
RRDINSTANCE *ri_new = (RRDINSTANCE *)newv;
- rrdinstance_check(ri_new);
-
if(ri->id != ri_new->id)
fatal("RRDINSTANCE: '%s' cannot change id to '%s'", string2str(ri->id), string2str(ri_new->id));
@@ -965,7 +944,21 @@ static inline bool rrdinstance_should_be_deleted(RRDINSTANCE *ri) {
static void rrdinstance_trigger_updates(RRDINSTANCE *ri, bool force, bool escalate) {
if(unlikely(!force && !(ri->flags & RRD_FLAG_UPDATED))) return;
- rrd_flag_unset_updated(ri);
+
+ if(likely(ri->rrdset)) {
+ if(unlikely(ri->rrdset->priority != ri->priority)) {
+ ri->priority = ri->rrdset->priority;
+ rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_PRIORITY);
+ }
+ if(unlikely(ri->rrdset->update_every != ri->update_every)) {
+ ri->update_every = ri->rrdset->update_every;
+ rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_UPDATE_EVERY);
+ }
+ }
+ else if(unlikely(rrd_flag_is_collected(ri))) {
+ rrd_flag_set_archived(ri);
+ rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_LINKING);
+ }
RRD_FLAGS combined_metrics_flags = RRD_FLAG_NONE;
time_t min_first_time_t = LONG_MAX, max_last_time_t = 0;
@@ -1053,7 +1046,7 @@ static void rrdinstance_trigger_updates(RRDINSTANCE *ri, bool force, bool escala
}
static inline void rrdinstance_from_rrdset(RRDSET *st) {
- RRDCONTEXT tc = {
+ RRDCONTEXT trc = {
.id = string_strdupz(st->context),
.title = string_strdupz(st->title),
.units = string_strdupz(st->units),
@@ -1064,7 +1057,7 @@ static inline void rrdinstance_from_rrdset(RRDSET *st) {
.rrdhost = st->rrdhost,
};
- RRDCONTEXT_ACQUIRED *rca = (RRDCONTEXT_ACQUIRED *)dictionary_set_and_acquire_item((DICTIONARY *)st->rrdhost->rrdctx, string2str(tc.id), &tc, sizeof(tc));
+ RRDCONTEXT_ACQUIRED *rca = (RRDCONTEXT_ACQUIRED *)dictionary_set_and_acquire_item((DICTIONARY *)st->rrdhost->rrdctx, string2str(trc.id), &trc, sizeof(trc));
RRDCONTEXT *rc = rrdcontext_acquired_value(rca);
RRDINSTANCE tri = {
@@ -1535,8 +1528,9 @@ static void rrdcontext_trigger_updates(RRDCONTEXT *rc, bool force, RRD_FLAGS rea
if(unlikely(!force && !(rc->flags & RRD_FLAG_UPDATED))) return;
rrdcontext_lock(rc);
- rc->flags |= reason;
- rrd_flag_unset_updated(rc);
+
+ if(reason)
+ rrd_flag_set_updated(rc, reason);
size_t min_priority = LONG_MAX;
RRD_FLAGS combined_instances_flags = RRD_FLAG_NONE;
@@ -1553,9 +1547,14 @@ static void rrdcontext_trigger_updates(RRDCONTEXT *rc, bool force, RRD_FLAGS rea
continue;
}
+ internal_error(rc->units != ri->units,
+ "RRDCONTEXT: '%s' rrdinstance '%s' has different units, context '%s', instance '%s'",
+ string2str(rc->id), string2str(ri->id),
+ string2str(rc->units), string2str(ri->units));
+
instances_active++;
- if (ri->priority > 0 && ri->priority < min_priority)
+ if (ri->priority >= RRDCONTEXT_MINIMUM_ALLOWED_PRIORITY && ri->priority < min_priority)
min_priority = ri->priority;
if (ri->first_time_t && ri->first_time_t < min_first_time_t)