@cryptotaxi247 / netdata-1 / commits / 0444aa8ff

nfacct plugin with static dimension pointers

Costa Tsaousis (ktsaou) committed Mar 17, 2017 at 00:43 UTC 0444aa8ff91dce4d4ab5971187944ed894b550e2
1 file changed +40 -20
src/plugin_nfacct.c
+40 -20
@@ -6,6 +6,8 @@
6
7 struct mynfacct {
8 const char *name;
9 + uint32_t hash;
10 +
11 uint64_t pkts;
12 uint64_t bytes;
13
@@ -13,8 +15,6 @@ struct mynfacct {
15 RRDDIM *rd_packets;
16
17 int updated;
16 -
17 - struct nfacct *nfacct;
18 };
19
20 struct nfacct_list {
@@ -23,9 +23,7 @@ struct nfacct_list {
23 struct mynfacct data[];
24 } *nfacct_list = NULL;
25
26 -static int nfacct_callback(const struct nlmsghdr *nlh, void *data) {
27 - (void)data;
28 -
26 +static inline void nfacct_list_grow() {
27 if(!nfacct_list || nfacct_list->len == nfacct_list->size) {
28 int size = (nfacct_list) ? nfacct_list->size : 0;
29 int len = (nfacct_list) ? nfacct_list->len : 0;
@@ -35,14 +33,6 @@ static int nfacct_callback(const struct nlmsghdr *nlh, void *data) {
33
34 nfacct_list = reallocz(nfacct_list, sizeof(struct nfacct_list) + (sizeof(struct mynfacct) * size));
35
38 - nfacct_list->data[len].nfacct = nfacct_alloc();
39 - if(!nfacct_list->data[len].nfacct) {
40 - error("nfacct.plugin: nfacct_alloc() failed.");
41 - free(nfacct_list);
42 - nfacct_list = NULL;
43 - return MNL_CB_OK;
44 - }
45 -
36 nfacct_list->data[len].rd_bytes = NULL;
37 nfacct_list->data[len].rd_packets = NULL;
38 nfacct_list->data[len].updated = 0;
@@ -50,16 +40,48 @@ static int nfacct_callback(const struct nlmsghdr *nlh, void *data) {
40 nfacct_list->size = size;
41 nfacct_list->len = len;
42 }
43 +}
44 +
45 +static int nfacct_callback(const struct nlmsghdr *nlh, void *data) {
46 + (void)data;
47 +
48 + static struct nfacct *nfacct = NULL;
49 +
50 + if(unlikely(!nfacct)) {
51 + nfacct = nfacct_alloc();
52 + if(!nfacct) {
53 + error("nfacct.plugin: nfacct_alloc() failed.");
54 + return MNL_CB_OK;
55 + }
56 + }
57
54 - if(nfacct_nlmsg_parse_payload(nlh, nfacct_list->data[nfacct_list->len].nfacct) < 0) {
58 + if(nfacct_nlmsg_parse_payload(nlh, nfacct) < 0) {
59 error("nfacct.plugin: nfacct_nlmsg_parse_payload() failed.");
60 return MNL_CB_OK;
61 }
62
59 - nfacct_list->data[nfacct_list->len].name = nfacct_attr_get_str(nfacct_list->data[nfacct_list->len].nfacct, NFACCT_ATTR_NAME);
60 - nfacct_list->data[nfacct_list->len].pkts = nfacct_attr_get_u64(nfacct_list->data[nfacct_list->len].nfacct, NFACCT_ATTR_PKTS);
61 - nfacct_list->data[nfacct_list->len].bytes = nfacct_attr_get_u64(nfacct_list->data[nfacct_list->len].nfacct, NFACCT_ATTR_BYTES);
62 - nfacct_list->data[nfacct_list->len].updated = 1;
63 + const char *name = nfacct_attr_get_str(nfacct, NFACCT_ATTR_NAME);
64 + uint32_t hash = simple_hash(name);
65 +
66 + int i;
67 + struct mynfacct *mynfacct = NULL;
68 + for(i = 0; i < nfacct_list->len; i++) {
69 + if(nfacct_list->data[i].hash == hash && !strcmp(nfacct_list->data[i].name, name)) {
70 + mynfacct = &nfacct_list->data[i];
71 + break;
72 + }
73 + }
74 +
75 + if(!mynfacct) {
76 + nfacct_list_grow();
77 + mynfacct = &nfacct_list->data[nfacct_list->len++];
78 + mynfacct->name = name;
79 + mynfacct->hash = hash;
80 + }
81 +
82 + mynfacct->pkts = nfacct_attr_get_u64(nfacct, NFACCT_ATTR_PKTS);
83 + mynfacct->bytes = nfacct_attr_get_u64(nfacct, NFACCT_ATTR_BYTES);
84 + mynfacct->updated = 1;
85
86 nfacct_list->len++;
87 return MNL_CB_OK;
@@ -127,8 +149,6 @@ void *nfacct_main(void *ptr) {
149 goto cleanup;
150 }
151
130 - if(nfacct_list) nfacct_list->len = 0;
131 -
152 ssize_t ret;
153 while((ret = mnl_socket_recvfrom(nl, buf, sizeof(buf))) > 0) {
154 if((ret = mnl_cb_run(buf, (size_t)ret, seq, portid, nfacct_callback, NULL)) <= 0) break;