mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-07 15:47:01 +02:00
MEDIUM: server: add and use srv_init() function
rename _srv_postparse() internal function to srv_init() function and group srv_init_per_thr() plus idle conns list init inside it. This way we can perform some simplifications as srv_init() performs multiple server init steps after parsing. SRV_F_CHECKED flag was added, it is automatically set when srv_init() runs successfully. If the flag is already set and srv_init() is called again, nothing is done. This permis to manually call srv_init() earlier than the default POST_CHECK hook when needed without risking to do things twice.
This commit is contained in:
parent
889ef6f67b
commit
368d01361a
@ -171,6 +171,7 @@ enum srv_init_state {
|
|||||||
#define SRV_F_DEFSRV_USE_SSL 0x4000 /* default-server uses SSL */
|
#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_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_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 */
|
||||||
|
|
||||||
/* configured server options for send-proxy (server->pp_opts) */
|
/* configured server options for send-proxy (server->pp_opts) */
|
||||||
#define SRV_PP_V1 0x0001 /* proxy protocol version 1 */
|
#define SRV_PP_V1 0x0001 /* proxy protocol version 1 */
|
||||||
|
@ -73,7 +73,7 @@ struct server *new_server(struct proxy *proxy);
|
|||||||
void srv_take(struct server *srv);
|
void srv_take(struct server *srv);
|
||||||
struct server *srv_drop(struct server *srv);
|
struct server *srv_drop(struct server *srv);
|
||||||
void srv_free_params(struct server *srv);
|
void srv_free_params(struct server *srv);
|
||||||
int srv_init_per_thr(struct server *srv);
|
int srv_init(struct server *srv);
|
||||||
void srv_set_ssl(struct server *s, int use_ssl);
|
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_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);
|
const char *srv_op_st_chg_cause(enum srv_op_st_chg_cause cause);
|
||||||
|
@ -2817,28 +2817,13 @@ int check_config_validity()
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* we must finish to initialize certain things on the servers,
|
* we must finish to initialize certain things on the servers,
|
||||||
* as some of the per_thr/per_tgrp fields may be accessed soon
|
* as some of the fields may be accessed soon
|
||||||
*/
|
*/
|
||||||
|
|
||||||
MT_LIST_FOR_EACH_ENTRY_LOCKED(newsrv, &servers_list, global_list, back) {
|
MT_LIST_FOR_EACH_ENTRY_LOCKED(newsrv, &servers_list, global_list, back) {
|
||||||
if (srv_init_per_thr(newsrv) == -1) {
|
if (srv_init(newsrv) & ERR_CODE) {
|
||||||
ha_alert("parsing [%s:%d] : failed to allocate per-thread lists for server '%s'.\n",
|
|
||||||
newsrv->conf.file, newsrv->conf.line, newsrv->id);
|
|
||||||
cfgerr++;
|
cfgerr++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* initialize idle conns lists */
|
|
||||||
if (newsrv->max_idle_conns != 0) {
|
|
||||||
newsrv->curr_idle_thr = calloc(global.nbthread, sizeof(*newsrv->curr_idle_thr));
|
|
||||||
if (!newsrv->curr_idle_thr) {
|
|
||||||
ha_alert("parsing [%s:%d] : failed to allocate idle connection tasks for server '%s'.\n",
|
|
||||||
newsrv->conf.file, newsrv->conf.line, newsrv->id);
|
|
||||||
cfgerr++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* starting to initialize the main proxies list */
|
/* starting to initialize the main proxies list */
|
||||||
|
50
src/server.c
50
src/server.c
@ -3343,7 +3343,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
|
* 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
|
* 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
|
* the case during parsing time, in which case the function will be called during
|
||||||
* postparsing thanks to the _srv_postparse() below.
|
* postparsing thanks to the srv_init() below.
|
||||||
*
|
*
|
||||||
* Returns ERR_NONE on success else a combination or ERR_CODE.
|
* Returns ERR_NONE on success else a combination or ERR_CODE.
|
||||||
*/
|
*/
|
||||||
@ -3399,8 +3399,8 @@ static int _srv_check_proxy_mode(struct server *srv, char postparse)
|
|||||||
|
|
||||||
return err_code;
|
return err_code;
|
||||||
}
|
}
|
||||||
|
/* Finish initializing the server after parsing
|
||||||
/* Perform some server postparsing checks / tasks:
|
*
|
||||||
* We must be careful that checks / postinits performed within this function
|
* We must be careful that checks / postinits performed within this function
|
||||||
* don't depend or conflict with other postcheck functions that are registered
|
* don't depend or conflict with other postcheck functions that are registered
|
||||||
* using REGISTER_POST_SERVER_CHECK() hook.
|
* using REGISTER_POST_SERVER_CHECK() hook.
|
||||||
@ -3409,10 +3409,14 @@ static int _srv_check_proxy_mode(struct server *srv, char postparse)
|
|||||||
*/
|
*/
|
||||||
static int init_srv_requeue(struct server *srv);
|
static int init_srv_requeue(struct server *srv);
|
||||||
static int init_srv_slowstart(struct server *srv);
|
static int init_srv_slowstart(struct server *srv);
|
||||||
static int _srv_postparse(struct server *srv)
|
static int srv_init_per_thr(struct server *srv);
|
||||||
|
int srv_init(struct server *srv)
|
||||||
{
|
{
|
||||||
int err_code = ERR_NONE;
|
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);
|
err_code |= _srv_check_proxy_mode(srv, 1);
|
||||||
|
|
||||||
if (err_code & ERR_CODE)
|
if (err_code & ERR_CODE)
|
||||||
@ -3428,10 +3432,29 @@ static int _srv_postparse(struct server *srv)
|
|||||||
if (err_code & ERR_CODE)
|
if (err_code & ERR_CODE)
|
||||||
goto out;
|
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 = calloc(global.nbthread, sizeof(*srv->curr_idle_thr));
|
||||||
|
if (!srv->curr_idle_thr) {
|
||||||
|
ha_alert("memory error during idle conn list init for %s/%s server\n",
|
||||||
|
srv->proxy->id, srv->id);
|
||||||
|
err_code |= ERR_ALERT | ERR_FATAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
if (!(err_code & ERR_CODE))
|
||||||
|
srv->flags |= SRV_F_CHECKED;
|
||||||
return err_code;
|
return err_code;
|
||||||
}
|
}
|
||||||
REGISTER_POST_SERVER_CHECK(_srv_postparse);
|
REGISTER_POST_SERVER_CHECK(srv_init);
|
||||||
|
|
||||||
/* Allocate a new server pointed by <srv> and try to parse the first arguments
|
/* Allocate a new server pointed by <srv> and try to parse the first arguments
|
||||||
* in <args> as an address for a server or an address-range for a template or
|
* in <args> as an address for a server or an address-range for a template or
|
||||||
@ -5793,7 +5816,7 @@ static int init_srv_requeue(struct server *srv)
|
|||||||
/* Memory allocation and initialization of the per_thr field.
|
/* Memory allocation and initialization of the per_thr field.
|
||||||
* Returns 0 if the field has been successfully initialized, -1 on failure.
|
* Returns 0 if the field has been successfully initialized, -1 on failure.
|
||||||
*/
|
*/
|
||||||
int srv_init_per_thr(struct server *srv)
|
static int srv_init_per_thr(struct server *srv)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -5992,19 +6015,6 @@ static int cli_parse_add_server(char **args, char *payload, struct appctx *appct
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (srv_init_per_thr(srv) == -1) {
|
|
||||||
ha_alert("failed to allocate per-thread lists for server.\n");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (srv->max_idle_conns != 0) {
|
|
||||||
srv->curr_idle_thr = calloc(global.nbthread, sizeof(*srv->curr_idle_thr));
|
|
||||||
if (!srv->curr_idle_thr) {
|
|
||||||
ha_alert("failed to allocate counters for server.\n");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!srv_alloc_lb(srv, be)) {
|
if (!srv_alloc_lb(srv, be)) {
|
||||||
ha_alert("Failed to initialize load-balancing data.\n");
|
ha_alert("Failed to initialize load-balancing data.\n");
|
||||||
goto out;
|
goto out;
|
||||||
@ -6051,7 +6061,7 @@ static int cli_parse_add_server(char **args, char *payload, struct appctx *appct
|
|||||||
srv->agent.state &= ~CHK_ST_ENABLED;
|
srv->agent.state &= ~CHK_ST_ENABLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
errcode = _srv_postparse(srv);
|
errcode = srv_init(srv);
|
||||||
if (errcode)
|
if (errcode)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@ -1267,10 +1267,6 @@ struct sink *sink_new_from_logger(struct logger *logger)
|
|||||||
srv->svc_port = get_host_port(logger->target.addr);
|
srv->svc_port = get_host_port(logger->target.addr);
|
||||||
HA_SPIN_INIT(&srv->lock);
|
HA_SPIN_INIT(&srv->lock);
|
||||||
|
|
||||||
/* process per thread init */
|
|
||||||
if (srv_init_per_thr(srv) == -1)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (sink_finalize(sink) & ERR_CODE)
|
if (sink_finalize(sink) & ERR_CODE)
|
||||||
goto error_final;
|
goto error_final;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user