From 198e92a8e5ec0150f1e9ea7c3f12f927a6acebac Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 5 Mar 2021 10:23:32 +0100 Subject: [PATCH] MINOR: server: add a global list of all known servers It's a real pain not to have access to the list of all registered servers, because whenever there is a need to late adjust their configuration, only those attached to regular proxies are seen, but not the peers, lua, logs nor DNS. What this patch does is that new_server() will automatically add the newly created server to a global list, and it does so as well for the 1 or 2 statically allocated servers created for Lua. This way it will be possible to iterate over all of them. --- include/haproxy/server-t.h | 1 + include/haproxy/server.h | 1 + src/haproxy.c | 1 + src/hlua.c | 4 +++- src/server.c | 6 ++++++ 5 files changed, 12 insertions(+), 1 deletion(-) diff --git a/include/haproxy/server-t.h b/include/haproxy/server-t.h index b726b5f9b1..a1a183ed99 100644 --- a/include/haproxy/server-t.h +++ b/include/haproxy/server-t.h @@ -210,6 +210,7 @@ struct server { enum srv_admin next_admin, cur_admin; /* server maintenance status : SRV_ADMF_* */ signed char use_ssl; /* ssl enabled (1: on, 0: disabled, -1 forced off) */ unsigned int pp_opts; /* proxy protocol options (SRV_PP_*) */ + struct list global_list; /* attach point in the global servers_list */ struct server *next; int cklen; /* the len of the cookie, to speed up checks */ int rdr_len; /* the length of the redirection prefix */ diff --git a/include/haproxy/server.h b/include/haproxy/server.h index 4892abdbf7..9218ac46be 100644 --- a/include/haproxy/server.h +++ b/include/haproxy/server.h @@ -39,6 +39,7 @@ __decl_thread(extern HA_SPINLOCK_T idle_conn_srv_lock); extern struct idle_conns idle_conns[MAX_THREADS]; extern struct eb_root idle_conn_srv; extern struct task *idle_conn_task; +extern struct list servers_list; extern struct dict server_key_dict; int srv_downtime(const struct server *s); diff --git a/src/haproxy.c b/src/haproxy.c index 7e02e5b308..a4d42dc9a1 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -2675,6 +2675,7 @@ void deinit(void) srvdf->fct(s); EXTRA_COUNTERS_FREE(s->extra_counters); + LIST_DEL(&s->global_list); free(s); s = s_next; }/* end while(s) */ diff --git a/src/hlua.c b/src/hlua.c index 52c4295069..a093faf413 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -48,7 +48,7 @@ #include #include #include -#include +#include #include #include #include @@ -9179,6 +9179,7 @@ void hlua_init(void) { socket_tcp.pendconns = EB_ROOT; socket_tcp.idle_conns_tree = NULL; socket_tcp.safe_conns_tree = NULL; + LIST_ADD(&servers_list, &socket_tcp.global_list); socket_tcp.next_state = SRV_ST_RUNNING; /* early server setup */ socket_tcp.last_change = 0; socket_tcp.conf.file = strdup("HLUA_INTERNAL"); @@ -9226,6 +9227,7 @@ void hlua_init(void) { socket_ssl.pendconns = EB_ROOT; socket_ssl.idle_conns_tree = NULL; socket_ssl.safe_conns_tree = NULL; + LIST_ADD(&servers_list, &socket_ssl.global_list); socket_ssl.next_state = SRV_ST_RUNNING; /* early server setup */ socket_ssl.last_change = 0; socket_ssl.conf.file = strdup("HLUA_INTERNAL"); diff --git a/src/server.c b/src/server.c index db54d3fc15..dd6340b530 100644 --- a/src/server.c +++ b/src/server.c @@ -58,6 +58,7 @@ static struct srv_kw_list srv_keywords = { __decl_thread(HA_SPINLOCK_T idle_conn_srv_lock); struct eb_root idle_conn_srv = EB_ROOT; struct task *idle_conn_task = NULL; +struct list servers_list = LIST_HEAD_INIT(servers_list); /* The server names dictionary */ struct dict server_key_dict = { @@ -1736,6 +1737,9 @@ static void srv_settings_cpy(struct server *srv, struct server *src, int srv_tmp srv->socks4_addr = src->socks4_addr; } +/* allocate a server and attach it to the global servers_list. Returns + * the server on success, otherwise NULL. + */ struct server *new_server(struct proxy *proxy) { struct server *srv; @@ -1748,6 +1752,7 @@ struct server *new_server(struct proxy *proxy) srv->proxy = proxy; MT_LIST_INIT(&srv->actconns); srv->pendconns = EB_ROOT; + LIST_ADDQ(&servers_list, &srv->global_list); srv->next_state = SRV_ST_RUNNING; /* early server setup */ srv->last_change = now.tv_sec; @@ -1923,6 +1928,7 @@ static int server_template_init(struct server *srv, struct proxy *px) #endif free_check(&newsrv->agent); free_check(&newsrv->check); + LIST_DEL(&newsrv->global_list); } free(newsrv); return i - srv->tmpl_info.nb_low; -- 2.39.5