]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
network: make TCP_BACKLOG_DEFAULT a compile time define and set to default
authorMarek Vavruša <mvavrusa@cloudflare.com>
Fri, 6 Apr 2018 16:32:17 +0000 (09:32 -0700)
committerGrigorii Demidov <grigorii.demidov@nic.cz>
Tue, 13 Nov 2018 12:00:24 +0000 (13:00 +0100)
This was previously hardcoded to 16. This makes it at least a compile time
define, with a default of 511 (as that's what Redis and Apache use).

daemon/engine.c
daemon/io.c
daemon/io.h
daemon/network.c
daemon/network.h

index 6fea74545170c36be38a40f83d7e875a685564cc..5ab1f3a72dee7f8ffbc0aef9d51936134cf073cd 100644 (file)
 #define lua_rawlen(L, obj) lua_objlen((L), (obj))
 #endif
 
+/**@internal Maximum number of incomplete TCP connections in queue.
+* Default is from Redis and Apache. */
+#ifndef TCP_BACKLOG_DEFAULT
+#define TCP_BACKLOG_DEFAULT 511
+#endif
+
 /** @internal Annotate for static checkers. */
 KR_NORETURN int lua_error (lua_State *L);
 
@@ -748,7 +754,7 @@ int engine_init(struct engine *engine, knot_mm_t *pool)
                return ret;
        }
        /* Initialize network */
-       network_init(&engine->net, uv_default_loop());
+       network_init(&engine->net, uv_default_loop(), TCP_BACKLOG_DEFAULT);
 
        return ret;
 }
index 9087f64fd855bf9cbdb65339a4b36ac27ecc6f96..f203fa90cbe34733a38ae76283cc1553e4861495 100644 (file)
@@ -347,7 +347,7 @@ static int tcp_bind_finalize(uv_handle_t *handle)
        return 0;
 }
 
