mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-06 15:17:01 +02:00
MINOR: frontend: implement a dedicated actconn increment function
When a new frontend connection is instantiated, actconn global counter is incremented. If global maxconn value is reached, the connection is cancelled. This ensures that system limit are under control. Prior to this patch, the atomic check/increment operations were done directly into listener_accept(). Move them in a dedicated function increment_actconn() in frontend module. This will be useful when QUIC connections will be counted in actconn counter.
This commit is contained in:
parent
fe29dba872
commit
fffd435bbd
@ -26,6 +26,7 @@
|
||||
|
||||
int frontend_accept(struct stream *s);
|
||||
|
||||
int increment_actconn();
|
||||
|
||||
#endif /* _HAPROXY_FRONTEND_H */
|
||||
|
||||
|
@ -165,6 +165,33 @@ int frontend_accept(struct stream *s)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Increment current active connection counter. This ensures that global
|
||||
* maxconn is not reached or exceeded. This must be done for every new frontend
|
||||
* connection allocation.
|
||||
*
|
||||
* Returns the new actconn global value. If maxconn reached or exceeded, 0 is
|
||||
* returned : the connection allocation should be cancelled.
|
||||
*/
|
||||
int increment_actconn()
|
||||
{
|
||||
unsigned int count, next_actconn;
|
||||
|
||||
do {
|
||||
count = actconn;
|
||||
if (unlikely(count >= global.maxconn)) {
|
||||
/* maxconn reached */
|
||||
next_actconn = 0;
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* try to increment actconn */
|
||||
next_actconn = count + 1;
|
||||
} while (!_HA_ATOMIC_CAS(&actconn, (int *)(&count), next_actconn) && __ha_cpu_relax());
|
||||
|
||||
end:
|
||||
return next_actconn;
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
/* All supported sample and ACL keywords must be declared here. */
|
||||
/************************************************************************/
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include <haproxy/errors.h>
|
||||
#include <haproxy/fd.h>
|
||||
#include <haproxy/freq_ctr.h>
|
||||
#include <haproxy/frontend.h>
|
||||
#include <haproxy/global.h>
|
||||
#include <haproxy/list.h>
|
||||
#include <haproxy/listener.h>
|
||||
@ -1114,18 +1115,14 @@ void listener_accept(struct listener *l)
|
||||
}
|
||||
|
||||
if (!(l->bind_conf->options & BC_O_UNLIMITED)) {
|
||||
do {
|
||||
count = actconn;
|
||||
if (unlikely(count >= global.maxconn)) {
|
||||
/* the process was marked full or another
|
||||
* thread is going to do it.
|
||||
*/
|
||||
next_actconn = 0;
|
||||
expire = tick_add(now_ms, 1000); /* try again in 1 second */
|
||||
goto limit_global;
|
||||
}
|
||||
next_actconn = count + 1;
|
||||
} while (!_HA_ATOMIC_CAS(&actconn, (int *)(&count), next_actconn));
|
||||
next_actconn = increment_actconn();
|
||||
if (!next_actconn) {
|
||||
/* the process was marked full or another
|
||||
* thread is going to do it.
|
||||
*/
|
||||
expire = tick_add(now_ms, 1000); /* try again in 1 second */
|
||||
goto limit_global;
|
||||
}
|
||||
}
|
||||
|
||||
/* be careful below, the listener might be shutting down in
|
||||
|
Loading…
Reference in New Issue
Block a user