From: Frédéric Lécaille <flecai...@haproxy.com> With this patch the "server" lines do not parse anymore the bind address for local peers. We do not use anymore list_for_each_entry() to set the "peers" section listeners parameter because there is only one listener by "peers" section. --- include/proto/server.h | 2 +- src/cfgparse-listen.c | 2 +- src/cfgparse.c | 58 ++++++++++++++++++++++++++++++++------------------ src/server.c | 10 ++++++--- 4 files changed, 46 insertions(+), 26 deletions(-)
diff --git a/include/proto/server.h b/include/proto/server.h index b3a9b877..436ffb5d 100644 --- a/include/proto/server.h +++ b/include/proto/server.h @@ -39,7 +39,7 @@ int srv_downtime(const struct server *s); int srv_lastsession(const struct server *s); int srv_getinter(const struct check *check); -int parse_server(const char *file, int linenum, char **args, struct proxy *curproxy, struct proxy *defproxy); +int parse_server(const char *file, int linenum, char **args, struct proxy *curproxy, struct proxy *defproxy, int parse_addr); int update_server_addr(struct server *s, void *ip, int ip_sin_family, const char *updater); const char *update_server_addr_port(struct server *s, const char *addr, const char *port, char *updater); struct server *server_find_by_id(struct proxy *bk, int id); diff --git a/src/cfgparse-listen.c b/src/cfgparse-listen.c index aa2d8608..fdbdfd34 100644 --- a/src/cfgparse-listen.c +++ b/src/cfgparse-listen.c @@ -677,7 +677,7 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int kwm) if (!strcmp(args[0], "server") || !strcmp(args[0], "default-server") || !strcmp(args[0], "server-template")) { - err_code |= parse_server(file, linenum, args, curproxy, &defproxy); + err_code |= parse_server(file, linenum, args, curproxy, &defproxy, 1); if (err_code & ERR_FATAL) goto out; } diff --git a/src/cfgparse.c b/src/cfgparse.c index 2a6a4839..4d0a9ade 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -623,8 +623,7 @@ int cfg_parse_peers(const char *file, int linenum, char **args, int kwm) bind_conf = bind_conf_uniq_alloc(curpeers->peers_fe, file, linenum, NULL, xprt_get(XPRT_RAW)); if (*args[0] == 'b') { - struct sockaddr_storage *sk; - int port, port1, port2; + struct listener *l; if (peer_line) { ha_alert("parsing [%s:%d] : mixing \"peer\" and \"bind\" line is forbidden\n", file, linenum); @@ -632,13 +631,26 @@ int cfg_parse_peers(const char *file, int linenum, char **args, int kwm) goto out; } - sk = str2sa_range(args[1], &port, &port1, &port2, &errmsg, NULL, NULL, 0); - if (!sk) { - ha_alert("parsing [%s:%d]: '%s %s': %s\n", - file, linenum, args[0], args[1], errmsg); - err_code |= ERR_ALERT | ERR_FATAL; + if (!str2listener(args[1], curpeers->peers_fe, bind_conf, file, linenum, &errmsg)) { + if (errmsg && *errmsg) { + indent_msg(&errmsg, 2); + ha_alert("parsing +[%s:%d] : '%s %s' : %s\n", file, linenum, args[0], args[1], errmsg); + } + else + ha_alert("parsing [%s:%d] : '%s %s' : error encountered while parsing listening address %s.\n", + file, linenum, args[0], args[1], args[2]); + err_code |= ERR_FATAL; goto out; } + l = LIST_ELEM(bind_conf->listeners.n, typeof(l), by_bind); + l->maxaccept = 1; + l->maxconn = curpeers->peers_fe->maxconn; + l->backlog = curpeers->peers_fe->backlog; + l->accept = session_accept_fd; + l->analysers |= curpeers->peers_fe->fe_req_ana; + l->default_target = curpeers->peers_fe->default_target; + l->options |= LI_O_UNLIMITED; /* don't make the peers subject to global limits */ + global.maxsock += l->maxconn; bind_line = 1; if (cfg_peers->local) { @@ -655,7 +667,7 @@ int cfg_parse_peers(const char *file, int linenum, char **args, int kwm) goto out; } } - newpeer->addr = *sk; + newpeer->addr = l->addr; newpeer->proto = protocol_by_family(newpeer->addr.ss_family); cur_arg++; } @@ -698,7 +710,7 @@ int cfg_parse_peers(const char *file, int linenum, char **args, int kwm) err_code |= ERR_ALERT | ERR_ABORT; goto out; } - err_code |= parse_server(file, linenum, args, curpeers->peers_fe, NULL); + err_code |= parse_server(file, linenum, args, curpeers->peers_fe, NULL, 0); } else if (strcmp(args[0], "peers") == 0) { /* new peers section */ /* Initialize these static variables when entering a new "peers" section*/ @@ -792,7 +804,7 @@ int cfg_parse_peers(const char *file, int linenum, char **args, int kwm) } /* This initializes curpeer->peers->peers_fe->srv. */ - err_code |= parse_server(file, linenum, args, curpeers->peers_fe, NULL); + err_code |= parse_server(file, linenum, args, curpeers->peers_fe, NULL, !local_peer); if (!curpeers->peers_fe->srv) goto out; @@ -807,12 +819,16 @@ int cfg_parse_peers(const char *file, int linenum, char **args, int kwm) goto out; } + /* The lines above are reserved to "peer" lines. */ + if (*args[0] == 's') + goto out; + bind_conf = bind_conf_uniq_alloc(curpeers->peers_fe, file, linenum, args[2], xprt_get(XPRT_RAW)); if (!str2listener(args[2], curpeers->peers_fe, bind_conf, file, linenum, &errmsg)) { if (errmsg && *errmsg) { indent_msg(&errmsg, 2); - ha_alert("parsing [%s:%d] : '%s %s' : %s\n", file, linenum, args[0], args[1], errmsg); + ha_alert("parsing +[%s:%d] : '%s %s' : %s\n", file, linenum, args[0], args[1], errmsg); } else ha_alert("parsing [%s:%d] : '%s %s' : error encountered while parsing listening address %s.\n", @@ -820,16 +836,16 @@ int cfg_parse_peers(const char *file, int linenum, char **args, int kwm) err_code |= ERR_FATAL; goto out; } - list_for_each_entry(l, &bind_conf->listeners, by_bind) { - l->maxaccept = 1; - l->maxconn = curpeers->peers_fe->maxconn; - l->backlog = curpeers->peers_fe->backlog; - l->accept = session_accept_fd; - l->analysers |= curpeers->peers_fe->fe_req_ana; - l->default_target = curpeers->peers_fe->default_target; - l->options |= LI_O_UNLIMITED; /* don't make the peers subject to global limits */ - global.maxsock += l->maxconn; - } + + l = LIST_ELEM(bind_conf->listeners.n, typeof(l), by_bind); + l->maxaccept = 1; + l->maxconn = curpeers->peers_fe->maxconn; + l->backlog = curpeers->peers_fe->backlog; + l->accept = session_accept_fd; + l->analysers |= curpeers->peers_fe->fe_req_ana; + l->default_target = curpeers->peers_fe->default_target; + l->options |= LI_O_UNLIMITED; /* don't make the peers subject to global limits */ + global.maxsock += l->maxconn; } /* neither "peer" nor "peers" */ else if (!strcmp(args[0], "disabled")) { /* disables this peers section */ curpeers->state = PR_STSTOPPED; diff --git a/src/server.c b/src/server.c index 7f8b2855..f1327d8f 100644 --- a/src/server.c +++ b/src/server.c @@ -2077,7 +2077,7 @@ static int server_template_init(struct server *srv, struct proxy *px) return i - srv->tmpl_info.nb_low; } -int parse_server(const char *file, int linenum, char **args, struct proxy *curproxy, struct proxy *defproxy) +int parse_server(const char *file, int linenum, char **args, struct proxy *curproxy, struct proxy *defproxy, int parse_addr) { struct server *newsrv = NULL; const char *err = NULL; @@ -2105,7 +2105,7 @@ int parse_server(const char *file, int linenum, char **args, struct proxy *curpr err_code |= ERR_WARN; /* There is no mandatory first arguments for default server. */ - if (srv) { + if (srv && parse_addr) { if (!*args[2]) { /* 'server' line number of argument check. */ ha_alert("parsing [%s:%d] : '%s' expects <name> and <addr>[:<port>] as arguments.\n", @@ -2185,6 +2185,9 @@ int parse_server(const char *file, int linenum, char **args, struct proxy *curpr * - IP:+N => port=+N, relative * - IP:-N => port=-N, relative */ + if (!parse_addr) + goto skip_addr; + sk = str2sa_range(args[cur_arg], &port, &port1, &port2, &errmsg, NULL, &fqdn, 0); if (!sk) { ha_alert("parsing [%s:%d] : '%s %s' : %s\n", file, linenum, args[0], args[1], errmsg); @@ -2241,10 +2244,11 @@ int parse_server(const char *file, int linenum, char **args, struct proxy *curpr goto out; } + cur_arg++; + skip_addr: /* Copy default server settings to new server settings. */ srv_settings_cpy(newsrv, &curproxy->defsrv, 0); HA_SPIN_INIT(&newsrv->lock); - cur_arg++; } else { newsrv = &curproxy->defsrv; cur_arg = 1; -- 2.11.0