]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: cli: ability to set per-server maxconn
authorAndrew Hayworth <andrew.hayworth@getbraintree.com>
Tue, 27 Oct 2015 21:46:25 +0000 (21:46 +0000)
committerWilly Tarreau <w@1wt.eu>
Wed, 28 Oct 2015 07:01:56 +0000 (08:01 +0100)
This commit adds support for setting a per-server maxconn from the stats
socket. The only really notable part of this commit is that we need to
check if maxconn == minconn before changing things, as this indicates
that we are NOT using dynamic maxconn. When we are not using dynamic
maxconn, we should update maxconn/minconn in lockstep.

doc/management.txt
src/dumpstats.c

index d67988b422cff93a78da05947490ec93562a9032..a53a953a3cde9a895b05d3d54fbdfd44f47ced26 100644 (file)
@@ -1356,6 +1356,11 @@ set maxconn frontend <frontend> <value>
   delayed until the threshold is reached. The frontend might be specified by
   either its name or its numeric ID prefixed with a sharp ('#').
 
+set maxconn server <backend/server> <value>
+  Dynamically change the specified server's maxconn setting. Any positive
+  value is allowed including zero, but setting values larger than the global
+  maxconn does not make much sense.
+
 set maxconn global <maxconn>
   Dynamically change the global maxconn setting within the range defined by the
   initial global maxconn setting. If it is increased and connections were
index e80e45c91dfd56c37c641d1baade15fb04fec050..b83dfb80b6bf7d39e7d3b172d51da43aab36728c 100644 (file)
@@ -1646,6 +1646,38 @@ static int stats_sock_parse_request(struct stream_interface *si, char *line)
 
                                return 1;
                        }
+                       else if (strcmp(args[2], "server") == 0) {
+                               struct server *sv;
+                               int v;
+
+                               sv = expect_server_admin(s, si, args[3]);
+                               if (!sv)
+                                       return 1;
+
+                               if (!*args[4]) {
+                                       appctx->ctx.cli.msg = "Integer value expected.\n";
+                                       appctx->st0 = STAT_CLI_PRINT;
+                                       return 1;
+                               }
+
+                               v = atoi(args[4]);
+                               if (v < 0) {
+                                       appctx->ctx.cli.msg = "Value out of range.\n";
+                                       appctx->st0 = STAT_CLI_PRINT;
+                                       return 1;
+                               }
+
+                               if (sv->maxconn == sv->minconn) { // static maxconn
+                                       sv->maxconn = sv->minconn = v;
+                               } else { // dynamic maxconn
+                                       sv->maxconn = v;
+                               }
+
+                               if (may_dequeue_tasks(sv, sv->proxy))
+                                       process_srv_queue(sv);
+
+                               return 1;
+                       }
                        else if (strcmp(args[2], "global") == 0) {
                                int v;
 
@@ -1681,7 +1713,7 @@ static int stats_sock_parse_request(struct stream_interface *si, char *line)
                                return 1;
                        }
                        else {
-                               appctx->ctx.cli.msg = "'set maxconn' only supports 'frontend' and 'global'.\n";
+                               appctx->ctx.cli.msg = "'set maxconn' only supports 'frontend', 'server', and 'global'.\n";
                                appctx->st0 = STAT_CLI_PRINT;
                                return 1;
                        }