mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-11 17:46:57 +02:00
Since 3.0, it is possible to assign a GUID to proxies, listeners and servers. These objects are stored in a global tree guid_tree. Proxies and listeners are static. However, servers may be added or deleted at runtime, which imply that guid_tree must be protected. Fix this by declaring a read-write lock to protect tree access. For now, only guid_insert() and guid_remove() are protected using a write lock. Outside of these, GUID tree is not accessed at runtime. If server CLI commands are extended to support GUID as server identifier, lookup operation should be extended with a read lock protection. Note that during stat-file preloading, GUID tree is accessed for lookup. However, as it is performed on startup which is single threaded, there is no need for lock here. A BUG_ON() has been added to ensure this precondition remains true. This bug could caused a segfault when using dynamic servers with GUID. However, it was never reproduced for now. This must be backported up to 3.0. To avoid a conflict issue, the previous cleanup patch can be merged before it.
19 lines
518 B
C
19 lines
518 B
C
#ifndef _HAPROXY_GUID_H
|
|
#define _HAPROXY_GUID_H
|
|
|
|
#include <haproxy/api-t.h>
|
|
#include <haproxy/guid-t.h>
|
|
#include <haproxy/thread-t.h>
|
|
|
|
__decl_thread(extern HA_RWLOCK_T guid_lock);
|
|
|
|
void guid_init(struct guid_node *node);
|
|
int guid_insert(enum obj_type *obj_type, const char *uid, char **errmsg);
|
|
void guid_remove(struct guid_node *guid);
|
|
struct guid_node *guid_lookup(const char *uid);
|
|
|
|
int guid_is_valid_fmt(const char *uid, char **errmsg);
|
|
char *guid_name(const struct guid_node *guid);
|
|
|
|
#endif /* _HAPROXY_GUID_H */
|