diff --git a/include/haproxy/server-t.h b/include/haproxy/server-t.h index 0584d92df..780803384 100644 --- a/include/haproxy/server-t.h +++ b/include/haproxy/server-t.h @@ -171,7 +171,7 @@ enum srv_init_state { #define SRV_F_DEFSRV_USE_SSL 0x4000 /* default-server uses SSL */ #define SRV_F_DELETED 0x8000 /* srv is deleted but not yet purged */ #define SRV_F_STRICT_MAXCONN 0x10000 /* maxconn is to be strictly enforced, as a limit of outbound connections */ -#define SRV_F_CHECKED 0x20000 /* set once server was postparsed */ +/* unused: 0x20000 */ /* configured server options for send-proxy (server->pp_opts) */ #define SRV_PP_V1 0x0001 /* proxy protocol version 1 */ diff --git a/include/haproxy/server.h b/include/haproxy/server.h index 9d401ffc9..5cd75a774 100644 --- a/include/haproxy/server.h +++ b/include/haproxy/server.h @@ -74,7 +74,7 @@ struct server *new_server(struct proxy *proxy); void srv_take(struct server *srv); struct server *srv_drop(struct server *srv); void srv_free_params(struct server *srv); -int srv_init(struct server *srv); +int srv_preinit(struct server *srv); void srv_set_ssl(struct server *s, int use_ssl); const char *srv_adm_st_chg_cause(enum srv_adm_st_chg_cause cause); const char *srv_op_st_chg_cause(enum srv_op_st_chg_cause cause); diff --git a/src/cfgparse.c b/src/cfgparse.c index 040e35549..344123115 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -2824,7 +2824,7 @@ int check_config_validity() * as some of the fields may be accessed soon */ MT_LIST_FOR_EACH_ENTRY_LOCKED(newsrv, &servers_list, global_list, back) { - err_code |= srv_init(newsrv); + err_code |= srv_preinit(newsrv); if (err_code & ERR_CODE) goto out; } diff --git a/src/server.c b/src/server.c index 3d270e8c2..b9f330f28 100644 --- a/src/server.c +++ b/src/server.c @@ -3363,7 +3363,7 @@ static int _srv_parse_tmpl_init(struct server *srv, struct proxy *px) * This function is expected to be called after _srv_parse_init() initialization * but only when the effective server's proxy mode is known, which is not always * the case during parsing time, in which case the function will be called during - * postparsing thanks to the srv_init() below. + * postparsing thanks to the srv_postinit() below. * * Returns ERR_NONE on success else a combination or ERR_CODE. */ @@ -3427,7 +3427,27 @@ static int _srv_check_proxy_mode(struct server *srv, char postparse) return err_code; } -/* Finish initializing the server after parsing + +/* Finish initializing the server after parsing and before config checks + * + * Returns ERR_NONE on success else a combination or ERR_CODE. + */ +static int srv_init_per_thr(struct server *srv); +int srv_preinit(struct server *srv) +{ + int err_code = ERR_NONE; + + if (srv_init_per_thr(srv) == -1) { + ha_alert("error during per-thread init for %s/%s server\n", srv->proxy->id, srv->id); + err_code |= ERR_ALERT | ERR_FATAL; + goto out; + } + + out: + return err_code; +} + +/* Finish initializing the server after parsing and config checks * * We must be careful that checks / postinits performed within this function * don't depend or conflict with other postcheck functions that are registered @@ -3437,14 +3457,10 @@ static int _srv_check_proxy_mode(struct server *srv, char postparse) */ static int init_srv_requeue(struct server *srv); static int init_srv_slowstart(struct server *srv); -static int srv_init_per_thr(struct server *srv); -int srv_init(struct server *srv) +int srv_postinit(struct server *srv) { int err_code = ERR_NONE; - if (srv->flags & SRV_F_CHECKED) - return ERR_NONE; // nothing to do - err_code |= _srv_check_proxy_mode(srv, 1); if (err_code & ERR_CODE) @@ -3474,12 +3490,6 @@ int srv_init(struct server *srv) if (err_code & ERR_CODE) goto out; - if (srv_init_per_thr(srv) == -1) { - ha_alert("error during per-thread init for %s/%s server\n", srv->proxy->id, srv->id); - err_code |= ERR_ALERT | ERR_FATAL; - goto out; - } - /* initialize idle conns lists */ if (srv->max_idle_conns != 0) { srv->curr_idle_thr = ha_aligned_zalloc(64, global.nbthread * sizeof(*srv->curr_idle_thr)); @@ -3492,11 +3502,9 @@ int srv_init(struct server *srv) } out: - if (!(err_code & ERR_CODE)) - srv->flags |= SRV_F_CHECKED; return err_code; } -REGISTER_POST_SERVER_CHECK(srv_init); +REGISTER_POST_SERVER_CHECK(srv_postinit); /* Allocate a new server pointed by and try to parse the first arguments * in as an address for a server or an address-range for a template or @@ -6181,7 +6189,10 @@ static int cli_parse_add_server(char **args, char *payload, struct appctx *appct srv->agent.state &= ~CHK_ST_ENABLED; } - errcode = srv_init(srv); + errcode = srv_preinit(srv); + if (errcode) + goto out; + errcode = srv_postinit(srv); if (errcode) goto out;