[MEDIUM] stats: add the "set maxconn" setting to the command line interface
This option permits to change the global maxconn setting within the
limit that was set by the initial value, which is now reported as the
hard maxconn value. This allows to immediately accept more concurrent
connections or to stop accepting new ones until the value passes below
the indicated setting.
The main use of this option is on systems where many haproxy instances
are loaded and admins need to re-adjust resource sharing at run time
to regain a bit of fairness between processes.
diff --git a/src/dumpstats.c b/src/dumpstats.c
index feeb850..c9c4055 100644
--- a/src/dumpstats.c
+++ b/src/dumpstats.c
@@ -1020,8 +1020,42 @@
return 1;
}
+ else if (strcmp(args[2], "global") == 0) {
+ int v;
+
+ if (s->listener->perm.ux.level < ACCESS_LVL_ADMIN) {
+ si->applet.ctx.cli.msg = stats_permission_denied_msg;
+ si->applet.st0 = STAT_CLI_PRINT;
+ return 1;
+ }
+
+ if (!*args[3]) {
+ si->applet.ctx.cli.msg = "Expects an integer value.\n";
+ si->applet.st0 = STAT_CLI_PRINT;
+ return 1;
+ }
+
+ v = atoi(args[3]);
+ if (v > global.hardmaxconn) {
+ si->applet.ctx.cli.msg = "Value out of range.\n";
+ si->applet.st0 = STAT_CLI_PRINT;
+ return 1;
+ }
+
+ /* check for unlimited values */
+ if (v <= 0)
+ v = global.hardmaxconn;
+
+ global.maxconn = v;
+
+ /* Dequeues all of the listeners waiting for a resource */
+ if (!LIST_ISEMPTY(&global_listener_queue))
+ dequeue_all_listeners(&global_listener_queue);
+
+ return 1;
+ }
else {
- si->applet.ctx.cli.msg = "'set maxconn' only supports 'frontend'.\n";
+ si->applet.ctx.cli.msg = "'set maxconn' only supports 'frontend' and 'global'.\n";
si->applet.st0 = STAT_CLI_PRINT;
return 1;
}
@@ -1393,6 +1427,7 @@
"Ulimit-n: %d\n"
"Maxsock: %d\n"
"Maxconn: %d\n"
+ "Hard_maxconn: %d\n"
"Maxpipes: %d\n"
"CurrConns: %d\n"
"PipesUsed: %d\n"
@@ -1409,7 +1444,7 @@
up,
global.rlimit_memmax,
global.rlimit_nofile,
- global.maxsock, global.maxconn, global.maxpipes,
+ global.maxsock, global.maxconn, global.hardmaxconn, global.maxpipes,
actconn, pipes_used, pipes_free,
nb_tasks_cur, run_queue_cur,
global.node, global.desc?global.desc:""