mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-07 15:47:01 +02:00
[BUG] ensure that listeners from disabled proxies are correctly unbound.
There is a problem when an instance is marked "disabled". Its ports are
still bound but will not be unbound upon termination. This causes processes
to accumulate during soft restarts, and might even cause failures to restart
new ones due to the inability to bind to the same port.
The ideal solution would be to bind all ports at the end of the configuration
parsing. An acceptable workaround is to unbind all listeners of disabled
proxies. This is what the current patch does.
(cherry picked from commit a944218e9c
)
(cherry picked from commit 8cfebbb82b87345bade831920177077e7d25840a)
This commit is contained in:
parent
f8fbcef83c
commit
da250db376
@ -31,6 +31,7 @@ int start_proxies(int verbose);
|
|||||||
void maintain_proxies(int *next);
|
void maintain_proxies(int *next);
|
||||||
void soft_stop(void);
|
void soft_stop(void);
|
||||||
void pause_proxy(struct proxy *p);
|
void pause_proxy(struct proxy *p);
|
||||||
|
void stop_proxy(struct proxy *p);
|
||||||
void pause_proxies(void);
|
void pause_proxies(void);
|
||||||
void listen_proxies(void);
|
void listen_proxies(void);
|
||||||
|
|
||||||
|
@ -2867,6 +2867,8 @@ int readcfgfile(const char *file)
|
|||||||
struct listener *listener;
|
struct listener *listener;
|
||||||
|
|
||||||
if (curproxy->state == PR_STSTOPPED) {
|
if (curproxy->state == PR_STSTOPPED) {
|
||||||
|
/* ensure we don't keep listeners uselessly bound */
|
||||||
|
stop_proxy(curproxy);
|
||||||
curproxy = curproxy->next;
|
curproxy = curproxy->next;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
32
src/proxy.c
32
src/proxy.c
@ -351,15 +351,7 @@ void maintain_proxies(int *next)
|
|||||||
if (t == 0) {
|
if (t == 0) {
|
||||||
Warning("Proxy %s stopped.\n", p->id);
|
Warning("Proxy %s stopped.\n", p->id);
|
||||||
send_log(p, LOG_WARNING, "Proxy %s stopped.\n", p->id);
|
send_log(p, LOG_WARNING, "Proxy %s stopped.\n", p->id);
|
||||||
|
stop_proxy(p);
|
||||||
for (l = p->listen; l != NULL; l = l->next) {
|
|
||||||
unbind_listener(l);
|
|
||||||
if (l->state >= LI_ASSIGNED) {
|
|
||||||
delete_listener(l);
|
|
||||||
listeners--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p->state = PR_STSTOPPED;
|
|
||||||
/* try to free more memory */
|
/* try to free more memory */
|
||||||
pool_gc2();
|
pool_gc2();
|
||||||
}
|
}
|
||||||
@ -421,6 +413,28 @@ void pause_proxy(struct proxy *p)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function completely stops a proxy and releases its listeners. It has
|
||||||
|
* to be called when going down in order to release the ports so that another
|
||||||
|
* process may bind to them. It must also be called on disabled proxies at the
|
||||||
|
* end of start-up. When all listeners are closed, the proxy is set to the
|
||||||
|
* PR_STSTOPPED state.
|
||||||
|
*/
|
||||||
|
void stop_proxy(struct proxy *p)
|
||||||
|
{
|
||||||
|
struct listener *l;
|
||||||
|
|
||||||
|
for (l = p->listen; l != NULL; l = l->next) {
|
||||||
|
unbind_listener(l);
|
||||||
|
if (l->state >= LI_ASSIGNED) {
|
||||||
|
delete_listener(l);
|
||||||
|
listeners--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p->state = PR_STSTOPPED;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function temporarily disables listening so that another new instance
|
* This function temporarily disables listening so that another new instance
|
||||||
* can start listening. It is designed to be called upon reception of a
|
* can start listening. It is designed to be called upon reception of a
|
||||||
|
Loading…
Reference in New Issue
Block a user