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);