fix 100% cpu when adding dimension in parallel to the same chart
Costa Tsaousis (ktsaou) committed
Apr 26, 2018 at 03:14 UTC
a084ce56dc4a804c40e62a252da11abe4b54caea
1 file changed
+4
-3
src/rrddim.c
+4
-3
@@ -87,6 +87,8 @@ inline int rrddim_set_divisor(RRDSET *st, RRDDIM *rd, collected_number divisor)
87
// RRDDIM create a dimension
88
89
RRDDIM *rrddim_add_custom(RRDSET *st, const char *id, const char *name, collected_number multiplier, collected_number divisor, RRD_ALGORITHM algorithm, RRD_MEMORY_MODE memory_mode) {
90
+ rrdset_wrlock(st);
91
+
92
RRDDIM *rd = rrddim_find(st, id);
93
if(unlikely(rd)) {
94
debug(D_RRD_CALLS, "Cannot create rrd dimension '%s/%s', it already exists.", st->id, name?name:"<NONAME>");
@@ -96,6 +98,7 @@ RRDDIM *rrddim_add_custom(RRDSET *st, const char *id, const char *name, collecte
98
rrddim_set_multiplier(st, rd, multiplier);
99
rrddim_set_divisor(st, rd, divisor);
100
101
+ rrdset_unlock(st);
102
return rd;
103
}
104
@@ -236,7 +239,6 @@ RRDDIM *rrddim_add_custom(RRDSET *st, const char *id, const char *name, collecte
239
rd->rrdset = st;
240
241
// append this dimension
239
- rrdset_wrlock(st);
242
if(!st->dimensions)
243
st->dimensions = rd;
244
else {
@@ -268,11 +270,10 @@ RRDDIM *rrddim_add_custom(RRDSET *st, const char *id, const char *name, collecte
270
rrddimvar_create(rd, RRDVAR_TYPE_TIME_T, NULL, "_last_collected_t", &rd->last_collected_time.tv_sec, RRDVAR_OPTION_DEFAULT);
271
}
272
271
- rrdset_unlock(st);
272
-
273
if(unlikely(rrddim_index_add(st, rd) != rd))
274
error("RRDDIM: INTERNAL ERROR: attempt to index duplicate dimension '%s' on chart '%s'", rd->id, st->id);
275
276
+ rrdset_unlock(st);
277
return(rd);
278
}
279