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