]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: server: add a global list of all known servers
authorWilly Tarreau <w@1wt.eu>
Fri, 5 Mar 2021 09:23:32 +0000 (10:23 +0100)
committerWilly Tarreau <w@1wt.eu>
Fri, 5 Mar 2021 14:00:24 +0000 (15:00 +0100)
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
include/haproxy/server.h
src/haproxy.c
src/hlua.c
src/server.c

index b726b5f9b187ee9c0c47ceccb59a3485d5e4e75a..a1a183ed996224a2a9155d4fcd41d107bc637c61 100644 (file)
@@ -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 */
index 4892abdbf7bf5d5f97b7d54d761571a2e74f44a4..9218ac46becf014128ce23c48e008309183e367b 100644 (file)
@@ -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);
index 7e02e5b30817040466a487fb8973b38942b4f420..a4d42dc9a1cc4d4712f076f51b697c19fb3d26de 100644 (file)
@@ -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) */
index 52c429506901a631ce6b713180689e5a0a901b2e..a093faf413b6b05dd0fc63c1706a77dab797ce90 100644 (file)
@@ -48,7 +48,7 @@
 #include <haproxy/proxy-t.h>
 #include <haproxy/regex.h>
 #include <haproxy/sample.h>
-#include <haproxy/server-t.h>
+#include <haproxy/server.h>
 #include <haproxy/session.h>
 #include <haproxy/stats-t.h>
 #include <haproxy/stream.h>
@@ -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");
index db54d3fc157c7e8f9a1bc07cb343003f3d063d7e..dd6340b530bf52043d059477bdad54ca8b073ec2 100644 (file)
@@ -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;