]> source.dussan.org Git - rspamd.git/commitdiff
[Project] Preliminary usage of the reuseport
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 9 Jun 2020 13:22:44 +0000 (14:22 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 9 Jun 2020 13:22:44 +0000 (14:22 +0100)
src/libserver/worker_util.c
src/rspamd.c

index 639fc94807bccb5246c89a2a296e45736a28d3d9..d5e603cfacde118631a135db2bf3fd48f8cc331e 100644 (file)
@@ -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 */
index 5748fa7ffc271350195bf3728a0d3429b6b3b4c1..2f86739b65f0d1824cd17965e363b8f8f6b5933d 100644 (file)
@@ -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));