diff --git a/include/haproxy/server-t.h b/include/haproxy/server-t.h index b726b5f9b..a1a183ed9 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 4892abdbf..9218ac46b 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 7e02e5b30..a4d42dc9a 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 52c429506..a093faf41 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 db54d3fc1..dd6340b53 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;