2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-03 08:05:21 +00:00

netmgr fixes:

- use UV_{TC,UD}P_IPV6ONLY for IPv6 sockets, keeping the pre-netmgr
   behaviour.
 - add a new listening_error bool flag which is set if the child
   listener fails to start listening. This fixes a bug where named would
   hang if, e.g.,  we failed to bind to a TCP socket.
This commit is contained in:
Evan Hunt
2020-01-10 14:25:30 -08:00
parent 67c1ca9a79
commit e38004457c
3 changed files with 19 additions and 5 deletions

View File

@@ -390,6 +390,7 @@ struct isc_nmsocket {
*/ */
atomic_bool closed; atomic_bool closed;
atomic_bool listening; atomic_bool listening;
atomic_bool listen_error;
isc_refcount_t references; isc_refcount_t references;
/*% /*%

View File

@@ -180,7 +180,8 @@ isc_nm_listentcp(isc_nm_t *mgr, isc_nmiface_t *iface,
(isc__netievent_t *) ievent); (isc__netievent_t *) ievent);
LOCK(&nsock->lock); LOCK(&nsock->lock);
while (!atomic_load(&nsock->listening)) { while (!atomic_load(&nsock->listening) &&
!atomic_load(&nsock->listen_error)) {
WAIT(&nsock->cond, &nsock->lock); WAIT(&nsock->cond, &nsock->lock);
} }
UNLOCK(&nsock->lock); UNLOCK(&nsock->lock);
@@ -213,7 +214,7 @@ isc__nm_async_tcplisten(isc__networker_t *worker, isc__netievent_t *ev0) {
(isc__netievent_tcplisten_t *) ev0; (isc__netievent_tcplisten_t *) ev0;
isc_nmsocket_t *sock = ievent->sock; isc_nmsocket_t *sock = ievent->sock;
struct sockaddr_storage sname; struct sockaddr_storage sname;
int r, snamelen = sizeof(sname); int r, flags = 0, snamelen = sizeof(sname);
REQUIRE(isc__nm_in_netthread()); REQUIRE(isc__nm_in_netthread());
REQUIRE(sock->type == isc_nm_tcplistener); REQUIRE(sock->type == isc_nm_tcplistener);
@@ -241,13 +242,19 @@ isc__nm_async_tcplisten(isc__networker_t *worker, isc__netievent_t *ev0) {
/* It was never opened */ /* It was never opened */
atomic_store(&sock->closed, true); atomic_store(&sock->closed, true);
sock->result = isc__nm_uverr2result(r); sock->result = isc__nm_uverr2result(r);
atomic_store(&sock->listen_error, true);
goto done; goto done;
} }
if (sock->iface->addr.type.sa.sa_family == AF_INET6) {
flags = UV_TCP_IPV6ONLY;
}
r = uv_tcp_bind(&sock->uv_handle.tcp, &sock->iface->addr.type.sa, 0); r = uv_tcp_bind(&sock->uv_handle.tcp,
&sock->iface->addr.type.sa, flags);
if (r != 0) { if (r != 0) {
uv_close(&sock->uv_handle.handle, tcp_close_cb); uv_close(&sock->uv_handle.handle, tcp_close_cb);
sock->result = isc__nm_uverr2result(r); sock->result = isc__nm_uverr2result(r);
atomic_store(&sock->listen_error, true);
goto done; goto done;
} }
@@ -257,10 +264,12 @@ isc__nm_async_tcplisten(isc__networker_t *worker, isc__netievent_t *ev0) {
* initially returning success even if bind() fails, and this * initially returning success even if bind() fails, and this
* could cause a deadlock later if we didn't check first.) * could cause a deadlock later if we didn't check first.)
*/ */
r = uv_tcp_getsockname(&sock->uv_handle.tcp, &sname, &snamelen); r = uv_tcp_getsockname(&sock->uv_handle.tcp,
(struct sockaddr*) &sname, &snamelen);
if (r != 0) { if (r != 0) {
uv_close(&sock->uv_handle.handle, tcp_close_cb); uv_close(&sock->uv_handle.handle, tcp_close_cb);
sock->result = isc__nm_uverr2result(r); sock->result = isc__nm_uverr2result(r);
atomic_store(&sock->listen_error, true);
goto done; goto done;
} }

View File

@@ -130,8 +130,12 @@ isc__nm_async_udplisten(isc__networker_t *worker, isc__netievent_t *ev0) {
(isc_nmsocket_t **)&sock->uv_handle.udp.data); (isc_nmsocket_t **)&sock->uv_handle.udp.data);
uv_udp_open(&sock->uv_handle.udp, sock->fd); uv_udp_open(&sock->uv_handle.udp, sock->fd);
int flags = 0;
if (sock->iface->addr.type.sa.sa_family == AF_INET6) {
flags = UV_UDP_IPV6ONLY;
}
uv_udp_bind(&sock->uv_handle.udp, uv_udp_bind(&sock->uv_handle.udp,
&sock->parent->iface->addr.type.sa, 0); &sock->parent->iface->addr.type.sa, flags);
uv_recv_buffer_size(&sock->uv_handle.handle, uv_recv_buffer_size(&sock->uv_handle.handle,
&(int){16 * 1024 * 1024}); &(int){16 * 1024 * 1024});
uv_send_buffer_size(&sock->uv_handle.handle, uv_send_buffer_size(&sock->uv_handle.handle,