From: Nenad Merdanovic Date: Mon, 26 Aug 2019 23:58:13 +0000 (+0200) Subject: MINOR: backend: Add srv_queue converter X-Git-Tag: v2.1-dev2~171 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=177adc9e570573501eaf0a2431ca89d363b374af;p=thirdparty%2Fhaproxy.git 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 / 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 --- diff --git a/doc/configuration.txt b/doc/configuration.txt index 4e18f0f6e5..20c39c7735 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -13622,6 +13622,13 @@ sha2([]) 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 / + 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() Compares the contents of with the input value of type string. Returns the result as a signed integer compatible with strcmp(3): 0 if both strings diff --git a/src/backend.c b/src/backend.c index 917b612b48..1b01536c1d 100644 --- a/src/backend.c +++ b/src/backend.c @@ -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 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 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 */ }, }};