MINOR: cli: ability to set per-server maxconn

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.
This commit is contained in:
Andrew Hayworth 2015-10-27 21:46:25 +00:00 committed by Willy Tarreau
parent d1b0f7c3e0
commit edb93a7c28
2 changed files with 38 additions and 1 deletions

View 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

View 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;
}