mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-29 05:28:00 +00:00
On platforms without load-balancing socket all the queries would be handle by a single thread. Currently, the support for load-balanced sockets is present in Linux with SO_REUSEPORT and FreeBSD 12 with SO_REUSEPORT_LB. This commit adds workaround for such platforms that: 1. setups single shared listening socket for all listening nmthreads for UDP, TCP and TCPDNS netmgr transports 2. Calls uv_udp_bind/uv_tcp_bind on the underlying socket just once and for rest of the nmthreads only copy the internal libuv flags (should be just UV_HANDLE_BOUND and optionally UV_HANDLE_IPV6). 3. start reading on UDP socket or listening on TCP socket The load distribution among the nmthreads is uneven, but it's still better than utilizing just one thread for processing all the incoming queries
99 lines
2.4 KiB
C
99 lines
2.4 KiB
C
/*
|
|
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, you can obtain one at https://mozilla.org/MPL/2.0/.
|
|
*
|
|
* See the COPYRIGHT file distributed with this work for additional
|
|
* information regarding copyright ownership.
|
|
*/
|
|
|
|
#include <stdbool.h>
|
|
#include <uv.h>
|
|
|
|
#include <isc/result.h>
|
|
#include <isc/strerr.h>
|
|
#include <isc/string.h>
|
|
#include <isc/util.h>
|
|
|
|
#include "netmgr-int.h"
|
|
|
|
/*%
|
|
* Convert a libuv error value into an isc_result_t. The
|
|
* list of supported error values is not complete; new users
|
|
* of this function should add any expected errors that are
|
|
* not already there.
|
|
*/
|
|
isc_result_t
|
|
isc___nm_uverr2result(int uverr, bool dolog, const char *file,
|
|
unsigned int line, const char *func) {
|
|
switch (uverr) {
|
|
case 0:
|
|
return (ISC_R_SUCCESS);
|
|
case UV_ENOTDIR:
|
|
case UV_ELOOP:
|
|
case UV_EINVAL: /* XXX sometimes this is not for files */
|
|
case UV_ENAMETOOLONG:
|
|
case UV_EBADF:
|
|
return (ISC_R_INVALIDFILE);
|
|
case UV_ENOENT:
|
|
return (ISC_R_FILENOTFOUND);
|
|
case UV_EAGAIN:
|
|
return (ISC_R_NOCONN);
|
|
case UV_EACCES:
|
|
case UV_EPERM:
|
|
return (ISC_R_NOPERM);
|
|
case UV_EEXIST:
|
|
return (ISC_R_FILEEXISTS);
|
|
case UV_EIO:
|
|
return (ISC_R_IOERROR);
|
|
case UV_ENOMEM:
|
|
return (ISC_R_NOMEMORY);
|
|
case UV_ENFILE:
|
|
case UV_EMFILE:
|
|
return (ISC_R_TOOMANYOPENFILES);
|
|
case UV_ENOSPC:
|
|
return (ISC_R_DISCFULL);
|
|
case UV_EPIPE:
|
|
case UV_ECONNRESET:
|
|
case UV_ECONNABORTED:
|
|
return (ISC_R_CONNECTIONRESET);
|
|
case UV_ENOTCONN:
|
|
return (ISC_R_NOTCONNECTED);
|
|
case UV_ETIMEDOUT:
|
|
return (ISC_R_TIMEDOUT);
|
|
case UV_ENOBUFS:
|
|
return (ISC_R_NORESOURCES);
|
|
case UV_EAFNOSUPPORT:
|
|
return (ISC_R_FAMILYNOSUPPORT);
|
|
case UV_ENETDOWN:
|
|
return (ISC_R_NETDOWN);
|
|
case UV_EHOSTDOWN:
|
|
return (ISC_R_HOSTDOWN);
|
|
case UV_ENETUNREACH:
|
|
return (ISC_R_NETUNREACH);
|
|
case UV_EHOSTUNREACH:
|
|
return (ISC_R_HOSTUNREACH);
|
|
case UV_EADDRINUSE:
|
|
return (ISC_R_ADDRINUSE);
|
|
case UV_EADDRNOTAVAIL:
|
|
return (ISC_R_ADDRNOTAVAIL);
|
|
case UV_ECONNREFUSED:
|
|
return (ISC_R_CONNREFUSED);
|
|
case UV_ECANCELED:
|
|
return (ISC_R_CANCELED);
|
|
case UV_EOF:
|
|
return (ISC_R_EOF);
|
|
default:
|
|
if (dolog) {
|
|
UNEXPECTED_ERROR(
|
|
file, line,
|
|
"unable to convert libuv "
|
|
"error code in %s to isc_result: %d: %s",
|
|
func, uverr, uv_strerror(uverr));
|
|
}
|
|
return (ISC_R_UNEXPECTED);
|
|
}
|
|
}
|