From c47ba59d1e8b1f758967f0cf0e129ca4d8d88d0a Mon Sep 17 00:00:00 2001 From: Emeric Brun Date: Wed, 7 Oct 2020 10:13:10 +0200 Subject: [PATCH] BUG/MEDIUM: log: old processes with log foward section don't die on soft stop. Old processes didn't die if a log foward section is declared and a soft stop is requested. This patch fix this issue and should be backpored in banches including the log forward feature. --- src/haproxy.c | 14 ++++++++++++++ src/proxy.c | 22 ++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/haproxy.c b/src/haproxy.c index 49f3fbd89..eb4e9699a 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -3499,6 +3499,20 @@ int main(int argc, char **argv) px = px->next; } + /* we might have to unbind some log forward proxies from some processes */ + px = cfg_log_forward; + while (px != NULL) { + if (px->bind_proc && px->state != PR_STSTOPPED) { + if (!(px->bind_proc & (1UL << proc))) { + if (global.tune.options & GTUNE_SOCKET_TRANSFER) + zombify_proxy(px); + else + stop_proxy(px); + } + } + px = px->next; + } + /* we might have to unbind some peers sections from some processes */ for (curpeers = cfg_peers; curpeers; curpeers = curpeers->next) { if (!curpeers->peers_fe) diff --git a/src/proxy.c b/src/proxy.c index 18cdf426e..eeb492e53 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -1275,6 +1275,28 @@ void soft_stop(void) stop_proxy(prs->peers_fe); prs = prs->next; } + + p = cfg_log_forward; + while (p) { + /* Zombie proxy, let's close the file descriptors */ + if (p->state == PR_STSTOPPED && + !LIST_ISEMPTY(&p->conf.listeners) && + LIST_ELEM(p->conf.listeners.n, + struct listener *, by_fe)->state > LI_ASSIGNED) { + struct listener *l; + list_for_each_entry(l, &p->conf.listeners, by_fe) { + if (l->state > LI_ASSIGNED) + close(l->rx.fd); + l->state = LI_INIT; + } + } + + if (p->state != PR_STSTOPPED) { + stop_proxy(p); + } + p = p->next; + } + /* signal zero is used to broadcast the "stopping" event */ signal_handler(0); }