-static int _tcp_bind(uv_tcp_t *handle, struct sockaddr *addr, uv_connection_cb connection)
+static int _tcp_bind(uv_tcp_t *handle, struct sockaddr *addr, uv_connection_cb connection, int tcp_backlog)
 {
        unsigned flags = 0;
        if (addr->sa_family == AF_INET6) {
@@ -366,7 +366,7 @@ static int _tcp_bind(uv_tcp_t *handle, struct sockaddr *addr, uv_connection_cb c
        }
 #endif
 
-       ret = uv_listen((uv_stream_t *)handle, 16, connection);
+       ret = uv_listen((uv_stream_t *)handle, tcp_backlog, connection);
        if (ret != 0) {
                return ret;
        }
@@ -374,17 +374,17 @@ static int _tcp_bind(uv_tcp_t *handle, struct sockaddr *addr, uv_connection_cb c
        return tcp_bind_finalize((uv_handle_t *)handle);
 }
 
-int tcp_bind(uv_tcp_t *handle, struct sockaddr *addr)
+int tcp_bind(uv_tcp_t *handle, struct sockaddr *addr, int tcp_backlog)
 {
-       return _tcp_bind(handle, addr, tcp_accept);
+       return _tcp_bind(handle, addr, tcp_accept, tcp_backlog);
 }
 
-int tcp_bind_tls(uv_tcp_t *handle, struct sockaddr *addr)
+int tcp_bind_tls(uv_tcp_t *handle, struct sockaddr *addr, int tcp_backlog)
 {
-       return _tcp_bind(handle, addr, tls_accept);
+       return _tcp_bind(handle, addr, tls_accept, tcp_backlog);
 }
 
-static int _tcp_bindfd(uv_tcp_t *handle, int fd, uv_connection_cb connection)
+static int _tcp_bindfd(uv_tcp_t *handle, int fd, uv_connection_cb connection, int tcp_backlog)
 {
        if (!handle) {
                return kr_error(EINVAL);
@@ -395,21 +395,21 @@ static int _tcp_bindfd(uv_tcp_t *handle, int fd, uv_connection_cb connection)
                return ret;
        }
 
-       ret = uv_listen((uv_stream_t *)handle, 16, connection);
+       ret = uv_listen((uv_stream_t *)handle, tcp_backlog, connection);
        if (ret != 0) {
                return ret;
        }
        return tcp_bind_finalize((uv_handle_t *)handle);
 }
 
-int tcp_bindfd(uv_tcp_t *handle, int fd)
+int tcp_bindfd(uv_tcp_t *handle, int fd, int tcp_backlog)
 {
-       return _tcp_bindfd(handle, fd, tcp_accept);
+       return _tcp_bindfd(handle, fd, tcp_accept, tcp_backlog);
 }
 
-int tcp_bindfd_tls(uv_tcp_t *handle, int fd)
+int tcp_bindfd_tls(uv_tcp_t *handle, int fd, int tcp_backlog)
 {
-       return _tcp_bindfd(handle, fd, tls_accept);
+       return _tcp_bindfd(handle, fd, tls_accept, tcp_backlog);
 }
 
 int io_create(uv_loop_t *loop, uv_handle_t *handle, int type, unsigned family)
index c81b1c996fba295d6bdcef3abd4cfd249a9e3913..34e33fccf31f7fa3a75bed8a5b972a045b90c1a9 100644 (file)
@@ -27,10 +27,10 @@ struct tls_client_ctx_t;
 
 int udp_bind(uv_udp_t *handle, struct sockaddr *addr);
 int udp_bindfd(uv_udp_t *handle, int fd);
-int tcp_bind(uv_tcp_t *handle, struct sockaddr *addr);
-int tcp_bind_tls(uv_tcp_t *handle, struct sockaddr *addr);
-int tcp_bindfd(uv_tcp_t *handle, int fd);
-int tcp_bindfd_tls(uv_tcp_t *handle, int fd);
+int tcp_bind(uv_tcp_t *handle, struct sockaddr *addr, int tcp_backlog);
+int tcp_bind_tls(uv_tcp_t *handle, struct sockaddr *addr, int tcp_backlog);
+int tcp_bindfd(uv_tcp_t *handle, int fd, int tcp_backlog);
+int tcp_bindfd_tls(uv_tcp_t *handle, int fd, int tcp_backlog);
 void tcp_timeout_trigger(uv_timer_t *timer);
 
 /** Initialize the handle, incl. ->data = struct session * instance.
index 73282786313b8bd584019b4a2656419a9bf9b4a4..bae3fa8407bdb5e83c2d91433cd9fa6eaa345cc6 100644 (file)
@@ -46,7 +46,7 @@
        uv_ ## type ## _init((loop), (handle))
 #endif
 
-void network_init(struct network *net, uv_loop_t *loop)
+void network_init(struct network *net, uv_loop_t *loop, int tcp_backlog)
 {
        if (net != NULL) {
                net->loop = loop;
@@ -56,6 +56,7 @@ void network_init(struct network *net, uv_loop_t *loop)
                tls_session_ticket_ctx_create(loop, NULL, 0);
                net->tcp.in_idle_timeout = 10000;
                net->tcp.tls_handshake_timeout = TLS_MAX_HANDSHAKE_TIME;
+               net->tcp_backlog = tcp_backlog;
        }
 }
 
@@ -166,10 +167,10 @@ static int open_endpoint(struct network *net, struct endpoint *ep, struct sockad
                memset(ep->tcp, 0, sizeof(*ep->tcp));
                handle_init(tcp, net->loop, ep->tcp, sa->sa_family); /* can return! */
                if (flags & NET_TLS) {
-                       ret = tcp_bind_tls(ep->tcp, sa);
+                       ret = tcp_bind_tls(ep->tcp, sa, net->tcp_backlog);
                        ep->flags |= NET_TLS;
                } else {
-                       ret = tcp_bind(ep->tcp, sa);
+                       ret = tcp_bind(ep->tcp, sa, net->tcp_backlog);
                }
                if (ret != 0) {
                        return ret;
@@ -213,10 +214,10 @@ static int open_endpoint_fd(struct network *net, struct endpoint *ep, int fd, in
                }
                uv_tcp_init(net->loop, ep->tcp);
                if (use_tls) {
-                       ret = tcp_bindfd_tls(ep->tcp, fd);
+                       ret = tcp_bindfd_tls(ep->tcp, fd, net->tcp_backlog);
                        ep->flags |= NET_TLS;
                } else {
-                       ret = tcp_bindfd(ep->tcp, fd);
+                       ret = tcp_bindfd(ep->tcp, fd, net->tcp_backlog);
                }
                if (ret != 0) {
                        close_handle((uv_handle_t *)ep->tcp, false);
index cc7f2785402cbd5385549b2ac6d3c6decf8c3837..07d84adcae53a4eb7c7d04f975fa6368f614a326 100644 (file)
@@ -55,9 +55,10 @@ struct network {
        map_t tls_client_params;
        struct tls_session_ticket_ctx *tls_session_ticket_ctx;
        struct net_tcp_param tcp;
+       int tcp_backlog;
 };
 
-void network_init(struct network *net, uv_loop_t *loop);
+void network_init(struct network *net, uv_loop_t *loop, int tcp_backlog);
 void network_deinit(struct network *net);
 int network_listen_fd(struct network *net, int fd, bool use_tls);
 int network_listen(struct network *net, const char *addr, uint16_t port, uint32_t flags);