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.
This commit is contained in:
Emeric Brun 2020-10-07 10:13:10 +02:00 committed by Willy Tarreau
parent a39ecbdac1
commit c47ba59d1e
2 changed files with 36 additions and 0 deletions

View File

@ -3499,6 +3499,20 @@ int main(int argc, char **argv)
px = px->next; 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 */ /* we might have to unbind some peers sections from some processes */
for (curpeers = cfg_peers; curpeers; curpeers = curpeers->next) { for (curpeers = cfg_peers; curpeers; curpeers = curpeers->next) {
if (!curpeers->peers_fe) if (!curpeers->peers_fe)

View File

@ -1275,6 +1275,28 @@ void soft_stop(void)
stop_proxy(prs->peers_fe); stop_proxy(prs->peers_fe);
prs = prs->next; 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 zero is used to broadcast the "stopping" event */
signal_handler(0); signal_handler(0);
} }