]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: listeners: introduce listener_set_state()
authorWilly Tarreau <w@1wt.eu>
Thu, 24 Sep 2020 05:23:45 +0000 (07:23 +0200)
committerWilly Tarreau <w@1wt.eu>
Fri, 9 Oct 2020 09:27:30 +0000 (11:27 +0200)
This function is used as a wrapper to set a listener's state everywhere.
We'll use it later to maintain some counters in a consistent state when
switching state so it's capital that all state changes go through it.
No functional change was made beyond calling the wrapper.

include/haproxy/listener.h
src/listener.c
src/proto_sockpair.c
src/proto_tcp.c
src/proto_udp.c
src/proto_uxst.c

index 68020c36d58f57d2640bdd060958472c3e56d749..3233ad5bc81c5e9d12bf97c96c04cf7909613e31 100644 (file)
@@ -30,6 +30,9 @@
 #include <haproxy/list.h>
 #include <haproxy/listener-t.h>
 
+/* adjust the listener's state and its proxy's listener counters if needed */
+void listener_set_state(struct listener *l, enum li_state st);
+
 /* This function tries to temporarily disable a listener, depending on the OS
  * capabilities. Linux unbinds the listen socket after a SHUT_RD, and ignores
  * SHUT_WR. Solaris refuses either shutdown(). OpenBSD ignores SHUT_RD but
index f6ab73c50d34ff124783f1524d72a97e1d0252ea..1ad017db8c1dc40357f0291ec898b7fbdeb641fa 100644 (file)
@@ -218,6 +218,12 @@ REGISTER_CONFIG_POSTPARSER("multi-threaded accept queue", accept_queue_init);
 
 #endif // USE_THREAD
 
+/* adjust the listener's state */
+void listener_set_state(struct listener *l, enum li_state st)
+{
+       l->state = st;
+}
+
 /* This function adds the specified listener's file descriptor to the polling
  * lists if it is in the LI_LISTEN state. The listener enters LI_READY or
  * LI_FULL state depending on its number of connections. In daemon mode, we
@@ -237,15 +243,15 @@ static void enable_listener(struct listener *listener)
                                do_unbind_listener(listener, 1);
                        else {
                                do_unbind_listener(listener, 0);
-                               listener->state = LI_LISTEN;
+                               listener_set_state(listener, LI_LISTEN);
                        }
                }
                else if (!listener->maxconn || listener->nbconn < listener->maxconn) {
                        fd_want_recv(listener->rx.fd);
-                       listener->state = LI_READY;
+                       listener_set_state(listener, LI_READY);
                }
                else {
-                       listener->state = LI_FULL;
+                       listener_set_state(listener, LI_FULL);
                }
        }
        /* if this listener is supposed to be only in the master, close it in the workers */
@@ -269,7 +275,7 @@ static void disable_listener(struct listener *listener)
        if (listener->state == LI_READY)
                fd_stop_recv(listener->rx.fd);
        MT_LIST_DEL(&listener->wait_queue);
-       listener->state = LI_LISTEN;
+       listener_set_state(listener, LI_LISTEN);
   end:
        HA_SPIN_UNLOCK(LISTENER_LOCK, &listener->lock);
 }
@@ -308,7 +314,7 @@ int pause_listener(struct listener *l)
        MT_LIST_DEL(&l->wait_queue);
 
        fd_stop_recv(l->rx.fd);
-       l->state = LI_PAUSED;
+       listener_set_state(l, LI_PAUSED);
   end:
        HA_SPIN_UNLOCK(LISTENER_LOCK, &l->lock);
        return ret;
@@ -372,12 +378,12 @@ int resume_listener(struct listener *l)
                goto end;
 
        if (l->maxconn && l->nbconn >= l->maxconn) {
-               l->state = LI_FULL;
+               listener_set_state(l, LI_FULL);
                goto end;
        }
 
        fd_want_recv(l->rx.fd);
-       l->state = LI_READY;
+       listener_set_state(l, LI_READY);
   end:
        HA_SPIN_UNLOCK(LISTENER_LOCK, &l->lock);
        return ret;
@@ -393,7 +399,7 @@ static void listener_full(struct listener *l)
                MT_LIST_DEL(&l->wait_queue);
                if (l->state != LI_FULL) {
                        fd_stop_recv(l->rx.fd);
-                       l->state = LI_FULL;
+                       listener_set_state(l, LI_FULL);
                }
        }
        HA_SPIN_UNLOCK(LISTENER_LOCK, &l->lock);
@@ -408,7 +414,7 @@ static void limit_listener(struct listener *l, struct mt_list *list)
        if (l->state == LI_READY) {
                MT_LIST_TRY_ADDQ(list, &l->wait_queue);
                fd_stop_recv(l->rx.fd);
-               l->state = LI_LIMITED;
+               listener_set_state(l, LI_LIMITED);
        }
        HA_SPIN_UNLOCK(LISTENER_LOCK, &l->lock);
 }
@@ -486,7 +492,7 @@ void do_unbind_listener(struct listener *listener, int do_close)
        MT_LIST_DEL(&listener->wait_queue);
 
        if (listener->state >= LI_PAUSED) {
-               listener->state = LI_ASSIGNED;
+               listener_set_state(listener, LI_ASSIGNED);
                fd_stop_both(listener->rx.fd);
        }
 
