From: Vsevolod Stakhov Date: Fri, 11 Sep 2020 14:40:35 +0000 (+0100) Subject: [Fix] Disable reuseport for TCP sockets as it causes too many troubles X-Git-Tag: 2.6~58 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a355874d09c6989945458d7e989718ca3c5774f3;p=thirdparty%2Frspamd.git [Fix] Disable reuseport for TCP sockets as it causes too many troubles --- diff --git a/src/libserver/worker_util.c b/src/libserver/worker_util.c index 40f448954c..417cbc7335 100644 --- a/src/libserver/worker_util.c +++ b/src/libserver/worker_util.c @@ -955,22 +955,32 @@ rspamd_maybe_reuseport_socket (struct rspamd_worker_listen_socket *ls) #if defined(SO_REUSEPORT) && defined(SO_REUSEADDR) && defined(LINUX) - nfd = rspamd_inet_address_listen (ls->addr, - (ls->type == RSPAMD_WORKER_SOCKET_UDP ? SOCK_DGRAM : SOCK_STREAM), - RSPAMD_INET_ADDRESS_LISTEN_ASYNC|RSPAMD_INET_ADDRESS_LISTEN_REUSEPORT, - -1); - - if (nfd == -1) { - msg_warn ("cannot create reuseport listen socket for %d: %s", - ls->fd, strerror (errno)); - nfd = ls->fd; + if (ls->type == RSPAMD_WORKER_SOCKET_UDP) { + nfd = rspamd_inet_address_listen (ls->addr, + (ls->type == RSPAMD_WORKER_SOCKET_UDP ? SOCK_DGRAM : SOCK_STREAM), + RSPAMD_INET_ADDRESS_LISTEN_ASYNC|RSPAMD_INET_ADDRESS_LISTEN_REUSEPORT, + -1); + + if (nfd == -1) { + msg_warn ("cannot create reuseport listen socket for %d: %s", + ls->fd, strerror (errno)); + nfd = ls->fd; + } + else { + if (ls->fd != -1) { + close (ls->fd); + } + ls->reuseport = true; + ls->fd = nfd; + nfd = -1; + } } else { - if (ls->fd != -1) { - close (ls->fd); - } - ls->fd = nfd; - nfd = -1; + /* + * Reuseport is broken with the current architecture, so it is easier not + * to use it at all + */ + nfd = ls->fd; } #else nfd = ls->fd; @@ -1040,6 +1050,9 @@ rspamd_handle_child_fork (struct rspamd_worker *wrk, g_hash_table_iter_init (&it, listen_sockets); + /* + * Close listen sockets of not our process (inherited from other forks) + */ while (g_hash_table_iter_next (&it, &k, &v)) { GList *elt = (GList *)v; GList *our = cf->listen_socks; @@ -1159,8 +1172,7 @@ rspamd_handle_main_fork (struct rspamd_worker *wrk, struct rspamd_worker_listen_socket *ls = (struct rspamd_worker_listen_socket *)cur->data; - if (!ls->is_systemd && ls->fd != -1 && - rspamd_inet_address_get_af (ls->addr) != AF_UNIX) { + if (ls->reuseport) { close (ls->fd); ls->fd = -1; } diff --git a/src/rspamd.h b/src/rspamd.h index 2dfb512bce..470d13085e 100644 --- a/src/rspamd.h +++ b/src/rspamd.h @@ -236,6 +236,7 @@ struct rspamd_worker_listen_socket { gint fd; enum rspamd_worker_socket_type type; bool is_systemd; + bool reuseport; }; typedef struct worker_s {