@cryptotaxi247 / netdata-1 / commits / a084ce56d

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