diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2020-06-09 14:22:44 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2020-06-09 14:22:44 +0100 |
commit | ae6f563623c765e574bd9a211be7524f7495ea28 (patch) | |
tree | 1a43bace3e697c00c5e90c0efe0f6124ba753898 | |
parent | 488f72bad4fab719861b4641ff832f60729a5950 (diff) | |
download | rspamd-ae6f563623c765e574bd9a211be7524f7495ea28.tar.gz rspamd-ae6f563623c765e574bd9a211be7524f7495ea28.zip |
[Project] Preliminary usage of the reuseport
-rw-r--r-- | src/libserver/worker_util.c | 41 | ||||
-rw-r--r-- | src/rspamd.c | 6 |
2 files changed, 45 insertions, 2 deletions
diff --git a/src/libserver/worker_util.c b/src/libserver/worker_util.c index 639fc9480..d5e603cfa 100644 --- a/src/libserver/worker_util.c +++ b/src/libserver/worker_util.c @@ -933,6 +933,36 @@ rspamd_main_heartbeat_start (struct rspamd_worker *wrk, struct ev_loop *event_lo ev_timer_start (event_loop, &wrk->hb.heartbeat_ev); } +static bool +rspamd_maybe_reuseport_socket (struct rspamd_worker_listen_socket *ls) +{ + if (ls->fd == -1 || ls->is_systemd || + rspamd_inet_address_get_af (ls->addr) == AF_UNIX) { + return false; + } + +#if defined(SO_REUSEPORT) && defined(SO_REUSEADDR) + gint nfd; + + 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)); + } + else { + close (ls->fd); + ls->fd = nfd; + } +#else + +#endif + + return false; +} /** * Handles worker after fork returned zero @@ -1006,6 +1036,17 @@ rspamd_handle_child_fork (struct rspamd_worker *wrk, } } + /* Reuseport before dropping privs */ + GList *cur = cf->listen_socks; + + while (cur) { + struct rspamd_worker_listen_socket *ls = + (struct rspamd_worker_listen_socket *)cur->data; + + rspamd_maybe_reuseport_socket (ls); + cur = g_list_next (cur); + } + /* Drop privileges */ rspamd_worker_drop_priv (rspamd_main); /* Set limits */ diff --git a/src/rspamd.c b/src/rspamd.c index 5748fa7ff..2f86739b6 100644 --- a/src/rspamd.c +++ b/src/rspamd.c @@ -412,7 +412,8 @@ create_listen_socket (GPtrArray *addrs, guint cnt, */ if (listen_type & RSPAMD_WORKER_SOCKET_TCP) { fd = rspamd_inet_address_listen (g_ptr_array_index (addrs, i), - SOCK_STREAM, RSPAMD_INET_ADDRESS_LISTEN_ASYNC, -1); + SOCK_STREAM, + RSPAMD_INET_ADDRESS_LISTEN_ASYNC|RSPAMD_INET_ADDRESS_LISTEN_REUSEPORT, -1); if (fd != -1) { ls = g_malloc0 (sizeof (*ls)); ls->addr = rspamd_inet_address_copy (g_ptr_array_index (addrs, i)); @@ -423,7 +424,8 @@ create_listen_socket (GPtrArray *addrs, guint cnt, } if (listen_type & RSPAMD_WORKER_SOCKET_UDP) { fd = rspamd_inet_address_listen (g_ptr_array_index (addrs, i), - SOCK_DGRAM, RSPAMD_INET_ADDRESS_LISTEN_ASYNC, -1); + SOCK_DGRAM, + RSPAMD_INET_ADDRESS_LISTEN_ASYNC|RSPAMD_INET_ADDRESS_LISTEN_REUSEPORT, -1); if (fd != -1) { ls = g_malloc0 (sizeof (*ls)); ls->addr = rspamd_inet_address_copy (g_ptr_array_index (addrs, i)); |