diff options
author | Costa Tsaousis <costa@netdata.cloud> | 2022-07-18 18:55:57 +0300 |
---|---|---|
committer | Costa Tsaousis <costa@netdata.cloud> | 2022-07-18 18:55:57 +0300 |
commit | 13d89943eeac5ae497dbf3ed4560b7af227e101b (patch) | |
tree | 38993faf9c5c9b6410416f3850f81c03eefefbb9 | |
parent | 09409e30f4329fa957da7fe0535afd2080c52f2f (diff) |
fixed leak when dimensions and charts are redefined
-rw-r--r-- | database/rrdcontext.c | 14 |
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; } |