MINOR: backend: Add srv_queue converter

The converter can be useful to look up a server queue from a dynamic value.

It takes an input value of type string, either a server name or
<backend>/<server> format and returns the number of queued sessions
on that server. Can be used in places where we want to look up
queued sessions from a dynamic name, like a cookie value (e.g.
req.cook(SRVID),srv_queue) and then make a decision to break
persistence or direct a request elsewhere.

Signed-off-by: Nenad Merdanovic <nmerdan@haproxy.com>
This commit is contained in:
Nenad Merdanovic 2019-08-27 01:58:13 +02:00 committed by Willy Tarreau
parent 2dd26ca9ff
commit 177adc9e57
2 changed files with 41 additions and 1 deletions

View File

@ -13622,6 +13622,13 @@ sha2([<bits>])
Please note that this converter is only available when haproxy has been
compiled with USE_OPENSSL.
srv_queue
Takes an input value of type string, either a server name or <backend>/<server>
format and returns the number of queued sessions on that server. Can be used
in places where we want to look up queued sessions from a dynamic name, like a
cookie value (e.g. req.cook(SRVID),srv_queue) and then make a decision to break
persistence or direct a request elsewhere.
strcmp(<var>)
Compares the contents of <var> with the input value of type string. Returns
the result as a signed integer compatible with strcmp(3): 0 if both strings

View File

@ -2286,6 +2286,38 @@ static int sample_conv_nbsrv(const struct arg *args, struct sample *smp, void *p
return 1;
}
static int
sample_conv_srv_queue(const struct arg *args, struct sample *smp, void *private)
{
struct proxy *px;
struct server *srv;
char *bksep;
if (!smp_make_safe(smp))
return 0;
bksep = strchr(smp->data.u.str.area, '/');
if (bksep) {
*bksep = '\0';
px = proxy_find_by_name(smp->data.u.str.area, PR_CAP_BE, 0);
if (!px)
return 0;
smp->data.u.str.area = bksep + 1;
} else {
if (!(smp->px->cap & PR_CAP_BE))
return 0;
px = smp->px;
}
srv = server_find_by_name(px, smp->data.u.str.area);
if (!srv)
return 0;
smp->data.type = SMP_T_SINT;
smp->data.u.sint = srv->nbpend;
return 1;
}
/* Note: must not be declared <const> as its list will be overwritten.
* Please take care of keeping this list alphabetically sorted.
@ -2313,7 +2345,8 @@ INITCALL1(STG_REGISTER, sample_register_fetches, &smp_kws);
/* Note: must not be declared <const> as its list will be overwritten */
static struct sample_conv_kw_list sample_conv_kws = {ILH, {
{ "nbsrv", sample_conv_nbsrv, 0, NULL, SMP_T_STR, SMP_T_SINT },
{ "nbsrv", sample_conv_nbsrv, 0, NULL, SMP_T_STR, SMP_T_SINT },
{ "srv_queue", sample_conv_srv_queue, 0, NULL, SMP_T_STR, SMP_T_SINT },
{ /* END */ },
}};