From: Marek VavruĊĦa Date: Fri, 6 Apr 2018 16:32:17 +0000 (-0700) Subject: network: make TCP_BACKLOG_DEFAULT a compile time define and set to default X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8314318d92891dc2f2322dff50784a24146ebe2c;p=thirdparty%2Fknot-resolver.git network: make TCP_BACKLOG_DEFAULT a compile time define and set to default 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). --- diff --git a/daemon/engine.c b/daemon/engine.c index c99ef63f2..eac02b2ca 100644 --- a/daemon/engine.c +++ b/daemon/engine.c @@ -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; } diff --git a/daemon/engine.h b/daemon/engine.h index 6d0a73b70..88fe4c42b 100644 --- a/daemon/engine.h +++ b/daemon/engine.h @@ -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. diff --git a/daemon/io.c b/daemon/io.c index e6ee4a260..ac4cf4958 100644 --- a/daemon/io.c +++ b/daemon/io.c @@ -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) diff --git a/daemon/io.h b/daemon/io.h index 24c0c26e7..860fb3ef2 100644 --- a/daemon/io.h +++ b/daemon/io.h @@ -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); diff --git a/daemon/network.c b/daemon/network.c index a790474de..190bb831f 100644 --- a/daemon/network.c +++ b/daemon/network.c @@ -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); diff --git a/daemon/network.h b/daemon/network.h index 15aac9e0b..548d61a23 100644 --- a/daemon/network.h +++ b/daemon/network.h @@ -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); diff --git a/lib/zonecut.c b/lib/zonecut.c index f2ad4d139..e642e0b89 100644 --- a/lib/zonecut.c +++ b/lib/zonecut.c @@ -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