@@ -547,7 +553,7 @@ int create_listeners(struct bind_conf *bc, const struct sockaddr_storage *ss,
                l->rx.fd = fd;
                memcpy(&l->rx.addr, ss, sizeof(*ss));
                MT_LIST_INIT(&l->wait_queue);
-               l->state = LI_INIT;
+               listener_set_state(l, LI_INIT);
 
                proto->add(l, port);
 
@@ -575,7 +581,7 @@ void delete_listener(struct listener *listener)
        HA_SPIN_LOCK(PROTO_LOCK, &proto_lock);
        HA_SPIN_LOCK(LISTENER_LOCK, &listener->lock);
        if (listener->state == LI_ASSIGNED) {
-               listener->state = LI_INIT;
+               listener_set_state(listener, LI_INIT);
                LIST_DEL(&listener->rx.proto_list);
                listener->rx.proto->nb_listeners--;
                _HA_ATOMIC_SUB(&jobs, 1);
index fc26a80d5ac280e0938d90b46ce43ebf999dc137..eb7ef8697291e6a4212e11c7ca9f6c6b31d099a6 100644 (file)
@@ -89,7 +89,7 @@ static void sockpair_add_listener(struct listener *listener, int port)
 {
        if (listener->state != LI_INIT)
                return;
-       listener->state = LI_ASSIGNED;
+       listener_set_state(listener, LI_ASSIGNED);
        listener->rx.proto = &proto_sockpair;
        LIST_ADDQ(&proto_sockpair.listeners, &listener->rx.proto_list);
        proto_sockpair.nb_listeners++;
@@ -175,7 +175,7 @@ static int sockpair_bind_listener(struct listener *listener, char *errmsg, int e
                goto err_return;
        }
 
-       listener->state = LI_LISTEN;
+       listener_set_state(listener, LI_LISTEN);
        return err;
 
  err_return:
index 138dd68fc524057bf2d86bcd3f4886d7e9e97c48..e77d50e25b6433b58b29eaff4bc322a7c89dc71c 100644 (file)
@@ -676,7 +676,7 @@ int tcp_bind_listener(struct listener *listener, char *errmsg, int errlen)
 #endif
 
        /* the socket is ready */
-       listener->state = LI_LISTEN;
+       listener_set_state(listener, LI_LISTEN);
        goto tcp_return;
 
  tcp_close_return:
@@ -702,7 +702,7 @@ static void tcpv4_add_listener(struct listener *listener, int port)
 {
        if (listener->state != LI_INIT)
                return;
-       listener->state = LI_ASSIGNED;
+       listener_set_state(listener, LI_ASSIGNED);
        listener->rx.proto = &proto_tcpv4;
        ((struct sockaddr_in *)(&listener->rx.addr))->sin_port = htons(port);
        LIST_ADDQ(&proto_tcpv4.listeners, &listener->rx.proto_list);
@@ -720,7 +720,7 @@ static void tcpv6_add_listener(struct listener *listener, int port)
 {
        if (listener->state != LI_INIT)
                return;
-       listener->state = LI_ASSIGNED;
+       listener_set_state(listener, LI_ASSIGNED);
        listener->rx.proto = &proto_tcpv6;
        ((struct sockaddr_in *)(&listener->rx.addr))->sin_port = htons(port);
        LIST_ADDQ(&proto_tcpv6.listeners, &listener->rx.proto_list);
index 2333b5d9ee3b75f01d76a3a7c573cea160ffcef9..af75cc977c5f474757e33f471f509a0fb6d6d0e7 100644 (file)
@@ -114,7 +114,7 @@ int udp_bind_listener(struct listener *listener, char *errmsg, int errlen)
                goto udp_return;
        }
 
-       listener->state = LI_LISTEN;
+       listener_set_state(listener, LI_LISTEN);
 
  udp_return:
        if (msg && errlen) {
@@ -134,7 +134,7 @@ static void udp4_add_listener(struct listener *listener, int port)
 {
        if (listener->state != LI_INIT)
                return;
-       listener->state = LI_ASSIGNED;
+       listener_set_state(listener, LI_ASSIGNED);
        listener->rx.proto = &proto_udp4;
        ((struct sockaddr_in *)(&listener->rx.addr))->sin_port = htons(port);
        LIST_ADDQ(&proto_udp4.listeners, &listener->rx.proto_list);
@@ -149,7 +149,7 @@ static void udp6_add_listener(struct listener *listener, int port)
 {
        if (listener->state != LI_INIT)
                return;
-       listener->state = LI_ASSIGNED;
+       listener_set_state(listener, LI_ASSIGNED);
        listener->rx.proto = &proto_udp6;
        ((struct sockaddr_in *)(&listener->rx.addr))->sin_port = htons(port);
        LIST_ADDQ(&proto_udp6.listeners, &listener->rx.proto_list);
index 6cf35b754627b333449fcd69a6f0409591a0ae16..bafe97dcfbd53c0817197201e09dd9df8cf9f38e 100644 (file)
@@ -118,7 +118,7 @@ static int uxst_bind_listener(struct listener *listener, char *errmsg, int errle
        }
 
        /* the socket is now listening */
-       listener->state = LI_LISTEN;
+       listener_set_state(listener, LI_LISTEN);
        return err;
 
  uxst_close_return:
@@ -142,7 +142,7 @@ static void uxst_add_listener(struct listener *listener, int port)
 {
        if (listener->state != LI_INIT)
                return;
-       listener->state = LI_ASSIGNED;
+       listener_set_state(listener, LI_ASSIGNED);
        listener->rx.proto = &proto_unix;
        LIST_ADDQ(&proto_unix.listeners, &listener->rx.proto_list);
        proto_unix.nb_listeners++;