summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCosta Tsaousis <costa@netdata.cloud>2022-07-18 18:55:57 +0300
committerCosta Tsaousis <costa@netdata.cloud>2022-07-18 18:55:57 +0300
commit13d89943eeac5ae497dbf3ed4560b7af227e101b (patch)
tree38993faf9c5c9b6410416f3850f81c03eefefbb9
parent09409e30f4329fa957da7fe0535afd2080c52f2f (diff)
fixed leak when dimensions and charts are redefined
-rw-r--r--database/rrdcontext.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/database/rrdcontext.c b/database/rrdcontext.c
index d25d639fb4..9d06dbc5ea 100644
--- a/database/rrdcontext.c
+++ b/database/rrdcontext.c
@@ -676,8 +676,11 @@ static inline void rrdmetric_from_rrddim(RRDDIM *rd) {
if(rd->rrdmetric && rd->rrdmetric != rma)
fatal("RRDMETRIC: dimension '%s' of chart '%s' changed rrdmetric!", rd->id, rd->rrdset->id);
- else if(!rd->rrdmetric)
- rd->rrdmetric = rma;
+
+ if(rd->rrdmetric)
+ rrdmetric_release(rd->rrdmetric);
+
+ rd->rrdmetric = rma;
}
#define rrddim_get_rrdmetric(rd) rrddim_get_rrdmetric_with_trace(rd, __FUNCTION__)
@@ -1083,6 +1086,9 @@ static inline void rrdinstance_from_rrdset(RRDSET *st) {
if(st->rrdinstance && st->rrdinstance != ria)
fatal("RRDINSTANCE: chart '%s' changed rrdinstance.", st->id);
+ if(st->rrdinstance)
+ rrdinstance_release(st->rrdinstance);
+
st->rrdinstance = ria;
if(st->rrdcontext && st->rrdcontext != rca) {
@@ -1090,9 +1096,11 @@ static inline void rrdinstance_from_rrdset(RRDSET *st) {
RRDCONTEXT *rc_old = rrdcontext_acquired_value(st->rrdcontext);
dictionary_del(rc_old->rrdinstances, st->id);
rrdcontext_trigger_updates(rc_old, true, RRD_FLAG_UPDATE_REASON_CHANGED_LINKING);
- rrdcontext_release(st->rrdcontext);
}
+ if(st->rrdcontext)
+ rrdcontext_release(st->rrdcontext);
+
st->rrdcontext = rca;
}