]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: connection: Add a connection error code sample fetch for backend side
authorRemi Tricot-Le Breton <rlebreton@haproxy.com>
Wed, 1 Sep 2021 13:52:15 +0000 (15:52 +0200)
committerWilliam Lallemand <wlallemand@haproxy.org>
Wed, 1 Sep 2021 20:55:54 +0000 (22:55 +0200)
The bc_conn_err and bc_conn_err_str sample fetches give the status of
the connection on the backend side. The error codes and error messages
are the same than the ones that can be raised by the fc_conn_err fetch.

doc/configuration.txt
src/connection.c

index dbbf19ea1a42cef7fcdd1a430a7bbc12911d9d31..f524dda3bf39592423b7301d60b74957dc63c7d9 100644 (file)
@@ -17733,6 +17733,17 @@ table may be specified with the "sc*" form, in which case the currently
 tracked key will be looked up into this alternate table instead of the table
 currently being tracked.
 
+bc_conn_err : integer
+  Returns the ID of the error that might have occurred on the current backend
+  connection. See the "fc_conn_err_str" fetch for a full list of error codes
+  and their corresponding error message.
+
+bc_conn_err_str : string
+  Returns an error message describing what problem happened on the current
+  backend connection, resulting in a connection failure. See the
+  "fc_conn_err_str" fetch for a full list of error codes and their
+  corresponding error message.
+
 bc_dst : ip
   This is the destination ip address of the connection on the server side,
   which is the server address HAProxy connected to. It is of type IP and works
index 09c91a5421cd1e2da797d5166f7752ee6d7b20a9..f85cae956dba8554144f824c73fe3609d309ffd2 100644 (file)
@@ -1503,7 +1503,12 @@ int smp_fetch_fc_conn_err(const struct arg *args, struct sample *smp, const char
 {
        struct connection *conn;
 
-       conn = objt_conn(smp->sess->origin);
+       if (obj_type(smp->sess->origin) == OBJ_TYPE_CHECK)
+                conn = (kw[0] == 'b') ? cs_conn(__objt_check(smp->sess->origin)->cs) : NULL;
+        else
+                conn = (kw[0] != 'b') ? objt_conn(smp->sess->origin) :
+                       smp->strm ? cs_conn(objt_cs(smp->strm->si[1].end)) : NULL;
+
        if (!conn)
                return 0;
 
@@ -1525,7 +1530,12 @@ int smp_fetch_fc_conn_err_str(const struct arg *args, struct sample *smp, const
        struct connection *conn;
        const char *err_code_str;
 
-       conn = objt_conn(smp->sess->origin);
+       if (obj_type(smp->sess->origin) == OBJ_TYPE_CHECK)
+                conn = (kw[0] == 'b') ? cs_conn(__objt_check(smp->sess->origin)->cs) : NULL;
+        else
+                conn = (kw[0] != 'b') ? objt_conn(smp->sess->origin) :
+                       smp->strm ? cs_conn(objt_cs(smp->strm->si[1].end)) : NULL;
+
        if (!conn)
                return 0;
 
@@ -1560,6 +1570,8 @@ static struct sample_fetch_kw_list sample_fetch_keywords = {ILH, {
        { "fc_pp_unique_id", smp_fetch_fc_pp_unique_id, 0, NULL, SMP_T_STR, SMP_USE_L4CLI },
        { "fc_conn_err", smp_fetch_fc_conn_err, 0, NULL, SMP_T_SINT, SMP_USE_L4CLI },
        { "fc_conn_err_str", smp_fetch_fc_conn_err_str, 0, NULL, SMP_T_STR, SMP_USE_L4CLI },
+       { "bc_conn_err", smp_fetch_fc_conn_err, 0, NULL, SMP_T_SINT, SMP_USE_L4SRV },
+       { "bc_conn_err_str", smp_fetch_fc_conn_err_str, 0, NULL, SMP_T_STR, SMP_USE_L4SRV },
        { /* END */ },
 }};