1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
#define NETDATA_HEALTH_INTERNALS
#include "common.h"
// ----------------------------------------------------------------------------
// RRDSETVAR management
// CHART VARIABLES
static inline void rrdsetvar_free_variables(RRDSETVAR *rs) {
RRDSET *st = rs->rrdset;
// CHART
rrdvar_free(st->rrdhost, &st->variables_root_index, rs->var_local);
rs->var_local = NULL;
// FAMILY
rrdvar_free(st->rrdhost, &st->rrdfamily->variables_root_index, rs->var_family);
rs->var_family = NULL;
rrdvar_free(st->rrdhost, &st->rrdhost->variables_root_index, rs->var_host);
rs->var_host = NULL;
// HOST
rrdvar_free(st->rrdhost, &st->rrdfamily->variables_root_index, rs->var_family_name);
rs->var_family_name = NULL;
rrdvar_free(st->rrdhost, &st->rrdhost->variables_root_index, rs->var_host_name);
rs->var_host_name = NULL;
// KEYS
freez(rs->key_fullid);
rs->key_fullid = NULL;
freez(rs->key_fullname);
rs->key_fullname = NULL;
}
static inline void rrdsetvar_create_variables(RRDSETVAR *rs) {
rrdsetvar_free_variables(rs);
RRDSET *st = rs->rrdset;
// KEYS
char buffer[RRDVAR_MAX_LENGTH + 1];
snprintfz(buffer, RRDVAR_MAX_LENGTH, "%s.%s", st->id, rs->variable);
rs->key_fullid = strdupz(buffer);
snprintfz(buffer, RRDVAR_MAX_LENGTH, "%s.%s", st->name, rs->variable);
rs->key_fullname = strdupz(buffer);
// CHART
rs->var_local = rrdvar_create_and_index("local", &st->variables_root_index, rs->variable, rs->type, rs->value);
// FAMILY
rs->var_family = rrdvar_create_and_index("family", &st->rrdfamily->variables_root_index, rs->key_fullid, rs->type, rs->value);
rs->var_family_name = rrdvar_create_and_index("family", &st->rrdfamily->variables_root_index, rs->key_fullname, rs->type, rs->value);
// HOST
rs->var_host = rrdvar_create_and_index("host", &st->rrdhost->variables_root_index, rs->key_fullid, rs->type, rs->value);
rs->var_host_name = rrdvar_create_and_index("host", &st->rrdhost->variables_root_index, rs->key_fullname, rs->type, rs->value);
}
RRDSETVAR *rrdsetvar_create(RRDSET *st, const char *variable, int type, void *value, uint32_t options) {
debug(D_VARIABLES, "RRDVARSET create for chart id '%s' name '%s' with variable name '%s'", st->id, st->name, variable);
RRDSETVAR *rs = (RRDSETVAR *)callocz(1, sizeof(RRDSETVAR));
rs->variable = strdupz(variable);
rs->type = type;
rs->value = value;
rs->options = options;
rs->rrdset = st;
rs->next = st->variables;
st->variables = rs;
rrdsetvar_create_variables(rs);
return rs;
}
void rrdsetvar_rename_all(RRDSET *st) {
debug(D_VARIABLES, "RRDSETVAR rename for chart id '%s' name '%s'", st->id, st->name);
RRDSETVAR *rs, *next = st->variables;
while((rs = next)) {
next = rs->next;
rrdsetvar_create_variables(rs);
}
rrdsetcalc_link_matching(st);
}
void rrdsetvar_free(RRDSETVAR *rs) {
RRDSET *st = rs->rrdset;
debug(D_VARIABLES, "RRDSETVAR free for chart id '%s' name '%s', variable '%s'", st->id, st->name, rs->variable);
if(st->variables == rs) {
st->variables = rs->next;
}
else {
RRDSETVAR *t;
for (t = st->variables; t && t->next != rs; t = t->next);
if(!t) error("RRDSETVAR '%s' not found in chart '%s' variables linked list", rs->key_fullname, st->id);
else t->next = rs->next;
}
rrdsetvar_free_variables(rs);
freez(rs->variable);
freez(rs);
}
|