]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Implement batch accept in server.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 20 Oct 2015 14:24:51 +0000 (15:24 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 20 Oct 2015 14:24:51 +0000 (15:24 +0100)
utils/rspamd_http_bench.c
utils/rspamd_http_server.c

index 286a3ddb15232ba4ca387054f94d9e4c3d893ca4..f30c2bfe68d61bcb90b5e2e75e42ec93787a1c5a 100644 (file)
@@ -30,6 +30,7 @@
 #include "cryptobox.h"
 #include "unix-std.h"
 #include <math.h>
+#include <netinet/tcp.h>
 
 #ifdef HAVE_SYS_WAIT_H
 #include <sys/wait.h>
@@ -124,10 +125,12 @@ rspamd_http_client_func (struct event_base *ev_base, double *latency)
        struct rspamd_http_connection *conn;
        gchar urlbuf[PATH_MAX];
        struct client_cbdata *cb;
-       gint fd;
+       gint fd, flags;
 
        g_assert (
                        (fd = rspamd_inet_address_connect (addr, SOCK_STREAM, TRUE)) != -1);
+       flags = 1;
+       setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &flags, sizeof (flags));
        conn = rspamd_http_connection_new (rspamd_client_body, rspamd_client_err,
                        rspamd_client_finish, RSPAMD_HTTP_CLIENT_SIMPLE,
                        RSPAMD_HTTP_CLIENT, c);
index 71d74ee7d92483a6802638e68ace3e6d80dfa23d..3aefe6b9fe6e9777f8f84913dbd2afa7372dad06 100644 (file)
@@ -139,26 +139,31 @@ rspamd_server_accept (gint fd, short what, void *arg)
        rspamd_inet_addr_t *addr;
        gint nfd;
 
-       if ((nfd =
-                                rspamd_accept_from_socket (fd, &addr)) == -1) {
-               rspamd_fprintf (stderr, "accept failed: %s", strerror (errno));
-               return;
-       }
-       /* Check for EAGAIN */
-       if (nfd == 0) {
-               return;
-       }
+       do {
+               if ((nfd =
+                                        rspamd_accept_from_socket (fd, &addr)) == -1) {
+                       rspamd_fprintf (stderr, "accept failed: %s", strerror (errno));
+                       return;
+               }
+               /* Check for EAGAIN */
+               if (nfd == 0) {
+                       return;
+               }
 
-       rspamd_inet_address_destroy (addr);
-       session = g_slice_alloc (sizeof (*session));
-       session->conn = rspamd_http_connection_new (NULL, rspamd_server_error,
-                       rspamd_server_finish, 0, RSPAMD_HTTP_SERVER, c);
-       rspamd_http_connection_set_key (session->conn, server_key);
-       rspamd_http_connection_read_message (session->conn, session, nfd, &io_tv,
-                       ev_base);
-       session->reply = FALSE;
-       session->fd = nfd;
-       session->ev_base = ev_base;
+               rspamd_inet_address_destroy (addr);
+               session = g_slice_alloc (sizeof (*session));
+               session->conn = rspamd_http_connection_new (NULL, rspamd_server_error,
+                               rspamd_server_finish, 0, RSPAMD_HTTP_SERVER, c);
+               rspamd_http_connection_set_key (session->conn, server_key);
+               rspamd_http_connection_read_message (session->conn,
+                               session,
+                               nfd,
+                               &io_tv,
+                               ev_base);
+               session->reply = FALSE;
+               session->fd = nfd;
+               session->ev_base = ev_base;
+       } while (nfd > 0);
 }
 
 static void