@cryptotaxi247 / netdata-1 / commits / 3e1a333c5

more registry code cleanup and re-organization for better management

Costa Tsaousis (ktsaou) committed Jan 1, 2017 at 17:14 UTC 3e1a333c5749373c0471ad026427e83761fbf4c4
9 files changed +138 -76
src/avl.h
+2 -2
@@ -56,8 +56,8 @@ typedef struct avl_tree_lock {
56 * a is linked directly to the tree, so it has to
57 * be properly allocated by the caller.
58 */
59 -avl *avl_insert_lock(avl_tree_lock *t, avl *a);
60 -avl *avl_insert(avl_tree *t, avl *a);
59 +avl *avl_insert_lock(avl_tree_lock *t, avl *a) __attribute__((returns_nonnull));
60 +avl *avl_insert(avl_tree *t, avl *a) __attribute__((returns_nonnull));
61
62 /* Remove an element a from the AVL tree t
63 * returns a pointer to the removed element
src/common.h
+4 -4
@@ -200,10 +200,10 @@ extern void *mallocz_int(const char *file, const char *function, const unsigned
200 extern void *reallocz_int(const char *file, const char *function, const unsigned long line, void *ptr, size_t size);
201 extern void freez_int(const char *file, const char *function, const unsigned long line, void *ptr);
202 #else
203 -extern char *strdupz(const char *s) __attribute__((returns_nonnull));
204 -extern void *callocz(size_t nmemb, size_t size) __attribute__((returns_nonnull));
205 -extern void *mallocz(size_t size) __attribute__((returns_nonnull));
206 -extern void *reallocz(void *ptr, size_t size) __attribute__((returns_nonnull));
203 +extern char *strdupz(const char *s) __attribute__((returns_nonnull, malloc));
204 +extern void *callocz(size_t nmemb, size_t size) __attribute__((returns_nonnull, malloc));
205 +extern void *mallocz(size_t size) __attribute__((returns_nonnull, malloc));
206 +extern void *reallocz(void *ptr, size_t size) __attribute__((returns_nonnull, malloc));
207 extern void freez(void *ptr);
208 #endif
209
src/registry.h
+1
@@ -39,6 +39,7 @@
39 // 3. lower memory requirements
40 //
41 // - embed avl structures directly into registry objects, instead of DICTIONARY
42 +// [DONE for PERSON_URLs, PENDING for MACHINE_URLs]
43 // - store GUIDs in memory as UUID instead of char *
44 // - do not track persons using the demo machines only
45 // (i.e. start tracking them only when they access a non-demo machine)
src/registry_init.c
+3 -28
@@ -80,7 +80,7 @@ int registry_init(void) {
80
81 return 0;
82 }
83 -/*
83 +
84 void registry_free(void) {
85 if(!registry.enabled) return;
86
@@ -89,32 +89,7 @@ void registry_free(void) {
89
90 while(registry.persons->values_index.root) {
91 REGISTRY_PERSON *p = ((NAME_VALUE *)registry.persons->values_index.root)->value;
92 -
93 - // fprintf(stderr, "\nPERSON: '%s', first: %u, last: %u, usages: %u\n", p->guid, p->first_t, p->last_t, p->usages);
94 -
95 - while(p->person_urls->values_index.root) {
96 - REGISTRY_PERSON_URL *pu = ((NAME_VALUE *)p->person_urls->values_index.root)->value;
97 -
98 - // fprintf(stderr, "\tURL: '%s', first: %u, last: %u, usages: %u, flags: 0x%02x\n", pu->url->url, pu->first_t, pu->last_t, pu->usages, pu->flags);
99 -
100 - debug(D_REGISTRY, "Registry: deleting url '%s' from person '%s'", pu->url->url, p->guid);
101 - dictionary_del(p->person_urls, pu->url->url);
102 -
103 - debug(D_REGISTRY, "Registry: unlinking url '%s' from person", pu->url->url);
104 - registry_url_unlink(pu->url);
105 -
106 - debug(D_REGISTRY, "Registry: freeing person url");
107 - freez(pu);
108 - }
109 -
110 - debug(D_REGISTRY, "Registry: deleting person '%s' from persons registry", p->guid);
111 - dictionary_del(registry.persons, p->guid);
112 -
113 - debug(D_REGISTRY, "Registry: destroying URL dictionary of person '%s'", p->guid);
114 - dictionary_destroy(p->person_urls);
115 -
116 - debug(D_REGISTRY, "Registry: freeing person '%s'", p->guid);
117 - freez(p);
92 + registry_person_del(p);
93 }
94
95 while(registry.machines->values_index.root) {
@@ -158,4 +133,4 @@ void registry_free(void) {
133 debug(D_REGISTRY, "Registry: destroying machines dictionary");
134 dictionary_destroy(registry.machines);
135 }
161 -*/
136 +
src/registry_internals.c
+19 -12
@@ -59,7 +59,17 @@ static inline char *registry_fix_machine_name(char *name, size_t *len) {
59 }
60
61 static inline char *registry_fix_url(char *url, size_t *len) {
62 - return registry_fix_machine_name(url, len);
62 + size_t l = 0;
63 + char *s = registry_fix_machine_name(url, &l);
64 +
65 + // protection from too big URLs
66 + if(l > registry.max_url_length) {
67 + l = registry.max_url_length;
68 + s[l] = '\0';
69 + }
70 +
71 + if(len) *len = l;
72 + return s;
73 }
74
75
@@ -115,7 +125,7 @@ REGISTRY_PERSON_URL *registry_verify_request(char *person_guid, char *machine_gu
125 }
126 if(pp) *pp = p;
127
118 - REGISTRY_PERSON_URL *pu = registry_person_url_find(p, url);
128 + REGISTRY_PERSON_URL *pu = registry_person_url_index_find(p, url);
129 if(!pu) {
130 info("Registry Request Verification: URL not found for person, person: '%s', machine '%s', url '%s'", person_guid, machine_guid, url);
131 return NULL;
@@ -154,7 +164,7 @@ REGISTRY_PERSON *registry_request_access(char *person_guid, char *machine_guid,
164 }
165
166 REGISTRY_PERSON *registry_request_delete(char *person_guid, char *machine_guid, char *url, char *delete_url, time_t when) {
157 - (void)when;
167 + (void) when;
168
169 REGISTRY_PERSON *p = NULL;
170 REGISTRY_MACHINE *m = NULL;
@@ -166,23 +176,20 @@ REGISTRY_PERSON *registry_request_delete(char *person_guid, char *machine_guid,
176
177 // make sure the user is not deleting the url it uses
178 if(!strcmp(delete_url, pu->url->url)) {
169 - info("Registry Delete Request: delete URL is the one currently accessed, person: '%s', machine '%s', url '%s', delete url '%s'", p->guid, m->guid, pu->url->url, delete_url);
179 + info("Registry Delete Request: delete URL is the one currently accessed, person: '%s', machine '%s', url '%s', delete url '%s'"
180 + , p->guid, m->guid, pu->url->url, delete_url);
181 return NULL;
182 }
183
173 - REGISTRY_PERSON_URL *dpu = registry_person_url_find(p, delete_url);
184 + REGISTRY_PERSON_URL *dpu = registry_person_url_index_find(p, delete_url);
185 if(!dpu) {
175 - info("Registry Delete Request: URL not found for person: '%s', machine '%s', url '%s', delete url '%s'", p->guid, m->guid, pu->url->url, delete_url);
186 + info("Registry Delete Request: URL not found for person: '%s', machine '%s', url '%s', delete url '%s'", p->guid
187 + , m->guid, pu->url->url, delete_url);
188 return NULL;
189 }
190
191 registry_log('D', p, m, pu->url, dpu->url->url);
180 -
181 - registry_person_url_del(p, dpu);
182 -
183 - registry_url_unlink(dpu->url);
184 -
185 - freez(dpu);
192 + registry_person_unlink_from_url(p, dpu);
193
194 return p;
195 }
src/registry_person.c
+75 -20
@@ -1,7 +1,7 @@
1 #include "registry_internals.h"
2
3 // ----------------------------------------------------------------------------
4 -// PERSON_URL
4 +// PERSON_URL INDEX
5
6 int person_url_compare(void *a, void *b) {
7 register uint32_t hash1 = ((REGISTRY_PERSON_URL *)a)->url->hash;
@@ -12,11 +12,8 @@ int person_url_compare(void *a, void *b) {
12 else return strcmp(((REGISTRY_PERSON_URL *)a)->url->url, ((REGISTRY_PERSON_URL *)b)->url->url);
13 }
14
15 -#define registry_person_url_index_add(person, rc) (REGISTRY_PERSON_URL *)avl_insert(&((person)->person_urls), (avl *)(rc))
16 -#define registry_person_url_index_del(person, rc) (REGISTRY_PERSON_URL *)avl_remove(&((person)->person_urls), (avl *)(rc))
17 -
18 -REGISTRY_PERSON_URL *registry_person_url_find(REGISTRY_PERSON *p, const char *url) {
19 - debug(D_REGISTRY, "Registry: registry_person_url_find('%s', '%s')", p->guid, url);
15 +inline REGISTRY_PERSON_URL *registry_person_url_index_find(REGISTRY_PERSON *p, const char *url) {
16 + debug(D_REGISTRY, "Registry: registry_person_url_index_find('%s', '%s')", p->guid, url);
17
18 char buf[sizeof(REGISTRY_URL) + strlen(url)];
19
@@ -30,6 +27,29 @@ REGISTRY_PERSON_URL *registry_person_url_find(REGISTRY_PERSON *p, const char *ur
27 return pu;
28 }
29
30 +inline REGISTRY_PERSON_URL *registry_person_url_index_add(REGISTRY_PERSON *p, REGISTRY_PERSON_URL *pu) {
31 + debug(D_REGISTRY, "Registry: registry_person_url_index_add('%s', '%s')", p->guid, pu->url->url);
32 + REGISTRY_PERSON_URL *tpu = (REGISTRY_PERSON_URL *)avl_insert(&(p->person_urls), (avl *)(pu));
33 + if(tpu != pu)
34 + error("Registry: registry_person_url_index_add('%s', '%s') already exists as '%s'", p->guid, pu->url->url, tpu->url->url);
35 +
36 + return tpu;
37 +}
38 +
39 +inline REGISTRY_PERSON_URL *registry_person_url_index_del(REGISTRY_PERSON *p, REGISTRY_PERSON_URL *pu) {
40 + debug(D_REGISTRY, "Registry: registry_person_url_index_del('%s', '%s')", p->guid, pu->url->url);
41 + REGISTRY_PERSON_URL *tpu = (REGISTRY_PERSON_URL *)avl_remove(&(p->person_urls), (avl *)(pu));
42 + if(!tpu)
43 + error("Registry: registry_person_url_index_del('%s', '%s') deleted nothing", p->guid, pu->url->url);
44 + else if(tpu != pu)
45 + error("Registry: registry_person_url_index_del('%s', '%s') deleted wrong URL '%s'", p->guid, pu->url->url, tpu->url->url);
46 +
47 + return tpu;
48 +}
49 +
50 +// ----------------------------------------------------------------------------
51 +// PERSON_URL
52 +
53 REGISTRY_PERSON_URL *registry_person_url_allocate(REGISTRY_PERSON *p, REGISTRY_MACHINE *m, REGISTRY_URL *u, char *name, size_t namelen, time_t when) {
54 debug(D_REGISTRY, "registry_person_url_allocate('%s', '%s', '%s'): allocating %zu bytes", p->guid, m->guid, u->url, sizeof(REGISTRY_PERSON_URL) + namelen);
55
@@ -53,22 +73,47 @@ REGISTRY_PERSON_URL *registry_person_url_allocate(REGISTRY_PERSON *p, REGISTRY_M
73 registry.persons_urls_memory += sizeof(REGISTRY_PERSON_URL) + namelen;
74
75 debug(D_REGISTRY, "registry_person_url_allocate('%s', '%s', '%s'): indexing URL in person", p->guid, m->guid, u->url);
56 - registry_person_url_index_add(p, pu);
57 -
58 - registry_url_link(u);
76 + REGISTRY_PERSON_URL *tpu = registry_person_url_index_add(p, pu);
77 + if(tpu != pu) {
78 + error("Registry: Attempted to add duplicate person url '%s' with name '%s' to person '%s'", u->url, name, p->guid);
79 + free(pu);
80 + pu = tpu;
81 + }
82 + else
83 + registry_url_link(u);
84
85 return pu;
86 }
87
88 +void registry_person_url_free(REGISTRY_PERSON *p, REGISTRY_PERSON_URL *pu) {
89 + debug(D_REGISTRY, "registry_person_url_free('%s', '%s')", p->guid, pu->url->url);
90 +
91 + REGISTRY_PERSON_URL *tpu = registry_person_url_index_del(p, pu);
92 + if(tpu) {
93 + registry_url_unlink(tpu->url);
94 + tpu->machine->links--;
95 + registry.persons_urls_memory -= sizeof(REGISTRY_PERSON_URL) + strlen(tpu->machine_name);
96 + freez(tpu);
97 + }
98 +}
99 +
100 // this function is needed to change the name of a PERSON_URL
101 REGISTRY_PERSON_URL *registry_person_url_reallocate(REGISTRY_PERSON *p, REGISTRY_MACHINE *m, REGISTRY_URL *u, char *name, size_t namelen, time_t when, REGISTRY_PERSON_URL *pu) {
102 debug(D_REGISTRY, "registry_person_url_reallocate('%s', '%s', '%s'): allocating %zu bytes", p->guid, m->guid, u->url, sizeof(REGISTRY_PERSON_URL) + namelen);
103
104 + // keep a backup
105 + REGISTRY_PERSON_URL pu2 = {
106 + .first_t = pu->first_t,
107 + .last_t = pu->last_t,
108 + .usages = pu->usages,
109 + .flags = pu->flags,
110 + .machine = pu->machine,
111 + .machine_name = ""
112 + };
113 +
114 // remove the existing one from the index
68 - registry_person_url_index_del(p, pu);
69 - registry_url_unlink(pu->url);
70 - pu->machine->links--;
71 - registry.persons_urls_memory -= sizeof(REGISTRY_PERSON_URL) + strlen(pu->machine_name);
115 + registry_person_url_free(p, pu);
116 + pu = &pu2;
117
118 // allocate a new one
119 REGISTRY_PERSON_URL *tpu = registry_person_url_allocate(p, m, u, name, namelen, when);
@@ -77,16 +122,10 @@ REGISTRY_PERSON_URL *registry_person_url_reallocate(REGISTRY_PERSON *p, REGISTRY
122 tpu->usages = pu->usages;
123 tpu->flags = pu->flags;
124
80 - freez(pu);
125 return tpu;
126 }
127
128
85 -void registry_person_url_del(REGISTRY_PERSON *p, REGISTRY_PERSON_URL *pu) {
86 - debug(D_REGISTRY, "Registry: registry_person_url_del('%s', '%s')", p->guid, pu->url->url);
87 - registry_person_url_index_del(p, pu);
88 -}
89 -
129 // ----------------------------------------------------------------------------
130 // PERSON
131
@@ -157,13 +196,26 @@ REGISTRY_PERSON *registry_person_get(const char *person_guid, time_t when) {
196 return p;
197 }
198
199 +void registry_person_del(REGISTRY_PERSON *p) {
200 + debug(D_REGISTRY, "Registry: registry_person_del('%s'): creating dictionary of urls", p->guid);
201 +
202 + while(p->person_urls.root)
203 + registry_person_unlink_from_url(p, (REGISTRY_PERSON_URL *)p->person_urls.root);
204 +
205 + debug(D_REGISTRY, "Registry: deleting person '%s' from persons registry", p->guid);
206 + dictionary_del(registry.persons, p->guid);
207 +
208 + debug(D_REGISTRY, "Registry: freeing person '%s'", p->guid);
209 + freez(p);
210 +}
211 +
212 // ----------------------------------------------------------------------------
213 // LINKING OF OBJECTS
214
215 REGISTRY_PERSON_URL *registry_person_link_to_url(REGISTRY_PERSON *p, REGISTRY_MACHINE *m, REGISTRY_URL *u, char *name, size_t namelen, time_t when) {
216 debug(D_REGISTRY, "registry_person_link_to_url('%s', '%s', '%s'): searching for URL in person", p->guid, m->guid, u->url);
217
166 - REGISTRY_PERSON_URL *pu = registry_person_url_find(p, u->url);
218 + REGISTRY_PERSON_URL *pu = registry_person_url_index_find(p, u->url);
219 if(!pu) {
220 debug(D_REGISTRY, "registry_person_link_to_url('%s', '%s', '%s'): not found", p->guid, m->guid, u->url);
221 pu = registry_person_url_allocate(p, m, u, name, namelen, when);
@@ -207,3 +259,6 @@ REGISTRY_PERSON_URL *registry_person_link_to_url(REGISTRY_PERSON *p, REGISTRY_MA
259 return pu;
260 }
261
262 +void registry_person_unlink_from_url(REGISTRY_PERSON *p, REGISTRY_PERSON_URL *pu) {
263 + registry_person_url_free(p, pu);
264 +}
src/registry_person.h
+12 -4
@@ -39,14 +39,22 @@ struct registry_person {
39 };
40 typedef struct registry_person REGISTRY_PERSON;
41
42 -extern REGISTRY_PERSON *registry_person_find(const char *person_guid);
42 +// PERSON_URL
43 +extern REGISTRY_PERSON_URL *registry_person_url_index_find(REGISTRY_PERSON *p, const char *url);
44 +extern REGISTRY_PERSON_URL *registry_person_url_index_add(REGISTRY_PERSON *p, REGISTRY_PERSON_URL *pu) __attribute__((warn_unused_result));
45 +extern REGISTRY_PERSON_URL *registry_person_url_index_del(REGISTRY_PERSON *p, REGISTRY_PERSON_URL *pu) __attribute__((warn_unused_result));
46 +
47 extern REGISTRY_PERSON_URL *registry_person_url_allocate(REGISTRY_PERSON *p, REGISTRY_MACHINE *m, REGISTRY_URL *u, char *name, size_t namelen, time_t when);
48 extern REGISTRY_PERSON_URL *registry_person_url_reallocate(REGISTRY_PERSON *p, REGISTRY_MACHINE *m, REGISTRY_URL *u, char *name, size_t namelen, time_t when, REGISTRY_PERSON_URL *pu);
49 +
50 +// PERSON
51 +extern REGISTRY_PERSON *registry_person_find(const char *person_guid);
52 extern REGISTRY_PERSON *registry_person_allocate(const char *person_guid, time_t when);
53 extern REGISTRY_PERSON *registry_person_get(const char *person_guid, time_t when);
47 -extern REGISTRY_PERSON_URL *registry_person_link_to_url(REGISTRY_PERSON *p, REGISTRY_MACHINE *m, REGISTRY_URL *u, char *name, size_t namelen, time_t when);
54 +extern void registry_person_del(REGISTRY_PERSON *p);
55
49 -extern REGISTRY_PERSON_URL *registry_person_url_find(REGISTRY_PERSON *p, const char *url);
50 -extern void registry_person_url_del(REGISTRY_PERSON *p, REGISTRY_PERSON_URL *pu);
56 +// LINKING PERSON -> PERSON_URL
57 +extern REGISTRY_PERSON_URL *registry_person_link_to_url(REGISTRY_PERSON *p, REGISTRY_MACHINE *m, REGISTRY_URL *u, char *name, size_t namelen, time_t when);
58 +extern void registry_person_unlink_from_url(REGISTRY_PERSON *p, REGISTRY_PERSON_URL *pu);
59
60 #endif //NETDATA_REGISTRY_PERSON_H
src/registry_url.c
+17 -6
@@ -9,8 +9,13 @@ int registry_url_compare(void *a, void *b) {
9 else return strcmp(((REGISTRY_URL *)a)->url, ((REGISTRY_URL *)b)->url);
10 }
11
12 -#define registry_url_index_add(rc) (REGISTRY_URL *)avl_insert(&(registry.registry_urls_root_index), (avl *)(rc))
13 -#define registry_url_index_del(rc) (REGISTRY_URL *)avl_remove(&(registry.registry_urls_root_index), (avl *)(rc))
12 +inline REGISTRY_URL *registry_url_index_add(REGISTRY_URL *u) {
13 + return (REGISTRY_URL *)avl_insert(&(registry.registry_urls_root_index), (avl *)(u));
14 +}
15 +
16 +inline REGISTRY_URL *registry_url_index_del(REGISTRY_URL *u) {
17 + return (REGISTRY_URL *)avl_remove(&(registry.registry_urls_root_index), (avl *)(u));
18 +}
19
20 REGISTRY_URL *registry_url_get(const char *url, size_t urllen) {
21 // protection from too big URLs
@@ -63,11 +68,17 @@ void registry_url_unlink(REGISTRY_URL *u) {
68 if(!u->links) {
69 debug(D_REGISTRY, "Registry: registry_url_unlink('%s'): No more links for this URL", u->url);
70 REGISTRY_URL *n = registry_url_index_del(u);
66 - if(n != u)
67 - error("INTERNAL ERROR: registry_url_unlink(): request to delete url '%s', deleted url '%s'", u->url, n->url);
71 + if(!n) {
72 + error("INTERNAL ERROR: registry_url_unlink('%s'): cannot find url in index", u->url);
73 + }
74 + else {
75 + if(n != u) {
76 + error("INTERNAL ERROR: registry_url_unlink('%s'): deleted different url '%s'", u->url, n->url);
77 + }
78
69 - registry.urls_memory -= sizeof(REGISTRY_URL) + n->len; // no need for +1, 1 is already in REGISTRY_URL
70 - freez(n);
79 + registry.urls_memory -= sizeof(REGISTRY_URL) + n->len; // no need for +1, 1 is already in REGISTRY_URL
80 + freez(n);
81 + }
82 }
83 else
84 debug(D_REGISTRY, "Registry: registry_url_unlink('%s'): URL has %u links left", u->url, u->links);
src/registry_url.h
+5
@@ -20,7 +20,12 @@ struct registry_url {
20 };
21 typedef struct registry_url REGISTRY_URL;
22
23 +// REGISTRY_URL INDEX
24 extern int registry_url_compare(void *a, void *b);
25 +extern REGISTRY_URL *registry_url_index_del(REGISTRY_URL *u);
26 +extern REGISTRY_URL *registry_url_index_add(REGISTRY_URL *u) __attribute__((returns_nonnull));
27 +
28 +// REGISTRY_URL MANAGEMENT
29 extern REGISTRY_URL *registry_url_get(const char *url, size_t urllen) __attribute__((returns_nonnull));
30 extern void registry_url_link(REGISTRY_URL *u);
31 extern void registry_url_unlink(REGISTRY_URL *u);