mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-10-26 22:20:59 +01:00
MINOR: backend: srv_is_up converter
There is currently an srv_queue converter which is capable of taking the output of a dynamic name and determining the queue length for a given server. In addition there is a sample fetcher for whether a server is currently up. This simply combines the two such that srv_is_up can be used as a converter too. Future work might extend this to other sample fetchers for servers, but this is probably the most useful for acl routing.
This commit is contained in:
parent
faba98c85f
commit
54f53bc875
@ -20144,6 +20144,7 @@ secure_memcmp(var) string boolean
|
||||
set-var(var[,cond...]) any same
|
||||
sha1 binary binary
|
||||
sha2([bits]) binary binary
|
||||
srv_is_up string boolean
|
||||
srv_queue string integer
|
||||
strcmp(var) string boolean
|
||||
sub(value) integer integer
|
||||
@ -21405,6 +21406,16 @@ sha2([<bits>])
|
||||
Please note that this converter is only available when HAProxy has been
|
||||
compiled with USE_OPENSSL.
|
||||
|
||||
srv_is_up
|
||||
Takes an input value of type string, either a server name or <backend>/<server>
|
||||
format and returns true when the designated server is currently UP. Can be used
|
||||
in places where we want to look up a server status from a dynamic name, like a
|
||||
cookie value (e.g. req.cook(SRVID),srv_is_up) and then make a decision to
|
||||
direct a request elsewhere. Before using this, please keep in mind that using
|
||||
this converter on uncontrolled data might allow an external observer to query
|
||||
the state of any server in the whole configuration, which might possibly not
|
||||
be acceptable in some environments.
|
||||
|
||||
srv_queue
|
||||
Takes an input value of type string, either a server name or <backend>/<server>
|
||||
format and returns the number of queued streams on that server. Can be used
|
||||
|
||||
@ -3763,6 +3763,23 @@ static struct server *sample_conv_srv(struct sample *smp)
|
||||
return server_find(px, smp->data.u.str.area);
|
||||
}
|
||||
|
||||
static int
|
||||
sample_conv_srv_is_up(const struct arg *args, struct sample *smp, void *private)
|
||||
{
|
||||
struct server *srv = sample_conv_srv(smp);
|
||||
|
||||
if (!srv)
|
||||
return 0;
|
||||
|
||||
smp->data.type = SMP_T_BOOL;
|
||||
if (!(srv->cur_admin & SRV_ADMF_MAINT) &&
|
||||
(!(srv->check.state & CHK_ST_CONFIGURED) || (srv->cur_state != SRV_ST_STOPPED)))
|
||||
smp->data.u.sint = 1;
|
||||
else
|
||||
smp->data.u.sint = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
sample_conv_srv_queue(const struct arg *args, struct sample *smp, void *private)
|
||||
{
|
||||
@ -3809,6 +3826,7 @@ 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 },
|
||||
{ "srv_is_up", sample_conv_srv_is_up, 0, NULL, SMP_T_STR, SMP_T_BOOL },
|
||||
{ "srv_queue", sample_conv_srv_queue, 0, NULL, SMP_T_STR, SMP_T_SINT },
|
||||
{ /* END */ },
|
||||
}};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user