@cryptotaxi247 / netdata-1 / commits / fef856c44

fixed an unterminated buffer at registry.c; lowered the memory requirements of interrupts and softirqs

Costa Tsaousis committed May 12, 2016 at 23:43 UTC fef856c441ce468ac7dbe3fbc8fac31b97a5dde7
4 files changed +59 -44
src/main.c
-1
@@ -530,7 +530,6 @@ int main(int argc, char **argv)
530
531 registry_init();
532
533 -
533 // ------------------------------------------------------------------------
534 // spawn the threads
535
src/proc_interrupts.c
+27 -21
@@ -13,29 +13,34 @@
13 #include "plugin_proc.h"
14 #include "log.h"
15
16 -#define MAX_INTERRUPTS 256
17 -#define MAX_INTERRUPT_CPUS 256
16 #define MAX_INTERRUPT_NAME 50
17
18 struct interrupt {
19 int used;
20 char *id;
21 char name[MAX_INTERRUPT_NAME + 1];
24 - unsigned long long value[MAX_INTERRUPT_CPUS];
22 unsigned long long total;
23 + unsigned long long value[];
24 };
25
28 -static struct interrupt *alloc_interrupts(int lines) {
26 +// since each interrupt is variable in size
27 +// we use this to calculate its record size
28 +#define recordsize(cpus) (sizeof(struct interrupt) + (cpus * sizeof(unsigned long long)))
29 +
30 +// given a base, get a pointer to each record
31 +#define irrindex(base, line, cpus) ((struct interrupt *)&((char *)(base))[line * recordsize(cpus)])
32 +
33 +static inline struct interrupt *get_interrupts_array(int lines, int cpus) {
34 static struct interrupt *irrs = NULL;
30 - static int alloced = 0;
35 + static int allocated = 0;
36
32 - if(lines < alloced) return irrs;
37 + if(lines < allocated) return irrs;
38 else {
34 - irrs = (struct interrupt *)realloc(irrs, lines * sizeof(struct interrupt));
39 + irrs = (struct interrupt *)realloc(irrs, lines * recordsize(cpus));
40 if(!irrs)
41 fatal("Cannot allocate memory for %d interrupts", lines);
42
38 - alloced = lines;
43 + allocated = lines;
44 }
45
46 return irrs;
@@ -44,7 +49,6 @@ static struct interrupt *alloc_interrupts(int lines) {
49 int do_proc_interrupts(int update_every, unsigned long long dt) {
50 static procfile *ff = NULL;
51 static int cpus = -1, do_per_core = -1;
47 -
52 struct interrupt *irrs = NULL;
53
54 if(dt) {};
@@ -76,8 +80,6 @@ int do_proc_interrupts(int update_every, unsigned long long dt) {
80 if(strncmp(procfile_lineword(ff, 0, w), "CPU", 3) == 0)
81 cpus++;
82 }
79 -
80 - if(cpus > MAX_INTERRUPT_CPUS) cpus = MAX_INTERRUPT_CPUS;
83 }
84
85 if(!cpus) {
@@ -86,12 +88,12 @@ int do_proc_interrupts(int update_every, unsigned long long dt) {
88 }
89
90 // allocate the size we need;
89 - irrs = alloc_interrupts(lines);
91 + irrs = get_interrupts_array(lines, cpus);
92 irrs[0].used = 0;
93
94 // loop through all lines
95 for(l = 1; l < lines ;l++) {
94 - struct interrupt *irr = &irrs[l];
96 + struct interrupt *irr = irrindex(irrs, l, cpus);
97 irr->used = 0;
98 irr->total = 0;
99
@@ -142,15 +144,17 @@ int do_proc_interrupts(int update_every, unsigned long long dt) {
144 st = rrdset_create("system", "interrupts", NULL, "interrupts", NULL, "System interrupts", "interrupts/s", 1000, update_every, RRDSET_TYPE_STACKED);
145
146 for(l = 0; l < lines ;l++) {
145 - if(!irrs[l].used) continue;
146 - rrddim_add(st, irrs[l].id, irrs[l].name, 1, 1, RRDDIM_INCREMENTAL);
147 + struct interrupt *irr = irrindex(irrs, l, cpus);
148 + if(!irr->used) continue;
149 + rrddim_add(st, irr->id, irr->name, 1, 1, RRDDIM_INCREMENTAL);
150 }
151 }
152 else rrdset_next(st);
153
154 for(l = 0; l < lines ;l++) {
152 - if(!irrs[l].used) continue;
153 - rrddim_set(st, irrs[l].id, irrs[l].total);
155 + struct interrupt *irr = irrindex(irrs, l, cpus);
156 + if(!irr->used) continue;
157 + rrddim_set(st, irr->id, irr->total);
158 }
159 rrdset_done(st);
160
@@ -169,15 +173,17 @@ int do_proc_interrupts(int update_every, unsigned long long dt) {
173 st = rrdset_create("cpu", id, name, "interrupts", "cpu.interrupts", title, "interrupts/s", 2000 + c, update_every, RRDSET_TYPE_STACKED);
174
175 for(l = 0; l < lines ;l++) {
172 - if(!irrs[l].used) continue;
173 - rrddim_add(st, irrs[l].id, irrs[l].name, 1, 1, RRDDIM_INCREMENTAL);
176 + struct interrupt *irr = irrindex(irrs, l, cpus);
177 + if(!irr->used) continue;
178 + rrddim_add(st, irr->id, irr->name, 1, 1, RRDDIM_INCREMENTAL);
179 }
180 }
181 else rrdset_next(st);
182
183 for(l = 0; l < lines ;l++) {
179 - if(!irrs[l].used) continue;
180 - rrddim_set(st, irrs[l].id, irrs[l].value[c]);
184 + struct interrupt *irr = irrindex(irrs, l, cpus);
185 + if(!irr->used) continue;
186 + rrddim_set(st, irr->id, irr->value[c]);
187 }
188 rrdset_done(st);
189 }
src/proc_softirqs.c
+30 -22
@@ -13,29 +13,34 @@
13 #include "plugin_proc.h"
14 #include "log.h"
15
16 -#define MAX_INTERRUPTS 256
17 -#define MAX_INTERRUPT_CPUS 256
16 #define MAX_INTERRUPT_NAME 50
17
18 struct interrupt {
19 int used;
20 char *id;
21 char name[MAX_INTERRUPT_NAME + 1];
24 - unsigned long long value[MAX_INTERRUPT_CPUS];
22 unsigned long long total;
23 + unsigned long long value[];
24 };
25
28 -static struct interrupt *alloc_interrupts(int lines) {
26 +// since each interrupt is variable in size
27 +// we use this to calculate its record size
28 +#define recordsize(cpus) (sizeof(struct interrupt) + (cpus * sizeof(unsigned long long)))
29 +
30 +// given a base, get a pointer to each record
31 +#define irrindex(base, line, cpus) ((struct interrupt *)&((char *)(base))[line * recordsize(cpus)])
32 +
33 +static inline struct interrupt *get_interrupts_array(int lines, int cpus) {
34 static struct interrupt *irrs = NULL;
30 - static int alloced = 0;
35 + static int allocated = 0;
36
32 - if(lines < alloced) return irrs;
37 + if(lines < allocated) return irrs;
38 else {
34 - irrs = (struct interrupt *)realloc(irrs, lines * sizeof(struct interrupt));
39 + irrs = (struct interrupt *)realloc(irrs, lines * recordsize(cpus));
40 if(!irrs)
41 fatal("Cannot allocate memory for %d interrupts", lines);
42
38 - alloced = lines;
43 + allocated = lines;
44 }
45
46 return irrs;
@@ -76,8 +81,6 @@ int do_proc_softirqs(int update_every, unsigned long long dt) {
81 if(strncmp(procfile_lineword(ff, 0, w), "CPU", 3) == 0)
82 cpus++;
83 }
79 -
80 - if(cpus > MAX_INTERRUPT_CPUS) cpus = MAX_INTERRUPT_CPUS;
84 }
85
86 if(!cpus) {
@@ -86,12 +89,12 @@ int do_proc_softirqs(int update_every, unsigned long long dt) {
89 }
90
91 // allocate the size we need;
89 - irrs = alloc_interrupts(lines);
92 + irrs = get_interrupts_array(lines, cpus);
93 irrs[0].used = 0;
94
95 // loop through all lines
96 for(l = 1; l < lines ;l++) {
94 - struct interrupt *irr = &irrs[l];
97 + struct interrupt *irr = irrindex(irrs, l, cpus);
98 irr->used = 0;
99 irr->total = 0;
100
@@ -130,15 +133,17 @@ int do_proc_softirqs(int update_every, unsigned long long dt) {
133 st = rrdset_create("system", "softirqs", NULL, "softirqs", NULL, "System softirqs", "softirqs/s", 950, update_every, RRDSET_TYPE_STACKED);
134
135 for(l = 0; l < lines ;l++) {
133 - if(!irrs[l].used) continue;
134 - rrddim_add(st, irrs[l].id, irrs[l].name, 1, 1, RRDDIM_INCREMENTAL);
136 + struct interrupt *irr = irrindex(irrs, l, cpus);
137 + if(!irr->used) continue;
138 + rrddim_add(st, irr->id, irr->name, 1, 1, RRDDIM_INCREMENTAL);
139 }
140 }
141 else rrdset_next(st);
142
143 for(l = 0; l < lines ;l++) {
140 - if(!irrs[l].used) continue;
141 - rrddim_set(st, irrs[l].id, irrs[l].total);
144 + struct interrupt *irr = irrindex(irrs, l, cpus);
145 + if(!irr->used) continue;
146 + rrddim_set(st, irr->id, irr->total);
147 }
148 rrdset_done(st);
149
@@ -154,8 +159,9 @@ int do_proc_softirqs(int update_every, unsigned long long dt) {
159 // find if everything is zero
160 unsigned long long core_sum = 0 ;
161 for(l = 0; l < lines ;l++) {
157 - if(!irrs[l].used) continue;
158 - core_sum += irrs[l].value[c];
162 + struct interrupt *irr = irrindex(irrs, l, cpus);
163 + if(!irr->used) continue;
164 + core_sum += irr->value[c];
165 }
166 if(core_sum == 0) continue; // try next core
167
@@ -165,15 +171,17 @@ int do_proc_softirqs(int update_every, unsigned long long dt) {
171 st = rrdset_create("cpu", id, name, "softirqs", "cpu.softirqs", title, "softirqs/s", 3000 + c, update_every, RRDSET_TYPE_STACKED);
172
173 for(l = 0; l < lines ;l++) {
168 - if(!irrs[l].used) continue;
169 - rrddim_add(st, irrs[l].id, irrs[l].name, 1, 1, RRDDIM_INCREMENTAL);
174 + struct interrupt *irr = irrindex(irrs, l, cpus);
175 + if(!irr->used) continue;
176 + rrddim_add(st, irr->id, irr->name, 1, 1, RRDDIM_INCREMENTAL);
177 }
178 }
179 else rrdset_next(st);
180
181 for(l = 0; l < lines ;l++) {
175 - if(!irrs[l].used) continue;
176 - rrddim_set(st, irrs[l].id, irrs[l].value[c]);
182 + struct interrupt *irr = irrindex(irrs, l, cpus);
183 + if(!irr->used) continue;
184 + rrddim_set(st, irr->id, irr->value[c]);
185 }
186 rrdset_done(st);
187 }
src/registry.c
+2
@@ -425,6 +425,7 @@ static inline MACHINE *registry_machine_allocate(const char *machine_guid, time_
425 if(!m) fatal("Registry: cannot allocate memory for new machine '%s'", machine_guid);
426
427 strncpy(m->guid, machine_guid, 36);
428 + m->guid[36] = '\0';
429
430 debug(D_REGISTRY, "Registry: registry_machine_allocate('%s'): creating dictionary of urls", machine_guid);
431 m->urls = dictionary_create(DICTIONARY_FLAGS);
@@ -1435,6 +1436,7 @@ static inline size_t registry_load(void) {
1436 }
1437
1438 size_t len = 0;
1439 + buf[4096] = '\0';
1440 while((s = fgets_trim_len(buf, 4096, fp, &len))) {
1441 line++;
1442