|
From e56c4f1f76c6731a5a0f4b128540071cffeb1951 Mon Sep 17 00:00:00 2001
|
|
From: Willy Tarreau <w@1wt.eu>
|
|
Date: Tue, 16 Sep 2014 13:21:03 +0200
|
|
Subject: [PATCH 09/13] MEDIUM: config: make the frontends automatically bind
|
|
to the listeners' processes
|
|
|
|
When a frontend does not have any bind-process directive, make it
|
|
automatically bind to the union of all of its listeners' processes
|
|
instead of binding to all processes. That will make it possible to
|
|
have the expected behaviour without having to explicitly specify a
|
|
bind-process directive.
|
|
|
|
Note that if the listeners are not bound to a specific process, the
|
|
default is still to bind to all processes.
|
|
|
|
This change could be backported to 1.5 as it simplifies process
|
|
management, and was planned to be done during the 1.5 development phase.
|
|
(cherry picked from commit b369a045d545b41ef2b250bf747caf83c97e0ca8)
|
|
---
|
|
doc/configuration.txt | 4 ++++
|
|
src/cfgparse.c | 36 ++++++++++++++++++++++++++++++++++++
|
|
2 files changed, 40 insertions(+)
|
|
|
|
diff --git a/doc/configuration.txt b/doc/configuration.txt
|
|
index 3c75c92..1e32057 100644
|
|
--- a/doc/configuration.txt
|
|
+++ b/doc/configuration.txt
|
|
@@ -1905,6 +1905,10 @@ bind-process [ all | odd | even | <number 1-64>[-<number 1-64>] ] ...
|
|
Each "bind" line may further be limited to a subset of the proxy's processes,
|
|
please consult the "process" bind keyword in section 5.1.
|
|
|
|
+ When a frontend has no explicit "bind-process" line, it tries to bind to all
|
|
+ the processes referenced by its "bind" lines. That means that frontends can
|
|
+ easily adapt to their listeners' processes.
|
|
+
|
|
If some backends are referenced by frontends bound to other processes, the
|
|
backend automatically inherits the frontend's processes.
|
|
|
|
diff --git a/src/cfgparse.c b/src/cfgparse.c
|
|
index b9853ef..d53f69e 100644
|
|
--- a/src/cfgparse.c
|
|
+++ b/src/cfgparse.c
|
|
@@ -7175,11 +7175,47 @@ out_uri_auth_compat:
|
|
}
|
|
|
|
/* At this point, target names have already been resolved */
|
|
+
|
|
+ /* Make each frontend inherit bind-process from its listeners when not specified. */
|
|
+ for (curproxy = proxy; curproxy; curproxy = curproxy->next) {
|
|
+ if (curproxy->bind_proc)
|
|
+ continue;
|
|
+
|
|
+ list_for_each_entry(bind_conf, &curproxy->conf.bind, by_fe) {
|
|
+ unsigned long mask;
|
|
+
|
|
+ mask = bind_conf->bind_proc ? bind_conf->bind_proc : ~0UL;
|
|
+ curproxy->bind_proc |= mask;
|
|
+ }
|
|
+
|
|
+ if (!curproxy->bind_proc)
|
|
+ curproxy->bind_proc = ~0UL;
|
|
+ }
|
|
+
|
|
+ if (global.stats_fe) {
|
|
+ list_for_each_entry(bind_conf, &global.stats_fe->conf.bind, by_fe) {
|
|
+ unsigned long mask;
|
|
+
|
|
+ mask = bind_conf->bind_proc ? bind_conf->bind_proc : ~0UL;
|
|
+ global.stats_fe->bind_proc |= mask;
|
|
+ }
|
|
+ if (!global.stats_fe->bind_proc)
|
|
+ global.stats_fe->bind_proc = ~0UL;
|
|
+ }
|
|
+
|
|
+ /* propagate bindings from frontends to backends */
|
|
for (curproxy = proxy; curproxy; curproxy = curproxy->next) {
|
|
if (curproxy->cap & PR_CAP_FE)
|
|
propagate_processes(curproxy, NULL);
|
|
}
|
|
|
|
+ /* Bind each unbound backend to all processes when not specified. */
|
|
+ for (curproxy = proxy; curproxy; curproxy = curproxy->next) {
|
|
+ if (curproxy->bind_proc)
|
|
+ continue;
|
|
+ curproxy->bind_proc = ~0UL;
|
|
+ }
|
|
+
|
|
/* automatically compute fullconn if not set. We must not do it in the
|
|
* loop above because cross-references are not yet fully resolved.
|
|
*/
|
|
--
|
|
1.8.5.5
|
|
|