mirror of
https://github.com/haproxy/haproxy.git
synced 2026-07-10 09:47:01 -04:00
MINOR: stream: Add be_max_retries/cur_max_retries sample fetch functions
These new samples can be used to get, resepectively, the backend value for the maximum connection retries and the current value applied to the stream. They could be used to know if a "set-retries" action was performed. A dedicated reg-test was also added.
This commit is contained in:
parent
b71d27e253
commit
a608d2cade
4 changed files with 157 additions and 0 deletions
|
|
@ -24325,6 +24325,7 @@ bc_srv_queue integer
|
|||
be_id integer
|
||||
be_name string
|
||||
be_connect_timeout integer
|
||||
be_max_retries integer
|
||||
be_queue_timeout integer
|
||||
be_server_timeout integer
|
||||
be_tarpit_timeout integer
|
||||
|
|
@ -24333,6 +24334,7 @@ bytes_in integer
|
|||
bytes_out integer
|
||||
cur_connect_timeout integer
|
||||
cur_client_timeout integer
|
||||
cur_max_retries integer
|
||||
cur_queue_timeout integer
|
||||
cur_server_timeout integer
|
||||
cur_tarpit_timeout integer
|
||||
|
|
@ -24669,6 +24671,11 @@ be_connect_timeout : integer
|
|||
current backend. This timeout can be overwritten by a "set-timeout" rule. See
|
||||
also the "cur_connect_timeout".
|
||||
|
||||
be_max_retries : integer
|
||||
Returns the configuration value for the connection retries of the current
|
||||
backend. This value can be overwritten by a "set-retries" rule. See also the
|
||||
"cur_max_retries".
|
||||
|
||||
be_name : string
|
||||
Returns a string containing the current backend's name. It can be used in
|
||||
frontends with responses to check which backend processed the request. If
|
||||
|
|
@ -24712,6 +24719,11 @@ cur_client_timeout : integer
|
|||
In the default case, this will be equal to fe_client_timeout unless a
|
||||
"set-timeout" rule has been applied. See also "fe_client_timeout".
|
||||
|
||||
cur_max_retries : integer
|
||||
Returns the currently applied connect retries for the stream.
|
||||
In the default case, this will be equal to be_max_retries unless a
|
||||
"set-retries" rule has been applied. See also "be_max_retries".
|
||||
|
||||
cur_queue_timeout : integer
|
||||
Returns the currently applied queue timeout in millisecond for the stream.
|
||||
In the default case, this will be equal to be_queue_timeout unless a
|
||||
|
|
|
|||
114
reg-tests/stream/set-retries.vtc
Normal file
114
reg-tests/stream/set-retries.vtc
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
varnishtest "set-retries action test"
|
||||
|
||||
feature ignore_unknown_macro
|
||||
|
||||
server srv_h1 -repeat 6 {
|
||||
rxreq
|
||||
txresp -hdr "Connection: close"
|
||||
} -start
|
||||
|
||||
|
||||
haproxy hap -conf {
|
||||
global
|
||||
.if feature(THREAD)
|
||||
thread-groups 1
|
||||
.endif
|
||||
|
||||
defaults
|
||||
timeout connect 5s
|
||||
timeout client 5s
|
||||
timeout server 5s
|
||||
retries 3
|
||||
log global
|
||||
|
||||
listen li1
|
||||
mode http
|
||||
bind "fd@${li1}"
|
||||
http-after-response set-header retries "%[be_max_retries] %[cur_max_retries]"
|
||||
server srv_h1 ${srv_h1_addr}:${srv_h1_port}
|
||||
|
||||
listen li2
|
||||
mode http
|
||||
bind "fd@${li2}"
|
||||
http-request set-retries 5
|
||||
http-after-response set-header retries "%[be_max_retries] %[cur_max_retries]"
|
||||
server srv_h1 ${srv_h1_addr}:${srv_h1_port}
|
||||
|
||||
listen li3
|
||||
mode http
|
||||
bind "fd@${li3}"
|
||||
http-request set-retries 5
|
||||
http-after-response set-header retries "%[be_max_retries] %[cur_max_retries]"
|
||||
default_backend be1
|
||||
|
||||
listen li4
|
||||
mode http
|
||||
bind "fd@${li4}"
|
||||
http-request set-retries 4
|
||||
http-after-response set-header retries "%[be_max_retries] %[cur_max_retries]"
|
||||
default_backend be2
|
||||
|
||||
frontend fe5
|
||||
mode http
|
||||
bind "fd@${fe5}"
|
||||
http-after-response set-header retries "%[be_max_retries] %[cur_max_retries]"
|
||||
default_backend be1
|
||||
|
||||
frontend fe6
|
||||
mode http
|
||||
bind "fd@${fe6}"
|
||||
http-after-response set-header retries "%[be_max_retries] %[cur_max_retries]"
|
||||
default_backend be2
|
||||
|
||||
backend be1
|
||||
mode http
|
||||
server srv_h1 ${srv_h1_addr}:${srv_h1_port}
|
||||
|
||||
backend be2
|
||||
mode http
|
||||
http-request set-retries 5
|
||||
server srv_h1 ${srv_h1_addr}:${srv_h1_port}
|
||||
|
||||
} -start
|
||||
|
||||
client c1 -connect ${hap_li1_sock} {
|
||||
txreq
|
||||
rxresp
|
||||
expect resp.status == 200
|
||||
expect resp.http.retries == "3 3"
|
||||
} -run
|
||||
|
||||
client c2 -connect ${hap_li2_sock} {
|
||||
txreq
|
||||
rxresp
|
||||
expect resp.status == 200
|
||||
expect resp.http.retries == "3 5"
|
||||
} -run
|
||||
|
||||
client c3 -connect ${hap_li3_sock} {
|
||||
txreq
|
||||
rxresp
|
||||
expect resp.status == 200
|
||||
expect resp.http.retries == "3 3"
|
||||
} -run
|
||||
|
||||
client c4 -connect ${hap_li4_sock} {
|
||||
txreq
|
||||
rxresp
|
||||
expect resp.status == 200
|
||||
expect resp.http.retries == "3 5"
|
||||
} -run
|
||||
|
||||
client c5 -connect ${hap_fe5_sock} {
|
||||
txreq
|
||||
rxresp
|
||||
expect resp.status == 200
|
||||
expect resp.http.retries == "3 3"
|
||||
} -run
|
||||
|
||||
client c6 -connect ${hap_fe6_sock} {
|
||||
txreq
|
||||
rxresp
|
||||
expect resp.status == 200
|
||||
expect resp.http.retries == "3 5"
|
||||
} -run
|
||||
|
|
@ -3756,6 +3756,24 @@ smp_fetch_srv_uweight(const struct arg *args, struct sample *smp, const char *kw
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
smp_fetch_be_max_retries(const struct arg *args, struct sample *smp, const char *km, void *private)
|
||||
{
|
||||
struct proxy *px = NULL;
|
||||
|
||||
if (smp->strm)
|
||||
px = smp->strm->be;
|
||||
else if (obj_type(smp->sess->origin) == OBJ_TYPE_CHECK)
|
||||
px = __objt_check(smp->sess->origin)->proxy;
|
||||
if (!px)
|
||||
return 0;
|
||||
|
||||
smp->flags = SMP_F_VOL_TXN;
|
||||
smp->data.type = SMP_T_SINT;
|
||||
smp->data.u.sint = px->conn_retries;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
smp_fetch_be_connect_timeout(const struct arg *args, struct sample *smp, const char *km, void *private)
|
||||
{
|
||||
|
|
@ -3929,6 +3947,7 @@ static struct sample_fetch_kw_list smp_kws = {ILH, {
|
|||
{ "be_id", smp_fetch_be_id, 0, NULL, SMP_T_SINT, SMP_USE_BKEND, },
|
||||
{ "be_name", smp_fetch_be_name, 0, NULL, SMP_T_STR, SMP_USE_BKEND, },
|
||||
{ "be_connect_timeout",smp_fetch_be_connect_timeout,0, NULL, SMP_T_SINT, SMP_USE_BKEND, },
|
||||
{ "be_max_retries", smp_fetch_be_max_retries, 0, NULL, SMP_T_SINT, SMP_USE_BKEND, },
|
||||
{ "be_queue_timeout", smp_fetch_be_queue_timeout, 0, NULL, SMP_T_SINT, SMP_USE_BKEND, },
|
||||
{ "be_server_timeout", smp_fetch_be_server_timeout, 0, NULL, SMP_T_SINT, SMP_USE_BKEND, },
|
||||
{ "be_sess_rate", smp_fetch_be_sess_rate, ARG1(1,BE), NULL, SMP_T_SINT, SMP_USE_INTRN, },
|
||||
|
|
|
|||
12
src/stream.c
12
src/stream.c
|
|
@ -4420,6 +4420,17 @@ static struct action_kw_list stream_http_after_res_actions = { ILH, {
|
|||
|
||||
INITCALL1(STG_REGISTER, http_after_res_keywords_register, &stream_http_after_res_actions);
|
||||
|
||||
static int smp_fetch_cur_max_retries(const struct arg *args, struct sample *smp, const char *km, void *private)
|
||||
{
|
||||
smp->flags = SMP_F_VOL_TXN;
|
||||
smp->data.type = SMP_T_SINT;
|
||||
if (!smp->strm)
|
||||
return 0;
|
||||
|
||||
smp->data.u.sint = smp->strm->max_retries;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int smp_fetch_cur_connect_timeout(const struct arg *args, struct sample *smp, const char *km, void *private)
|
||||
{
|
||||
smp->flags = SMP_F_VOL_TXN;
|
||||
|
|
@ -4687,6 +4698,7 @@ static int smp_fetch_redispatched(const struct arg *args, struct sample *smp, co
|
|||
static struct sample_fetch_kw_list smp_kws = {ILH, {
|
||||
{ "cur_connect_timeout",smp_fetch_cur_connect_timeout,0, NULL, SMP_T_SINT, SMP_USE_BKEND, },
|
||||
{ "cur_client_timeout", smp_fetch_cur_client_timeout, 0, NULL, SMP_T_SINT, SMP_USE_FTEND, },
|
||||
{ "cur_max_retries", smp_fetch_cur_max_retries, 0, NULL, SMP_T_SINT, SMP_USE_BKEND, },
|
||||
{ "cur_server_timeout", smp_fetch_cur_server_timeout, 0, NULL, SMP_T_SINT, SMP_USE_BKEND, },
|
||||
{ "cur_queue_timeout", smp_fetch_cur_queue_timeout, 0, NULL, SMP_T_SINT, SMP_USE_BKEND, },
|
||||
{ "cur_tarpit_timeout", smp_fetch_cur_tarpit_timeout, 0, NULL, SMP_T_SINT, SMP_USE_FTEND | SMP_USE_BKEND, },
|
||||
|
|
|
|||
Loading…
Reference in a new issue