diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2020-09-11 15:40:35 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2020-09-11 15:40:35 +0100 |
commit | a355874d09c6989945458d7e989718ca3c5774f3 (patch) | |
tree | f2a77412a51d60f04276268c9565fe4efeba19d5 | |
parent | c3ec216144d3c0f7c53823657727200dc9133843 (diff) | |
download | rspamd-a355874d09c6989945458d7e989718ca3c5774f3.tar.gz rspamd-a355874d09c6989945458d7e989718ca3c5774f3.zip |
[Fix] Disable reuseport for TCP sockets as it causes too many troubles
-rw-r--r-- | src/libserver/worker_util.c | 44 | ||||
-rw-r--r-- | src/rspamd.h | 1 |
2 files changed, 29 insertions, 16 deletions
diff --git a/src/libserver/worker_util.c b/src/libserver/worker_util.c index 40f448954..417cbc733 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 2dfb512bc..470d13085 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 { |