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