MINOR: init: make the maxpipe computation more accurate
The default number of pipes is adjusted based on the sum of frontends
and backends maxconn/fullconn settings. Now that it is possible to have
a null maxconn on a frontend to indicate "unlimited" with commit
c8d5b95e6 ("MEDIUM: config: don't enforce a low frontend maxconn value
anymore"), the sum of maxconn may remain low and limited to the only
frontends/backends where this limit is set.
This patch considers this new unlimited case when doing the check, and
automatically switches to the default value which is maxconn/4 in this
case. All the calculation was moved to a distinct function for ease of
use. This function also supports returning unlimited (-1) when the
value depends on global.maxconn and this latter is not yet set.
diff --git a/src/haproxy.c b/src/haproxy.c
index 40865f0..21bfcbd 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -1402,6 +1402,53 @@
return newargv;
}
+/* considers splicing proxies' maxconn, computes the ideal global.maxpipes
+ * setting, and returns it. It may return -1 meaning "unlimited" if some
+ * unlimited proxies have been found and the global.maxconn value is not yet
+ * set. It may also return a value greater than maxconn if it's not yet set.
+ * Note that a value of zero means there is no need for pipes. -1 is never
+ * returned if global.maxconn is valid.
+ */
+static int compute_ideal_maxpipes()
+{
+ struct proxy *cur;
+ int nbfe = 0, nbbe = 0;
+ int unlimited = 0;
+ int pipes;
+ int max;
+
+ for (cur = proxies_list; cur; cur = cur->next) {
+ if (cur->options2 & (PR_O2_SPLIC_ANY)) {
+ if (cur->cap & PR_CAP_FE) {
+ max = cur->maxconn;
+ nbfe += max;
+ if (!max) {
+ unlimited = 1;
+ break;
+ }
+ }
+ if (cur->cap & PR_CAP_BE) {
+ max = cur->fullconn ? cur->fullconn : global.maxconn;
+ nbbe += max;
+ if (!max) {
+ unlimited = 1;
+ break;
+ }
+ }
+ }
+ }
+
+ pipes = MAX(nbfe, nbbe);
+ if (global.maxconn) {
+ if (pipes > global.maxconn || unlimited)
+ pipes = global.maxconn;
+ } else if (unlimited) {
+ pipes = -1;
+ }
+
+ return pipes >= 4 ? pipes / 4 : pipes;
+}
+
/*
* This function initializes all the necessary variables. It only returns
* if everything is OK. If something fails, it exits.
@@ -2037,29 +2084,10 @@
}
fprintf(stderr, "Note: setting global.maxconn to %d\n", global.maxconn);
}
- }
-
- if (!global.maxpipes) {
- /* maxpipes not specified. Count how many frontends and backends
- * may be using splicing, and bound that to maxconn.
- */
- struct proxy *cur;
- int nbfe = 0, nbbe = 0;
-
- for (cur = proxies_list; cur; cur = cur->next) {
- if (cur->options2 & (PR_O2_SPLIC_ANY)) {
- if (cur->cap & PR_CAP_FE)
- nbfe += cur->maxconn;
- if (cur->cap & PR_CAP_BE)
- nbbe += cur->fullconn ? cur->fullconn : global.maxconn;
- }
- }
- global.maxpipes = MAX(nbfe, nbbe);
- if (global.maxpipes > global.maxconn)
- global.maxpipes = global.maxconn;
- global.maxpipes /= 4;
}
+ if (!global.maxpipes)
+ global.maxpipes = compute_ideal_maxpipes();
global.hardmaxconn = global.maxconn; /* keep this max value */
global.maxsock += global.maxconn * 2; /* each connection needs two sockets */