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

Signed-off-by: Nenad Merdanovic <nmer...@haproxy.com>
---
 doc/configuration.txt |  7 +++++++
 src/backend.c         | 35 ++++++++++++++++++++++++++++++++++-
 2 files changed, 41 insertions(+), 1 deletion(-)

diff --git a/doc/configuration.txt b/doc/configuration.txt
index 4e18f0f6..20c39c77 100644
--- a/doc/configuration.txt
+++ b/doc/configuration.txt
@@ -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
diff --git a/src/backend.c b/src/backend.c
index 917b612b..1b01536c 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 <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 */ },
 }};
 
-- 
2.19.1


Reply via email to