@cryptotaxi247 / netdata-1 / commits / 4e0ad82dc

tc works on qdiscs too, merged #1427

Costa Tsaousis (ktsaou) committed Jan 29, 2017 at 07:02 UTC 4e0ad82dc480507bf5f94e6116cd79164d2fbbd5
2 files changed +236 -279
src/plugin_tc.c
+235 -278
@@ -1,7 +1,6 @@
1 #include "common.h"
2
3 -#define RRD_TYPE_TC "tc"
4 -#define RRD_TYPE_TC_LEN strlen(RRD_TYPE_TC)
3 +#define RRD_TYPE_TC "tc"
4
5 // ----------------------------------------------------------------------------
6 // /sbin/tc processor
@@ -26,6 +25,8 @@ struct tc_class {
25 char hasparent;
26 char isleaf;
27 char isqdisc;
28 + char render;
29 +
30 unsigned long long bytes;
31 unsigned long long packets;
32 unsigned long long dropped;
@@ -198,35 +199,80 @@ static inline void tc_device_commit(struct tc_device *d) {
199 enabled_all_classes_qdiscs = config_get_boolean_ondemand("plugin:tc", "enable show all classes and qdiscs for all interfaces", CONFIG_ONDEMAND_NO);
200 }
201
202 + if(unlikely(d->enabled == (char)-1)) {
203 + char var_name[CONFIG_MAX_NAME + 1];
204 + snprintfz(var_name, CONFIG_MAX_NAME, "qos for %s", d->id);
205 +
206 + d->enabled = (char)config_get_boolean_ondemand("plugin:tc", var_name, enable_new_interfaces);
207 +
208 + snprintfz(var_name, CONFIG_MAX_NAME, "traffic chart for %s", d->id);
209 + d->enabled_bytes = (char)config_get_boolean_ondemand("plugin:tc", var_name, enable_bytes);
210 +
211 + snprintfz(var_name, CONFIG_MAX_NAME, "packets chart for %s", d->id);
212 + d->enabled_packets = (char)config_get_boolean_ondemand("plugin:tc", var_name, enable_packets);
213 +
214 + snprintfz(var_name, CONFIG_MAX_NAME, "dropped packets chart for %s", d->id);
215 + d->enabled_dropped = (char)config_get_boolean_ondemand("plugin:tc", var_name, enable_dropped);
216 +
217 + snprintfz(var_name, CONFIG_MAX_NAME, "tokens chart for %s", d->id);
218 + d->enabled_tokens = (char)config_get_boolean_ondemand("plugin:tc", var_name, enable_tokens);
219 +
220 + snprintfz(var_name, CONFIG_MAX_NAME, "ctokens chart for %s", d->id);
221 + d->enabled_ctokens = (char)config_get_boolean_ondemand("plugin:tc", var_name, enable_ctokens);
222 +
223 + snprintfz(var_name, CONFIG_MAX_NAME, "show all classes for %s", d->id);
224 + d->enabled_all_classes_qdiscs = (char)config_get_boolean_ondemand("plugin:tc", var_name, enabled_all_classes_qdiscs);
225 + }
226 +
227 // we only need to add leaf classes
202 - struct tc_class *c, *x;
228 + struct tc_class *c, *x /*, *root = NULL */;
229 unsigned long long bytes_sum = 0, packets_sum = 0, dropped_sum = 0, tokens_sum = 0, ctokens_sum = 0;
204 - int active_qos = 0;
230 + int active_nodes = 0, updated_classes = 0, updated_qdiscs = 0;
231
206 - // set all classes
232 + // prepare all classes
233 for(c = d->classes ; c ; c = c->next) {
234 + c->render = 0;
235 +
236 c->isleaf = 1;
237 c->hasparent = 0;
238
239 if(unlikely(!c->updated))
240 c->unupdated++;
213 - else
241 + else {
242 c->unupdated = 0;
243 +
244 + if(c->isqdisc)
245 + updated_qdiscs++;
246 + else
247 + updated_classes++;
248 + }
249 + }
250 +
251 + if(unlikely(!d->enabled || (!updated_classes && !updated_qdiscs))) {
252 + debug(D_TC_LOOP, "TC: Ignoring TC device '%s'. It is not enabled/updated.", d->name?d->name:d->id);
253 + tc_device_classes_cleanup(d);
254 + return;
255 + }
256 +
257 + if(unlikely(updated_classes && updated_qdiscs)) {
258 + error("TC: device '%s' has active both classes (%d) and qdiscs (%d). Will render only qdiscs.", d->id, updated_classes, updated_qdiscs);
259 + for(c = d->classes ; c ; c = c->next)
260 + if(unlikely(!c->isqdisc && c->updated))
261 + c->updated = 0;
262 +
263 + updated_classes = 0;
264 }
265
266 // mark the classes as leafs and parents
218 - for(c = d->classes ; c ; c = c->next) {
267 + for(c = d->classes; c; c = c->next) {
268 if(unlikely(!c->updated)) continue;
220 - if(unlikely(c->isqdisc)) continue;
269
222 - for(x = d->classes ; x ; x = x->next) {
223 - if(unlikely(!x->updated)) continue;
224 - if(unlikely(c == x)) continue;
225 - if(unlikely(x->isqdisc)) continue;
270 + // find if c is leaf or not
271 + for(x = d->classes; x; x = x->next) {
272 + if(unlikely(!x->updated || c == x || !x->parentid)) continue;
273
227 - if(x->parentid && (
228 - ( c->hash == x->parent_hash && strcmp(c->id, x->parentid) == 0) ||
229 - (c->leafid && c->leaf_hash == x->parent_hash && strcmp(c->leafid, x->parentid) == 0))) {
274 + if( (c->hash == x->parent_hash && strcmp(c->id, x->parentid) == 0) ||
275 + (c->leafid && c->leaf_hash == x->parent_hash && strcmp(c->leafid, x->parentid) == 0)) {
276 // debug(D_TC_LOOP, "TC: In device '%s', class '%s' (leafid: '%s') has as leaf class '%s' (parentid: '%s').", d->name?d->name:d->id, c->name?c->name:c->id, c->leafid?c->leafid:c->id, x->name?x->name:x->id, x->parentid?x->parentid:x->id);
277 c->isleaf = 0;
278 x->hasparent = 1;
@@ -244,52 +290,34 @@ static inline void tc_device_commit(struct tc_device *d) {
290 }
291 */
292
247 - // we need the root qdisc
293 for(c = d->classes ; c ; c = c->next) {
294 + if(unlikely(!c->updated)) continue;
295 +
296 // debug(D_TC_LOOP, "TC: Device '%s', class '%s', isLeaf=%d, HasParent=%d, Seen=%d", d->name?d->name:d->id, c->name?c->name:c->id, c->isleaf, c->hasparent, c->seen);
250 - debug(D_TC_LOOP, "TC: Device '%s', class '%s', isleaf=%s, isqdisc=%s, hasparent=%s bytes=%llu, packtes=%llu, dropped=%llu, tokens=%llu, ctokens=%llu", d->name?d->name:d->id, c->name?c->name:c->id, c->isleaf?"true":"false", c->isqdisc?"true":"false", c->hasparent?"true":"false", c->bytes, c->packets, c->dropped, c->tokens, c->ctokens);
251 - if(unlikely(c->updated && c->isqdisc && !c->parentid)) {
252 - active_qos = 1;
253 - bytes_sum = c->bytes;
254 - packets_sum = c->packets;
255 - dropped_sum = c->dropped;
256 - tokens_sum = c->tokens;
257 - ctokens_sum = c->ctokens;
258 - debug(D_TC_LOOP, "TC: found root qdisc. active_qos=%d, bytes_sum=%llu", active_qos, bytes_sum);
259 - break;
297 +
298 + if(unlikely((c->isleaf && c->hasparent) || d->enabled_all_classes_qdiscs)) {
299 + c->render = 1;
300 + active_nodes++;
301 + bytes_sum += c->bytes;
302 + packets_sum += c->packets;
303 + dropped_sum += c->dropped;
304 + tokens_sum += c->tokens;
305 + ctokens_sum += c->ctokens;
306 }
307 +
308 + //if(unlikely(!c->hasparent)) {
309 + // if(root) error("TC: multiple root class/qdisc for device '%s' (old: '%s', new: '%s')", d->id, root->id, c->id);
310 + // root = c;
311 + // debug(D_TC_LOOP, "TC: found root class/qdisc '%s'", root->id);
312 + //}
313 }
314
263 - if(unlikely(!active_qos)) {
264 - debug(D_TC_LOOP, "TC: Ignoring TC device '%s'. No leaf classes.", d->name?d->name:d->id);
315 + if(unlikely(!active_nodes)) {
316 + debug(D_TC_LOOP, "TC: Ignoring TC device '%s'. No useful classes/qdiscs.", d->name?d->name:d->id);
317 tc_device_classes_cleanup(d);
318 return;
319 }
320
269 - if(unlikely(d->enabled == (char)-1)) {
270 - char var_name[CONFIG_MAX_NAME + 1];
271 - snprintfz(var_name, CONFIG_MAX_NAME, "qos for %s", d->id);
272 - d->enabled = (char)config_get_boolean_ondemand("plugin:tc", var_name, enable_new_interfaces);
273 -
274 - snprintfz(var_name, CONFIG_MAX_NAME, "traffic chart for %s", d->id);
275 - d->enabled_bytes = (char)config_get_boolean_ondemand("plugin:tc", var_name, enable_bytes);
276 -
277 - snprintfz(var_name, CONFIG_MAX_NAME, "packets chart for %s", d->id);
278 - d->enabled_packets = (char)config_get_boolean_ondemand("plugin:tc", var_name, enable_packets);
279 -
280 - snprintfz(var_name, CONFIG_MAX_NAME, "dropped packets chart for %s", d->id);
281 - d->enabled_dropped = (char)config_get_boolean_ondemand("plugin:tc", var_name, enable_dropped);
282 -
283 - snprintfz(var_name, CONFIG_MAX_NAME, "tokens chart for %s", d->id);
284 - d->enabled_tokens = (char)config_get_boolean_ondemand("plugin:tc", var_name, enable_tokens);
285 -
286 - snprintfz(var_name, CONFIG_MAX_NAME, "ctokens chart for %s", d->id);
287 - d->enabled_ctokens = (char)config_get_boolean_ondemand("plugin:tc", var_name, enable_ctokens);
288 -
289 - snprintfz(var_name, CONFIG_MAX_NAME, "show all classes for %s", d->id);
290 - d->enabled_all_classes_qdiscs = (char)config_get_boolean_ondemand("plugin:tc", var_name, enabled_all_classes_qdiscs);
291 - }
292 -
321 debug(D_TC_LOOP, "TC: evaluating TC device '%s'. enabled = %d/%d (bytes: %d/%d, packets: %d/%d, dropped: %d/%d, tokens: %d/%d, ctokens: %d/%d, all_classes_qdiscs: %d/%d), classes: (bytes = %llu, packets = %llu, dropped = %llu, tokens = %llu, ctokens = %llu).",
322 d->name?d->name:d->id,
323 d->enabled, enable_new_interfaces,
@@ -306,287 +334,211 @@ static inline void tc_device_commit(struct tc_device *d) {
334 ctokens_sum
335 );
336
309 - if(likely(d->enabled)) {
310 - // --------------------------------------------------------------------
311 - // bytes
337 + // --------------------------------------------------------------------
338 + // bytes
339
313 - if(d->enabled_bytes == CONFIG_ONDEMAND_YES || (d->enabled_bytes == CONFIG_ONDEMAND_ONDEMAND && bytes_sum)) {
314 - d->enabled_bytes = CONFIG_ONDEMAND_YES;
340 + if(d->enabled_bytes == CONFIG_ONDEMAND_YES || (d->enabled_bytes == CONFIG_ONDEMAND_ONDEMAND && bytes_sum)) {
341 + d->enabled_bytes = CONFIG_ONDEMAND_YES;
342
316 - if(unlikely(!d->st_bytes)) {
317 - d->st_bytes = rrdset_find_bytype(RRD_TYPE_TC, d->id);
318 - if(unlikely(!d->st_bytes)) {
319 - debug(D_TC_LOOP, "TC: Creating new chart for device '%s'", d->name?d->name:d->id);
320 - d->st_bytes = rrdset_create(RRD_TYPE_TC, d->id, d->name?d->name:d->id, d->family?d->family:d->id, RRD_TYPE_TC ".qos", "Class Usage", "kilobits/s", 7000, rrd_update_every, d->enabled_all_classes_qdiscs ? RRDSET_TYPE_LINE : RRDSET_TYPE_STACKED);
321 - }
322 - }
323 - else {
324 - debug(D_TC_LOOP, "TC: Updating chart for device '%s'", d->name?d->name:d->id);
325 - rrdset_next(d->st_bytes);
343 + if(unlikely(!d->st_bytes))
344 + d->st_bytes = rrdset_create(RRD_TYPE_TC, d->id, d->name?d->name:d->id, d->family?d->family:d->id, RRD_TYPE_TC ".qos", "Class Usage", "kilobits/s", 7000, rrd_update_every, d->enabled_all_classes_qdiscs ? RRDSET_TYPE_LINE : RRDSET_TYPE_STACKED);
345
327 - if(unlikely(d->name_updated && d->name && strcmp(d->id, d->name) != 0)) {
328 - rrdset_set_name(d->st_bytes, d->name);
329 - d->name_updated = 0;
330 - }
346 + else {
347 + rrdset_next(d->st_bytes);
348 + if(unlikely(d->name_updated)) rrdset_set_name(d->st_bytes, d->name);
349
332 - // FIXME
333 - // update the family
334 - }
350 + // FIXME
351 + // update the family
352 + }
353
336 - for(c = d->classes ; c ; c = c->next) {
337 - if(unlikely(!c->updated)) continue;
354 + for(c = d->classes ; c ; c = c->next) {
355 + if(unlikely(!c->render)) continue;
356
339 - if((c->isleaf && c->hasparent && !c->isqdisc) || d->enabled_all_classes_qdiscs) {
340 - if(unlikely(!c->rd_bytes)) {
341 - c->rd_bytes = rrddim_find(d->st_bytes, c->id);
342 - if(unlikely(!c->rd_bytes)) {
343 - debug(D_TC_LOOP, "TC: Adding to chart '%s', dimension '%s' (name: '%s')", d->st_bytes->id, c->id, c->name);
357 + if(unlikely(!c->rd_bytes))
358 + c->rd_bytes = rrddim_add(d->st_bytes, c->id, c->name?c->name:c->id, 8, 1024, RRDDIM_INCREMENTAL);
359 + else if(unlikely(c->name_updated))
360 + rrddim_set_name(d->st_bytes, c->rd_bytes, c->name);
361
345 - // new class, we have to add it
346 - c->rd_bytes = rrddim_add(d->st_bytes, c->id, c->name?c->name:c->id, 8, 1024, RRDDIM_INCREMENTAL);
347 - }
348 - else debug(D_TC_LOOP, "TC: Updating chart '%s', dimension '%s'", d->st_bytes->id, c->id);
349 - }
362 + rrddim_set_by_pointer(d->st_bytes, c->rd_bytes, c->bytes);
363 + }
364 + rrdset_done(d->st_bytes);
365 + }
366
351 - rrddim_set_by_pointer(d->st_bytes, c->rd_bytes, c->bytes);
367 + // --------------------------------------------------------------------
368 + // packets
369
353 - // if it has a name, different to the id
354 - if(unlikely(c->name_updated && c->name && strcmp(c->id, c->name) != 0)) {
355 - // update the rrd dimension with the new name
356 - debug(D_TC_LOOP, "TC: Setting chart '%s', dimension '%s' name to '%s'", d->st_bytes->id, c->rd_bytes->id, c->name);
357 - rrddim_set_name(d->st_bytes, c->rd_bytes, c->name);
358 - }
359 - }
360 - }
361 - rrdset_done(d->st_bytes);
362 - }
370 + if(d->enabled_packets == CONFIG_ONDEMAND_YES || (d->enabled_packets == CONFIG_ONDEMAND_ONDEMAND && packets_sum)) {
371 + d->enabled_packets = CONFIG_ONDEMAND_YES;
372
364 - // --------------------------------------------------------------------
365 - // packets
366 -
367 - if(d->enabled_packets == CONFIG_ONDEMAND_YES || (d->enabled_packets == CONFIG_ONDEMAND_ONDEMAND && packets_sum)) {
368 - d->enabled_packets = CONFIG_ONDEMAND_YES;
373 + if(unlikely(!d->st_packets)) {
374 + char id[RRD_ID_LENGTH_MAX + 1];
375 + char name[RRD_ID_LENGTH_MAX + 1];
376 + snprintfz(id, RRD_ID_LENGTH_MAX, "%s_packets", d->id);
377 + snprintfz(name, RRD_ID_LENGTH_MAX, "%s_packets", d->name?d->name:d->id);
378
370 - if(unlikely(!d->st_packets)) {
371 - char id[RRD_ID_LENGTH_MAX + 1];
379 + d->st_packets = rrdset_create(RRD_TYPE_TC, id, name, d->family?d->family:d->id, RRD_TYPE_TC ".qos_packets", "Class Packets", "packets/s", 7010, rrd_update_every, d->enabled_all_classes_qdiscs ? RRDSET_TYPE_LINE : RRDSET_TYPE_STACKED);
380 + }
381 + else {
382 + rrdset_next(d->st_packets);
383 +
384 + if(unlikely(d->name_updated)) {
385 char name[RRD_ID_LENGTH_MAX + 1];
373 - snprintfz(id, RRD_ID_LENGTH_MAX, "%s_packets", d->id);
386 snprintfz(name, RRD_ID_LENGTH_MAX, "%s_packets", d->name?d->name:d->id);
375 -
376 - d->st_packets = rrdset_find_bytype(RRD_TYPE_TC, id);
377 - if(unlikely(!d->st_packets)) {
378 - debug(D_TC_LOOP, "TC: Creating new _packets chart for device '%s'", d->name?d->name:d->id);
379 - d->st_packets = rrdset_create(RRD_TYPE_TC, id, name, d->family?d->family:d->id, RRD_TYPE_TC ".qos_packets", "Class Packets", "packets/s", 7010, rrd_update_every, d->enabled_all_classes_qdiscs ? RRDSET_TYPE_LINE : RRDSET_TYPE_STACKED);
380 - }
387 + rrdset_set_name(d->st_packets, name);
388 }
382 - else {
383 - debug(D_TC_LOOP, "TC: Updating _packets chart for device '%s'", d->name?d->name:d->id);
384 - rrdset_next(d->st_packets);
389
386 - // FIXME
387 - // update the family
388 - }
390 + // FIXME
391 + // update the family
392 + }
393
390 - for(c = d->classes ; c ; c = c->next) {
391 - if(unlikely(!c->updated)) continue;
394 + for(c = d->classes ; c ; c = c->next) {
395 + if(unlikely(!c->render)) continue;
396
393 - if((c->isleaf && c->hasparent && !c->isqdisc) || d->enabled_all_classes_qdiscs) {
394 - if(unlikely(!c->rd_packets)) {
395 - c->rd_packets = rrddim_find(d->st_packets, c->id);
396 - if(unlikely(!c->rd_packets)) {
397 - debug(D_TC_LOOP, "TC: Adding to chart '%s', dimension '%s' (name: '%s')", d->st_packets->id, c->id, c->name);
397 + if(unlikely(!c->rd_packets))
398 + c->rd_packets = rrddim_add(d->st_packets, c->id, c->name?c->name:c->id, 1, 1, RRDDIM_INCREMENTAL);
399 + else if(unlikely(c->name_updated))
400 + rrddim_set_name(d->st_packets, c->rd_packets, c->name);
401
399 - // new class, we have to add it
400 - c->rd_packets = rrddim_add(d->st_packets, c->id, c->name?c->name:c->id, 1, 1, RRDDIM_INCREMENTAL);
401 - }
402 - else debug(D_TC_LOOP, "TC: Updating chart '%s', dimension '%s'", d->st_packets->id, c->id);
403 - }
402 + rrddim_set_by_pointer(d->st_packets, c->rd_packets, c->packets);
403 + }
404 + rrdset_done(d->st_packets);
405 + }
406
405 - rrddim_set_by_pointer(d->st_packets, c->rd_packets, c->packets);
407 + // --------------------------------------------------------------------
408 + // dropped
409
407 - // if it has a name, different to the id
408 - if(unlikely(c->name_updated && c->name && strcmp(c->id, c->name) != 0)) {
409 - // update the rrd dimension with the new name
410 - debug(D_TC_LOOP, "TC: Setting chart '%s', dimension '%s' name to '%s'", d->st_packets->id, c->rd_packets->id, c->name);
411 - rrddim_set_name(d->st_packets, c->rd_packets, c->name);
412 - }
413 - }
414 - }
415 - rrdset_done(d->st_packets);
410 + if(d->enabled_dropped == CONFIG_ONDEMAND_YES || (d->enabled_dropped == CONFIG_ONDEMAND_ONDEMAND && dropped_sum)) {
411 + d->enabled_dropped = CONFIG_ONDEMAND_YES;
412 +
413 + if(unlikely(!d->st_dropped)) {
414 + char id[RRD_ID_LENGTH_MAX + 1];
415 + char name[RRD_ID_LENGTH_MAX + 1];
416 + snprintfz(id, RRD_ID_LENGTH_MAX, "%s_dropped", d->id);
417 + snprintfz(name, RRD_ID_LENGTH_MAX, "%s_dropped", d->name?d->name:d->id);
418 +
419 + d->st_dropped = rrdset_create(RRD_TYPE_TC, id, name, d->family?d->family:d->id, RRD_TYPE_TC ".qos_dropped", "Class Dropped Packets", "packets/s", 7020, rrd_update_every, d->enabled_all_classes_qdiscs ? RRDSET_TYPE_LINE : RRDSET_TYPE_STACKED);
420 }
421 + else {
422 + rrdset_next(d->st_dropped);
423
418 - // --------------------------------------------------------------------
419 - // dropped
420 -
421 - if(d->enabled_dropped == CONFIG_ONDEMAND_YES || (d->enabled_dropped == CONFIG_ONDEMAND_ONDEMAND && dropped_sum)) {
422 - d->enabled_dropped = CONFIG_ONDEMAND_YES;
423 -
424 - if(unlikely(!d->st_dropped)) {
425 - char id[RRD_ID_LENGTH_MAX + 1];
424 + if(unlikely(d->name_updated)) {
425 char name[RRD_ID_LENGTH_MAX + 1];
427 - snprintfz(id, RRD_ID_LENGTH_MAX, "%s_dropped", d->id);
426 snprintfz(name, RRD_ID_LENGTH_MAX, "%s_dropped", d->name?d->name:d->id);
429 -
430 - d->st_dropped = rrdset_find_bytype(RRD_TYPE_TC, id);
431 - if(unlikely(!d->st_dropped)) {
432 - debug(D_TC_LOOP, "TC: Creating new _dropped chart for device '%s'", d->name?d->name:d->id);
433 - d->st_dropped = rrdset_create(RRD_TYPE_TC, id, name, d->family?d->family:d->id, RRD_TYPE_TC ".qos_dropped", "Class Dropped Packets", "packets/s", 7020, rrd_update_every, d->enabled_all_classes_qdiscs ? RRDSET_TYPE_LINE : RRDSET_TYPE_STACKED);
434 - }
427 + rrdset_set_name(d->st_dropped, name);
428 }
436 - else {
437 - debug(D_TC_LOOP, "TC: Updating _dropped chart for device '%s'", d->name?d->name:d->id);
438 - rrdset_next(d->st_dropped);
429
440 - // FIXME
441 - // update the family
442 - }
430 + // FIXME
431 + // update the family
432 + }
433
444 - for(c = d->classes ; c ; c = c->next) {
445 - if(unlikely(!c->updated)) continue;
434 + for(c = d->classes ; c ; c = c->next) {
435 + if(unlikely(!c->render)) continue;
436
447 - if((c->isleaf && c->hasparent && !c->isqdisc) || d->enabled_all_classes_qdiscs) {
448 - if(unlikely(!c->rd_dropped)) {
449 - c->rd_dropped = rrddim_find(d->st_dropped, c->id);
450 - if(unlikely(!c->rd_dropped)) {
451 - debug(D_TC_LOOP, "TC: Adding to chart '%s', dimension '%s' (name: '%s')", d->st_dropped->id, c->id, c->name);
437 + if(unlikely(!c->rd_dropped))
438 + c->rd_dropped = rrddim_add(d->st_dropped, c->id, c->name?c->name:c->id, 1, 1, RRDDIM_INCREMENTAL);
439 + else if(unlikely(c->name_updated))
440 + rrddim_set_name(d->st_dropped, c->rd_dropped, c->name);
441
453 - // new class, we have to add it
454 - c->rd_dropped = rrddim_add(d->st_dropped, c->id, c->name?c->name:c->id, 1, 1, RRDDIM_INCREMENTAL);
455 - }
456 - else debug(D_TC_LOOP, "TC: Updating chart '%s', dimension '%s'", d->st_dropped->id, c->id);
457 - }
442 + rrddim_set_by_pointer(d->st_dropped, c->rd_dropped, c->dropped);
443 + }
444 + rrdset_done(d->st_dropped);
445 + }
446
459 - rrddim_set_by_pointer(d->st_dropped, c->rd_dropped, c->dropped);
447 + // --------------------------------------------------------------------
448 + // tokens
449
461 - // if it has a name, different to the id
462 - if(unlikely(c->name_updated && c->name && strcmp(c->id, c->name) != 0)) {
463 - // update the rrd dimension with the new name
464 - debug(D_TC_LOOP, "TC: Setting chart '%s', dimension '%s' name to '%s'", d->st_dropped->id, c->rd_dropped->id, c->name);
465 - rrddim_set_name(d->st_dropped, c->rd_dropped, c->name);
466 - }
467 - }
468 - }
469 - rrdset_done(d->st_dropped);
450 + if(d->enabled_tokens == CONFIG_ONDEMAND_YES || (d->enabled_tokens == CONFIG_ONDEMAND_ONDEMAND && tokens_sum)) {
451 + d->enabled_tokens = CONFIG_ONDEMAND_YES;
452 +
453 + if(unlikely(!d->st_tokens)) {
454 + char id[RRD_ID_LENGTH_MAX + 1];
455 + char name[RRD_ID_LENGTH_MAX + 1];
456 + snprintfz(id, RRD_ID_LENGTH_MAX, "%s_tokens", d->id);
457 + snprintfz(name, RRD_ID_LENGTH_MAX, "%s_tokens", d->name?d->name:d->id);
458 +
459 + d->st_tokens = rrdset_create(RRD_TYPE_TC, id, name, d->family?d->family:d->id, RRD_TYPE_TC ".qos_tokens", "Class Tokens", "tokens", 7030, rrd_update_every, RRDSET_TYPE_LINE);
460 }
461 + else {
462 + rrdset_next(d->st_tokens);
463
472 - // --------------------------------------------------------------------
473 - // tokens
474 -
475 - if(d->enabled_tokens == CONFIG_ONDEMAND_YES || (d->enabled_tokens == CONFIG_ONDEMAND_ONDEMAND && tokens_sum)) {
476 - d->enabled_tokens = CONFIG_ONDEMAND_YES;
477 -
478 - if(unlikely(!d->st_tokens)) {
479 - char id[RRD_ID_LENGTH_MAX + 1];
464 + if(unlikely(d->name_updated)) {
465 char name[RRD_ID_LENGTH_MAX + 1];
481 - snprintfz(id, RRD_ID_LENGTH_MAX, "%s_tokens", d->id);
466 snprintfz(name, RRD_ID_LENGTH_MAX, "%s_tokens", d->name?d->name:d->id);
483 -
484 - d->st_tokens = rrdset_find_bytype(RRD_TYPE_TC, id);
485 - if(unlikely(!d->st_tokens)) {
486 - debug(D_TC_LOOP, "TC: Creating new _tokens chart for device '%s'", d->name?d->name:d->id);
487 - d->st_tokens = rrdset_create(RRD_TYPE_TC, id, name, d->family?d->family:d->id, RRD_TYPE_TC ".qos_tokens", "Class Tokens", "tokens", 7030, rrd_update_every, RRDSET_TYPE_LINE);
488 - }
467 + rrdset_set_name(d->st_tokens, name);
468 }
490 - else {
491 - debug(D_TC_LOOP, "TC: Updating _tokens chart for device '%s'", d->name?d->name:d->id);
492 - rrdset_next(d->st_tokens);
469
494 - // FIXME
495 - // update the family
470 + // FIXME
471 + // update the family
472 + }
473 +
474 + for(c = d->classes ; c ; c = c->next) {
475 + if(unlikely(!c->render)) continue;
476 +
477 + if(unlikely(!c->rd_tokens)) {
478 + c->rd_tokens = rrddim_add(d->st_tokens, c->id, c->name?c->name:c->id, 1, 1, RRDDIM_ABSOLUTE);
479 }
480 + else if(unlikely(c->name_updated))
481 + rrddim_set_name(d->st_tokens, c->rd_tokens, c->name);
482
498 - for(c = d->classes ; c ; c = c->next) {
499 - if(unlikely(!c->updated)) continue;
483 + rrddim_set_by_pointer(d->st_tokens, c->rd_tokens, c->tokens);
484 + }
485 + rrdset_done(d->st_tokens);
486 + }
487
501 - if((c->isleaf && c->hasparent && !c->isqdisc) || d->enabled_all_classes_qdiscs) {
502 - if(unlikely(!c->rd_tokens)) {
503 - c->rd_tokens = rrddim_find(d->st_tokens, c->id);
504 - if(unlikely(!c->rd_tokens)) {
505 - debug(D_TC_LOOP, "TC: Adding to chart '%s', dimension '%s' (name: '%s')", d->st_tokens->id, c->id, c->name);
488 + // --------------------------------------------------------------------
489 + // ctokens
490
507 - // new class, we have to add it
508 - c->rd_tokens = rrddim_add(d->st_tokens, c->id, c->name?c->name:c->id, 1, 1, RRDDIM_ABSOLUTE);
509 - }
510 - else debug(D_TC_LOOP, "TC: Updating chart '%s', dimension '%s'", d->st_tokens->id, c->id);
511 - }
491 + if(d->enabled_ctokens == CONFIG_ONDEMAND_YES || (d->enabled_ctokens == CONFIG_ONDEMAND_ONDEMAND && ctokens_sum)) {
492 + d->enabled_ctokens = CONFIG_ONDEMAND_YES;
493
513 - rrddim_set_by_pointer(d->st_tokens, c->rd_tokens, c->tokens);
494 + if(unlikely(!d->st_ctokens)) {
495 + char id[RRD_ID_LENGTH_MAX + 1];
496 + char name[RRD_ID_LENGTH_MAX + 1];
497 + snprintfz(id, RRD_ID_LENGTH_MAX, "%s_ctokens", d->id);
498 + snprintfz(name, RRD_ID_LENGTH_MAX, "%s_ctokens", d->name?d->name:d->id);
499
515 - // if it has a name, different to the id
516 - if(unlikely(c->name_updated && c->name && strcmp(c->id, c->name) != 0)) {
517 - // update the rrd dimension with the new name
518 - debug(D_TC_LOOP, "TC: Setting chart '%s', dimension '%s' name to '%s'", d->st_tokens->id, c->rd_tokens->id, c->name);
519 - rrddim_set_name(d->st_tokens, c->rd_tokens, c->name);
520 - }
521 - }
522 - }
523 - rrdset_done(d->st_tokens);
500 + d->st_ctokens = rrdset_create(RRD_TYPE_TC, id, name, d->family?d->family:d->id, RRD_TYPE_TC ".qos_ctokens", "Class cTokens", "ctokens", 7040, rrd_update_every, RRDSET_TYPE_LINE);
501 }
502 + else {
503 + debug(D_TC_LOOP, "TC: Updating _ctokens chart for device '%s'", d->name?d->name:d->id);
504 + rrdset_next(d->st_ctokens);
505
526 - // --------------------------------------------------------------------
527 - // ctokens
528 -
529 - if(d->enabled_ctokens == CONFIG_ONDEMAND_YES || (d->enabled_ctokens == CONFIG_ONDEMAND_ONDEMAND && ctokens_sum)) {
530 - d->enabled_ctokens = CONFIG_ONDEMAND_YES;
531 -
532 - if(unlikely(!d->st_ctokens)) {
533 - char id[RRD_ID_LENGTH_MAX + 1];
506 + if(unlikely(d->name_updated)) {
507 char name[RRD_ID_LENGTH_MAX + 1];
535 - snprintfz(id, RRD_ID_LENGTH_MAX, "%s_ctokens", d->id);
508 snprintfz(name, RRD_ID_LENGTH_MAX, "%s_ctokens", d->name?d->name:d->id);
537 -
538 - d->st_ctokens = rrdset_find_bytype(RRD_TYPE_TC, id);
539 - if(unlikely(!d->st_ctokens)) {
540 - debug(D_TC_LOOP, "TC: Creating new _ctokens chart for device '%s'", d->name?d->name:d->id);
541 - d->st_ctokens = rrdset_create(RRD_TYPE_TC, id, name, d->family?d->family:d->id, RRD_TYPE_TC ".qos_ctokens", "Class cTokens", "ctokens", 7040, rrd_update_every, RRDSET_TYPE_LINE);
542 - }
543 - }
544 - else {
545 - debug(D_TC_LOOP, "TC: Updating _ctokens chart for device '%s'", d->name?d->name:d->id);
546 - rrdset_next(d->st_ctokens);
547 -
548 - // FIXME
549 - // update the family
509 + rrdset_set_name(d->st_ctokens, name);
510 }
511
552 - for(c = d->classes ; c ; c = c->next) {
553 - if(unlikely(!c->updated)) continue;
554 -
555 - if((c->isleaf && c->hasparent && !c->isqdisc) || d->enabled_all_classes_qdiscs) {
556 - if(unlikely(!c->rd_ctokens)) {
557 - c->rd_ctokens = rrddim_find(d->st_ctokens, c->id);
558 - if(unlikely(!c->rd_ctokens)) {
559 - debug(D_TC_LOOP, "TC: Adding to chart '%s', dimension '%s' (name: '%s')", d->st_ctokens->id, c->id, c->name);
512 + // FIXME
513 + // update the family
514 + }
515
561 - // new class, we have to add it
562 - c->rd_ctokens = rrddim_add(d->st_ctokens, c->id, c->name?c->name:c->id, 1, 1, RRDDIM_ABSOLUTE);
563 - }
564 - else debug(D_TC_LOOP, "TC: Updating chart '%s', dimension '%s'", d->st_ctokens->id, c->id);
565 - }
516 + for(c = d->classes ; c ; c = c->next) {
517 + if(unlikely(!c->render)) continue;
518
567 - rrddim_set_by_pointer(d->st_ctokens, c->rd_ctokens, c->ctokens);
519 + if(unlikely(!c->rd_ctokens))
520 + c->rd_ctokens = rrddim_add(d->st_ctokens, c->id, c->name?c->name:c->id, 1, 1, RRDDIM_ABSOLUTE);
521 + else if(unlikely(c->name_updated))
522 + rrddim_set_name(d->st_ctokens, c->rd_ctokens, c->name);
523
569 - // if it has a name, different to the id
570 - if(unlikely(c->name_updated && c->name && strcmp(c->id, c->name) != 0)) {
571 - // update the rrd dimension with the new name
572 - debug(D_TC_LOOP, "TC: Setting chart '%s', dimension '%s' name to '%s'", d->st_ctokens->id, c->rd_ctokens->id, c->name);
573 - rrddim_set_name(d->st_ctokens, c->rd_ctokens, c->name);
574 - }
575 - }
576 - }
577 - rrdset_done(d->st_ctokens);
524 + rrddim_set_by_pointer(d->st_ctokens, c->rd_ctokens, c->ctokens);
525 }
526 + rrdset_done(d->st_ctokens);
527 }
528
529 tc_device_classes_cleanup(d);
530 }
531
584 -static inline void tc_device_set_class_name(struct tc_device *d, char *id, char *name)
585 -{
532 +static inline void tc_device_set_class_name(struct tc_device *d, char *id, char *name) {
533 + if(unlikely(!name || !*name)) return;
534 +
535 struct tc_class *c = tc_class_index_find(d, id, 0);
536 if(likely(c)) {
588 - freez(c->name);
589 - c->name = NULL;
537 + if(likely(c->name)) {
538 + if(!strcmp(c->name, name)) return;
539 + freez(c->name);
540 + c->name = NULL;
541 + }
542
543 if(likely(name && *name && strcmp(c->id, name) != 0)) {
544 debug(D_TC_LOOP, "TC: Setting device '%s', class '%s' name to '%s'", d->id, id, name);
@@ -597,10 +549,15 @@ static inline void tc_device_set_class_name(struct tc_device *d, char *id, char
549 }
550
551 static inline void tc_device_set_device_name(struct tc_device *d, char *name) {
600 - freez(d->name);
601 - d->name = NULL;
552 + if(unlikely(!name || !*name)) return;
553
603 - if(likely(name && *name && strcmp(d->id, name) != 0)) {
554 + if(d->name) {
555 + if(!strcmp(d->name, name)) return;
556 + freez(d->name);
557 + d->name = NULL;
558 + }
559 +
560 + if(likely(name && *name && strcmp(d->id, name))) {
561 debug(D_TC_LOOP, "TC: Setting device '%s' name to '%s'", d->id, name);
562 d->name = strdupz(name);
563 d->name_updated = 1;
@@ -846,9 +803,9 @@ void *tc_main(void *ptr) {
803 char *leafid = words[6]; // leafid
804 char qdisc = 0;
805
849 - if(first_hash == QDISC_HASH) {
806 + if(first_hash == QDISC_HASH)
807 qdisc = 1;
851 - }
808 +
809 if(strcmp(parent, "root") == 0) {
810 parentid = NULL;
811 leafid = NULL;
src/rrd.c
+1 -1
@@ -485,7 +485,7 @@ RRDSET *rrdset_create(const char *type, const char *id, const char *name, const
485
486 RRDSET *st = rrdset_find(fullid);
487 if(st) {
488 - error("Cannot create rrd stats for '%s', it already exists.", fullid);
488 + debug(D_RRD_CALLS, "RRDSET '%s', already exists.", fullid);
489 return st;
490 }
491