From: Willy Tarreau Date: Wed, 7 Oct 2020 14:52:43 +0000 (+0200) Subject: MEDIUM: proxy: make soft_stop() stop most listeners using protocol_stop_now() X-Git-Tag: v2.3-dev6~16 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=626f3a7beb33f921b7b13fda4d1d585160fe2051;p=thirdparty%2Fhaproxy.git MEDIUM: proxy: make soft_stop() stop most listeners using protocol_stop_now() One difficulty in soft-stopping is to make sure not to forget unlisted listeners. By first doing a pass using protocol_stop_now() we catch the vast majority of them. The few remaining ones are the ones belonging to a proxy having a grace period. For these ones, the proxy will arm its stop_time timer and emit a log message. Since neither UDP listeners nor peers use the grace period, we can already get rid of the special cases there since we know they will have been stopped by the protocols. --- diff --git a/src/proxy.c b/src/proxy.c index a77ad0a8f9..79ba5a679b 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -1231,7 +1232,6 @@ struct task *hard_stop(struct task *t, void *context, unsigned short state) void soft_stop(void) { struct proxy *p; - struct peers *prs; struct task *task; stopping = 1; @@ -1247,6 +1247,12 @@ void soft_stop(void) ha_alert("out of memory trying to allocate the hard-stop task.\n"); } } + + /* stop all stoppable listeners, resulting in disabling all proxies + * that don't use a grace period. + */ + protocol_stop_now(); + p = proxies_list; tv_update_date(0,1); /* else, the old time before select will be used */ while (p) { @@ -1267,34 +1273,6 @@ void soft_stop(void) p = p->next; } - prs = cfg_peers; - while (prs) { - if (prs->peers_fe) - stop_proxy(prs->peers_fe); - prs = prs->next; - } - - p = cfg_log_forward; - while (p) { - /* Zombie proxy, let's close the file descriptors */ - if (p->disabled && - !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->disabled) { - stop_proxy(p); - } - p = p->next; - } - /* signal zero is used to broadcast the "stopping" event */ signal_handler(0); }