ソースを参照

[Project] Preliminary usage of the reuseport

tags/2.6
Vsevolod Stakhov 4年前
コミット
ae6f563623
2個のファイルの変更45行の追加2行の削除
  1. 41
    0
      src/libserver/worker_util.c
  2. 4
    2
      src/rspamd.c

+ 41
- 0
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 */

+ 4
- 2
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));

読み込み中…
キャンセル
保存