MEDIUM: listener: inherit the process mask from the proxy
When a process list is specified on either the proxy or the bind lines,
the latter is refined to the intersection of the two. A warning is emitted
if no intersection is found, and the situation is fixed by either falling
back to the first process of the proxy or to all processes.
diff --git a/src/cfgparse.c b/src/cfgparse.c
index 0920eac..23e2bdd 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -5870,6 +5870,33 @@
}
}
+ /* check and reduce the bind-proc of each listener */
+ list_for_each_entry(bind_conf, &curproxy->conf.bind, by_fe) {
+ unsigned long mask;
+
+ if (!bind_conf->bind_proc)
+ continue;
+
+ mask = nbits(global.nbproc);
+ if (curproxy->bind_proc)
+ mask &= curproxy->bind_proc;
+ /* mask cannot be null here thanks to the previous checks */
+
+ nbproc = popcount(bind_conf->bind_proc);
+ bind_conf->bind_proc &= mask;
+
+ if (!bind_conf->bind_proc && nbproc == 1) {
+ Warning("Proxy '%s': the process number specified on the 'process' directive of 'bind %s' at [%s:%d] refers to a process not covered by the proxy. This has been fixed by forcing it to run on the proxy's first process only.\n",
+ curproxy->id, bind_conf->arg, bind_conf->file, bind_conf->line);
+ bind_conf->bind_proc = mask & ~(mask - 1);
+ }
+ else if (!bind_conf->bind_proc && nbproc > 1) {
+ Warning("Proxy '%s': the process range specified on the 'process' directive of 'bind %s' at [%s:%d] only refers to processes not covered by the proxy. The directive was ignored so that all of the proxy's processes are used.\n",
+ curproxy->id, bind_conf->arg, bind_conf->file, bind_conf->line);
+ bind_conf->bind_proc = 0;
+ }
+ }
+
/* here, if bind_proc is null, it means no limit, otherwise it's explicit.
* We now check how many processes the proxy will effectively run on.
*/