]> 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)
committerMarek Vavruša <mvavrusa@cloudflare.com>
Fri, 7 Sep 2018 17:45:21 +0000 (10:45 -0700)
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/engine.h
daemon/io.c
daemon/io.h
daemon/network.c
daemon/network.h
lib/zonecut.c

index c99ef63f283acfed6eb1fc3cb2669bc16fcee19b..eac02b2ca5ea58705950f398693a0991bd9c9b9c 100644 (file)
@@ -732,7 +732,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 6d0a73b7042c07ddc08eb50a640c078f02dcbec7..88fe4c42b8679c1182b2257ea7559676917922fc 100644 (file)
@@ -42,6 +42,9 @@
 #ifndef MAX_PIPELINED
 #define MAX_PIPELINED 100
 #endif
+#ifndef TCP_BACKLOG_DEFAULT
+#define TCP_BACKLOG_DEFAULT 511 /**< Maximum number of incomplete TCP connections in queue. Default is from Redis and Apache. */
+#endif
 
 /*
  * @internal These are forward decls to allow building modules with engine but without Lua.
index e6ee4a26022f84a4d63416713221aac4fc058251..ac4cf4958a7601920198aa8adc464fcff0b2c7b0 100644 (file)
@@ -359,7 +359,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) {
@@ -378,7 +378,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;
        }
@@ -386,17 +386,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);
@@ -407,21 +407,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);
 }
 
 void io_create(uv_loop_t *loop, uv_handle_t *handle, int type)
index 24c0c26e7be6d5e50f600005d278f9c19fc15c73..860fb3ef29216cf475d16cbd18fc3f698de9a187 100644 (file)
@@ -54,10 +54,10 @@ struct session *session_new(void);
 
 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);
 
 /** Initialize the handle, incl. ->data = struct session * instance. type = SOCK_* */
 void io_create(uv_loop_t *loop, uv_handle_t *handle, int type);
index a790474deb28f7b3a71bc641b1f5b38e4cc3bc16..190bb831febebabfaf7d855220ee3f23694bbb68 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;
@@ -55,6 +55,7 @@ void network_init(struct network *net, uv_loop_t *loop)
                net->tls_session_ticket_ctx = /* unsync. random, by default */
                        tls_session_ticket_ctx_create(loop, NULL, 0);
                net->tcp.in_idle_timeout = 10000;
+               net->tcp_backlog = tcp_backlog;
        }
 }
 
@@ -165,10 +166,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;
@@ -212,10 +213,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 15aac9e0ba1cb209d110178c7f5cd048d749ab63..548d61a23ea13e24c157615036366c1f9571e75e 100644 (file)
@@ -54,9 +54,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);
index f2ad4d139c71964a8877aafc198c400a3386bf54..e642e0b89c8a78a2e6a070fa547beebaa1b68a50 100644 (file)
@@ -467,13 +467,6 @@ int kr_zonecut_find_cached(struct kr_context *ctx, struct kr_zonecut *cut,
        return kr_error(ENOENT);
 }
 
-static int select_first_ns(const char *k, void *v, void *baton)
-{
-       assert(baton);
-       *((const knot_dname_t **)baton) = (const knot_dname_t *)k;
-       return 1;
-}
-
 const knot_dname_t *kr_zonecut_find_nsname(struct kr_zonecut *cut)
 {
        if (!cut) {
@@ -481,6 +474,11 @@ const knot_dname_t *kr_zonecut_find_nsname(struct kr_zonecut *cut)
        }
 
        const knot_dname_t *result = NULL;
-       map_walk(&cut->nsset, select_first_ns, &result);
+       trie_it_t *it;
+       for (it = trie_it_begin(cut->nsset); !trie_it_finished(it); trie_it_next(it)) {
+               result = (const knot_dname_t *)trie_it_key(it, NULL);
+               break;
+       }
+       trie_it_free(it);
        return result;
 }
\ No newline at end of file