diff options
author | Willy Tarreau <w@1wt.eu> | 2020-09-24 07:23:45 +0200 |
---|---|---|
committer | Willy Tarreau <w@1wt.eu> | 2020-10-07 18:44:08 +0200 |
commit | b6a486166da3347dffc83d8d7ecada88a73348ec (patch) | |
tree | 83e0ed449a84530eda17366454b7801736ec0079 | |
parent | 3aa92a71bbd5e3dc10e276dd4864d0da09d16349 (diff) | |
download | haproxy-b6a486166da3347dffc83d8d7ecada88a73348ec.tar.gz |
MINOR: listeners: introduce listener_set_state()
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.
-rw-r--r-- | include/haproxy/listener.h | 3 | ||||
-rw-r--r-- | src/listener.c | 30 | ||||
-rw-r--r-- | src/proto_sockpair.c | 4 | ||||
-rw-r--r-- | src/proto_tcp.c | 6 | ||||
-rw-r--r-- | src/proto_udp.c | 6 | ||||
-rw-r--r-- | src/proto_uxst.c | 4 |
6 files changed, 31 insertions, 22 deletions
diff --git a/include/haproxy/listener.h b/include/haproxy/listener.h index 68020c36d..3233ad5bc 100644 --- a/include/haproxy/listener.h +++ b/include/haproxy/listener.h @@ -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 diff --git a/src/listener.c b/src/listener.c index f6ab73c50..1ad017db8 100644 --- a/src/listener.c +++ b/src/listener.c @@ -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); diff --git a/src/proto_sockpair.c b/src/proto_sockpair.c index fc26a80d5..eb7ef8697 100644 --- a/src/proto_sockpair.c +++ b/src/proto_sockpair.c @@ -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: diff --git a/src/proto_tcp.c b/src/proto_tcp.c index 138dd68fc..e77d50e25 100644 --- a/src/proto_tcp.c +++ b/src/proto_tcp.c @@ -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); diff --git a/src/proto_udp.c b/src/proto_udp.c index 2333b5d9e..af75cc977 100644 --- a/src/proto_udp.c +++ b/src/proto_udp.c @@ -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); diff --git a/src/proto_uxst.c b/src/proto_uxst.c index 6cf35b754..bafe97dcf 100644 --- a/src/proto_uxst.c +++ b/src/proto_uxst.c @@ -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++; |