From: Frédéric Lécaille <[email protected]>
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