mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-02-24 14:46:56 +00:00
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:
parent
2dd26ca9ff
commit
177adc9e57
@ -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
|
||||
|
@ -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 */ },
|
||||
}};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user