MEDIUM: proxy: zombify proxies only when the expose-fd socket is bound

When HAProxy is running with multiple processes and some listeners
arebound to processes, the unused sockets were not closed in the other
processes. The aim was to be able to send those listening sockets using
the -x option.

However to ensure the previous behavior which was to close those
sockets, we provided the "no-unused-socket" global option.

This patch changes this behavior, it will close unused sockets which are
not in the same process as an expose-fd socket, making the
"no-unused-socket" option useless.

The "no-unused-socket" option was removed in this patch.
This commit is contained in:
William Lallemand 2017-05-26 18:19:55 +02:00 committed by Willy Tarreau
parent f6975e9f76
commit 7f80eb2383
3 changed files with 18 additions and 13 deletions

View File

@ -587,7 +587,6 @@ The following keywords are supported in the "global" section :
- nosplice
- nogetaddrinfo
- noreuseport
- no-unused-socket
- spread-checks
- server-state-base
- server-state-file
@ -1251,12 +1250,6 @@ noreuseport
Disables the use of SO_REUSEPORT - see socket(7). It is equivalent to the
command line argument "-dR".
no-unused-socket
By default, each haproxy process keeps all sockets opened, event those that
are only used by another processes, so that any process can provide all the
sockets, to make reloads seamless. This option disables this, and close all
unused sockets, to save some file descriptors.
spread-checks <0..50, in percent>
Sometimes it is desirable to avoid sending agent and health checks to
servers at exact intervals, for instance when many logical servers are

View File

@ -659,11 +659,6 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm)
goto out;
global.tune.options &= ~GTUNE_USE_REUSEPORT;
}
else if (!strcmp(args[0], "no-unused-socket")) {
if (alertif_too_many_args(0, file, linenum, args, &err_code))
goto out;
global.tune.options &= ~GTUNE_SOCKET_TRANSFER;
}
else if (!strcmp(args[0], "quiet")) {
if (alertif_too_many_args(0, file, linenum, args, &err_code))
goto out;

View File

@ -859,7 +859,6 @@ static void init(int argc, char **argv)
#if defined(SO_REUSEPORT)
global.tune.options |= GTUNE_USE_REUSEPORT;
#endif
global.tune.options |= GTUNE_SOCKET_TRANSFER;
pid = getpid();
progname = *argv;
@ -2165,6 +2164,24 @@ int main(int argc, char **argv)
exit(0); /* parent must leave */
}
/* pass through every cli socket, and check if it's bound to
* the current process and if it exposes listeners sockets.
* Caution: the GTUNE_SOCKET_TRANSFER is now set after the fork.
* */
if (global.stats_fe) {
struct bind_conf *bind_conf;
list_for_each_entry(bind_conf, &global.stats_fe->conf.bind, by_fe) {
if (bind_conf->level & ACCESS_FD_LISTENERS) {
if (!bind_conf->bind_proc || bind_conf->bind_proc & (1UL << proc)) {
global.tune.options |= GTUNE_SOCKET_TRANSFER;
break;
}
}
}
}
/* we might have to unbind some proxies from some processes */
px = proxy;
while (px != NULL) {