MEDIUM: init: stop disabled proxies after initializing fdtab
During the startup process we don't have any fdtab nor fd_updt for quite a long time, and as such some operations on the listeners are not permitted, such as fd_want_*/fd_stop_* or fd_delete(). The latter is of particular concern because it's used when stopping a disabled frontend, and it's performed very early during check_config_validity() while there is no fdtab yet. The trick till now relies on the listener's state which is a bit brittle. There is absolutely no valid reason for stopping a proxy's listeners this early, we can postpone it after init_pollers() which will at least have allocated fdtab.
This commit is contained in:
parent
cb89e32f31
commit
02b092f006
@ -2235,10 +2235,13 @@ int check_config_validity()
|
||||
|
||||
|
||||
if (curproxy->state == PR_STSTOPPED) {
|
||||
/* ensure we don't keep listeners uselessly bound */
|
||||
stop_proxy(curproxy);
|
||||
/* ensure we don't keep listeners uselessly bound. We
|
||||
* can't disable their listeners yet (fdtab not
|
||||
* allocated yet) but let's skip them.
|
||||
*/
|
||||
if (curproxy->table) {
|
||||
free((void *)curproxy->table->peers.name);
|
||||
curproxy->table->peers.name = NULL;
|
||||
curproxy->table->peers.p = NULL;
|
||||
}
|
||||
continue;
|
||||
|
@ -2338,6 +2338,12 @@ static void init(int argc, char **argv)
|
||||
if (!global.node)
|
||||
global.node = strdup(hostname);
|
||||
|
||||
/* stop disabled proxies */
|
||||
for (px = proxies_list; px; px = px->next) {
|
||||
if (px->state == PR_STSTOPPED)
|
||||
stop_proxy(px);
|
||||
}
|
||||
|
||||
if (!hlua_post_init())
|
||||
exit(1);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user