From: Tait Clarridge Date: Thu, 6 Dec 2012 02:39:31 +0000 (-0500) Subject: MINOR: acl: add fetch for server session rate X-Git-Tag: v1.5-dev15~25 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7896d5293d13ab73b876fd36ce257a3e1f63a122;p=thirdparty%2Fhaproxy.git MINOR: acl: add fetch for server session rate Considering there is no option yet for maxconnrate for servers, I wrote an ACL to check a backend server session rate which we use to send to an "overflow" backend to prevent latency responses to our clients (very sensitive latency requirements). --- diff --git a/doc/configuration.txt b/doc/configuration.txt index 81cd231bc9..7e9f069e89 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -8021,6 +8021,20 @@ be_sess_rate() acl being_scanned be_sess_rate gt 100 redirect location /denied.html if being_scanned +srv_sess_rate(/) + Returns true when the sessions creation rate on the server matches the + specified values or ranges, in number of new sessions per second. This is + used to switch to an alternate backend when an expensive or fragile one + reaches too high a session rate, or to limit abuse of service (eg. prevent + latent requests from overloading servers). + + Example : + # Redirect to a separate back + acl srv1_full srv_sess_rate(be1/srv1) gt 50 + acl srv2_full srv_sess_rate(be1/srv2) gt 50 + use_backend be2 if srv1_full or srv2_full + + connslots connslots() The basic idea here is to be able to measure the number of connection "slots" diff --git a/src/backend.c b/src/backend.c index f4b90ced35..96545a9918 100644 --- a/src/backend.c +++ b/src/backend.c @@ -1587,6 +1587,20 @@ acl_fetch_srv_conn(struct proxy *px, struct session *l4, void *l7, unsigned int return 1; } +/* set temp integer to the number of enabled servers on the proxy. + * Accepts exactly 1 argument. Argument is a server, other types will lead to + * undefined behaviour. + */ +static int +acl_fetch_srv_sess_rate(struct proxy *px, struct session *l4, void *l7, unsigned int opt, + const struct arg *args, struct sample *smp) +{ + smp->flags = SMP_F_VOL_TEST; + smp->type = SMP_T_UINT; + smp->data.uint = read_freq_ctr(&args->data.srv->sess_per_sec); + return 1; +} + /* Note: must not be declared as its list will be overwritten. * Please take care of keeping this list alphabetically sorted. */ @@ -1601,6 +1615,7 @@ static struct acl_kw_list acl_kws = {{ },{ { "srv_conn", acl_parse_int, acl_fetch_srv_conn, acl_match_int, ACL_USE_NOTHING, ARG1(1,SRV) }, { "srv_id", acl_parse_int, acl_fetch_srv_id, acl_match_int, ACL_USE_RTR_INTERNAL, 0 }, { "srv_is_up", acl_parse_nothing, acl_fetch_srv_is_up, acl_match_nothing, ACL_USE_NOTHING, ARG1(1,SRV) }, + { "srv_sess_rate", acl_parse_int, acl_fetch_srv_sess_rate, acl_match_int, ACL_USE_NOTHING, ARG1(1,SRV) }, { NULL, NULL, NULL, NULL }, }};