|
From 91b00c2194b728ccd61133cca83f03de3650b674 Mon Sep 17 00:00:00 2001
|
|
From: Willy Tarreau <w@1wt.eu>
|
|
Date: Tue, 16 Sep 2014 13:41:21 +0200
|
|
Subject: [PATCH 10/13] MEDIUM: config: compute the exact bind-process before
|
|
listener's maxaccept
|
|
|
|
This is a continuation of previous patch, the listener's maxaccept is divided
|
|
by the number of processes, so it's best if we can swap the two blocks so that
|
|
the number of processes is already known when computing the maxaccept value.
|
|
(cherry picked from commit 419ead8eca9237f9cc2ec32630d96fde333282ee)
|
|
---
|
|
src/cfgparse.c | 156 ++++++++++++++++++++++++++++++---------------------------
|
|
1 file changed, 81 insertions(+), 75 deletions(-)
|
|
|
|
diff --git a/src/cfgparse.c b/src/cfgparse.c
|
|
index d53f69e..f3907bf 100644
|
|
--- a/src/cfgparse.c
|
|
+++ b/src/cfgparse.c
|
|
@@ -6042,12 +6042,11 @@ int check_config_validity()
|
|
proxy = next;
|
|
}
|
|
|
|
- while (curproxy != NULL) {
|
|
+ for (curproxy = proxy; curproxy; curproxy = curproxy->next) {
|
|
struct switching_rule *rule;
|
|
struct server_rule *srule;
|
|
struct sticking_rule *mrule;
|
|
struct tcp_rule *trule;
|
|
- struct listener *listener;
|
|
unsigned int next_id;
|
|
int nbproc;
|
|
|
|
@@ -6115,14 +6114,6 @@ int check_config_validity()
|
|
}
|
|
}
|
|
|
|
- /* 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.
|
|
- */
|
|
-
|
|
- nbproc = global.nbproc;
|
|
- if (curproxy->bind_proc)
|
|
- nbproc = popcount(curproxy->bind_proc & nbits(global.nbproc));
|
|
-
|
|
if (global.nbproc > 1 && curproxy->table.peers.name) {
|
|
Alert("Proxy '%s': peers can't be used in multi-process mode (nbproc > 1).\n",
|
|
curproxy->id);
|
|
@@ -7005,6 +6996,86 @@ out_uri_auth_compat:
|
|
if (curproxy->options2 & PR_O2_RDPC_PRST)
|
|
curproxy->be_req_ana |= AN_REQ_PRST_RDP_COOKIE;
|
|
}
|
|
+ }
|
|
+
|
|
+ /***********************************************************/
|
|
+ /* At this point, target names have already been resolved. */
|
|
+ /***********************************************************/
|
|
+
|
|
+ /* Check multi-process mode compatibility */
|
|
+
|
|
+ if (global.nbproc > 1 && global.stats_fe) {
|
|
+ list_for_each_entry(bind_conf, &global.stats_fe->conf.bind, by_fe) {
|
|
+ unsigned long mask;
|
|
+
|
|
+ mask = nbits(global.nbproc);
|
|
+ if (global.stats_fe->bind_proc)
|
|
+ mask &= global.stats_fe->bind_proc;
|
|
+
|
|
+ if (bind_conf->bind_proc)
|
|
+ mask &= bind_conf->bind_proc;
|
|
+
|
|
+ /* stop here if more than one process is used */
|
|
+ if (popcount(mask) > 1)
|
|
+ break;
|
|
+ }
|
|
+ if (&bind_conf->by_fe != &global.stats_fe->conf.bind) {
|
|
+ Warning("stats socket will not work as expected in multi-process mode (nbproc > 1), you should force process binding globally using 'stats bind-process' or per socket using the 'process' attribute.\n");
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* 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;
|
|
+ }
|
|
+
|
|
+ /*******************************************************/
|
|
+ /* At this step, all proxies have a non-null bind_proc */
|
|
+ /*******************************************************/
|
|
+
|
|
+ /* perform the final checks before creating tasks */
|
|
+
|
|
+ for (curproxy = proxy; curproxy; curproxy = curproxy->next) {
|
|
+ struct listener *listener;
|
|
+ unsigned int next_id;
|
|
+ int nbproc;
|
|
+
|
|
+ nbproc = popcount(curproxy->bind_proc & nbits(global.nbproc));
|
|
|
|
#ifdef USE_OPENSSL
|
|
/* Configure SSL for each bind line.
|
|
@@ -7149,71 +7220,6 @@ out_uri_auth_compat:
|
|
curproxy->id);
|
|
cfgerr++;
|
|
}
|
|
-
|
|
- curproxy = curproxy->next;
|
|
- }
|
|
-
|
|
- /* Check multi-process mode compatibility */
|
|
- if (global.nbproc > 1 && global.stats_fe) {
|
|
- list_for_each_entry(bind_conf, &global.stats_fe->conf.bind, by_fe) {
|
|
- unsigned long mask;
|
|
-
|
|
- mask = nbits(global.nbproc);
|
|
- if (global.stats_fe->bind_proc)
|
|
- mask &= global.stats_fe->bind_proc;
|
|
-
|
|
- if (bind_conf->bind_proc)
|
|
- mask &= bind_conf->bind_proc;
|
|
-
|
|
- /* stop here if more than one process is used */
|
|
- if (popcount(mask) > 1)
|
|
- break;
|
|
- }
|
|
- if (&bind_conf->by_fe != &global.stats_fe->conf.bind) {
|
|
- Warning("stats socket will not work as expected in multi-process mode (nbproc > 1), you should force process binding globally using 'stats bind-process' or per socket using the 'process' attribute.\n");
|
|
- }
|
|
- }
|
|
-
|
|
- /* 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
|
|
--
|
|
1.8.5.5
|
|
|