]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: frontend: implement a dedicated actconn increment function
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Wed, 25 Oct 2023 13:32:28 +0000 (15:32 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Thu, 26 Oct 2023 13:18:48 +0000 (15:18 +0200)
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.

include/haproxy/frontend.h
src/frontend.c
src/listener.c

index eb986fb0bc29486e30f710c08584c2f51a403197..8cd1a0a1ca37cc6bf58f6cea396fa4c22698d533 100644 (file)
@@ -26,6 +26,7 @@
 
 int frontend_accept(struct stream *s);
 
+int increment_actconn();
 
 #endif /* _HAPROXY_FRONTEND_H */
 
index 105b24bccdd2c1fc5880e57ffff4b75709bbe81b..ad2e39ecb436c9670dc6444ef23716c2351bfd0b 100644 (file)
@@ -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.    */
 /************************************************************************/
index 8a951f391602d5085d60d951f527d9e7f0bba7dc..bbbf18036636fb2ac1bc72bedc4fca63d9224fc5 100644 (file)
@@ -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