2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-04 00:25:29 +00:00

count statistics in netmgr UDP code

- also restored a test in the statistics test which was changed when
  the netmgr was introduced because active sockets were not being
  counted.
This commit is contained in:
Evan Hunt
2020-01-06 20:26:47 -08:00
parent 80a5c9f5c8
commit 90a1dabe74
3 changed files with 32 additions and 11 deletions

View File

@@ -71,7 +71,7 @@ $RNDCCMD -s 10.53.0.3 stats > /dev/null 2>&1
[ -f ns3/named.stats ] || ret=1 [ -f ns3/named.stats ] || ret=1
if [ ! "$CYGWIN" ]; then if [ ! "$CYGWIN" ]; then
nsock0nstat=`grep "UDP/IPv4 sockets active" ns3/named.stats | awk '{print $1}'` nsock0nstat=`grep "UDP/IPv4 sockets active" ns3/named.stats | awk '{print $1}'`
[ 0 -eq ${nsock0nstat:-0} ] || ret=1 [ 0 -ne ${nsock0nstat:-0} ] || ret=1
fi fi
if [ $ret != 0 ]; then echo_i "failed"; fi if [ $ret != 0 ]; then echo_i "failed"; fi
status=`expr $status + $ret` status=`expr $status + $ret`

View File

@@ -855,6 +855,8 @@ isc__nmsocket_prep_destroy(isc_nmsocket_t *sock) {
if (sock->children != NULL) { if (sock->children != NULL) {
for (int i = 0; i < sock->nchildren; i++) { for (int i = 0; i < sock->nchildren; i++) {
atomic_store(&sock->children[i].active, false); atomic_store(&sock->children[i].active, false);
isc__nm_decstats(sock->mgr,
sock->statsindex[STATID_ACTIVE]);
} }
} }
@@ -950,6 +952,7 @@ isc__nmsocket_init(isc_nmsocket_t *sock, isc_nm_t *mgr,
} else { } else {
sock->statsindex = udp6statsindex; sock->statsindex = udp6statsindex;
} }
isc__nm_incstats(sock->mgr, sock->statsindex[STATID_ACTIVE]);
break; break;
case isc_nm_tcpsocket: case isc_nm_tcpsocket:
case isc_nm_tcplistener: case isc_nm_tcplistener:
@@ -960,6 +963,7 @@ isc__nmsocket_init(isc_nmsocket_t *sock, isc_nm_t *mgr,
sock->statsindex = tcp6statsindex; sock->statsindex = tcp6statsindex;
} }
break; break;
isc__nm_incstats(sock->mgr, sock->statsindex[STATID_ACTIVE]);
default: default:
break; break;
} }

View File

@@ -117,6 +117,7 @@ isc__nm_async_udplisten(isc__networker_t *worker, isc__netievent_t *ev0) {
isc__netievent_udplisten_t *ievent = isc__netievent_udplisten_t *ievent =
(isc__netievent_udplisten_t *) ev0; (isc__netievent_udplisten_t *) ev0;
isc_nmsocket_t *sock = ievent->sock; isc_nmsocket_t *sock = ievent->sock;
int r, flags = 0;
REQUIRE(sock->type == isc_nm_udpsocket); REQUIRE(sock->type == isc_nm_udpsocket);
REQUIRE(sock->iface != NULL); REQUIRE(sock->iface != NULL);
@@ -127,19 +128,30 @@ isc__nm_async_udplisten(isc__networker_t *worker, isc__netievent_t *ev0) {
isc_nmsocket_attach(sock, isc_nmsocket_attach(sock,
(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); r = uv_udp_open(&sock->uv_handle.udp, sock->fd);
int flags = 0; if (r == 0) {
isc__nm_incstats(sock->mgr, sock->statsindex[STATID_OPEN]);
} else {
isc__nm_incstats(sock->mgr,
sock->statsindex[STATID_OPENFAIL]);
}
if (sock->iface->addr.type.sa.sa_family == AF_INET6) { if (sock->iface->addr.type.sa.sa_family == AF_INET6) {
flags = UV_UDP_IPV6ONLY; flags = UV_UDP_IPV6ONLY;
} }
uv_udp_bind(&sock->uv_handle.udp,
&sock->parent->iface->addr.type.sa, flags); r = uv_udp_bind(&sock->uv_handle.udp,
&sock->parent->iface->addr.type.sa, flags);
if (r < 0) {
isc__nm_incstats(sock->mgr,
sock->statsindex[STATID_BINDFAIL]);
}
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,
&(int){16 * 1024 * 1024}); &(int){16 * 1024 * 1024});
uv_udp_recv_start(&sock->uv_handle.udp, isc__nm_alloc_cb, uv_udp_recv_start(&sock->uv_handle.udp, isc__nm_alloc_cb, udp_recv_cb);
udp_recv_cb);
} }
static void static void
@@ -157,6 +169,8 @@ stop_udp_child(isc_nmsocket_t *sock) {
uv_udp_recv_stop(&sock->uv_handle.udp); uv_udp_recv_stop(&sock->uv_handle.udp);
uv_close((uv_handle_t *) &sock->uv_handle.udp, udp_close_cb); uv_close((uv_handle_t *) &sock->uv_handle.udp, udp_close_cb);
isc__nm_incstats(sock->mgr, sock->statsindex[STATID_CLOSE]);
LOCK(&sock->parent->lock); LOCK(&sock->parent->lock);
atomic_fetch_sub(&sock->parent->rchildren, 1); atomic_fetch_sub(&sock->parent->rchildren, 1);
UNLOCK(&sock->parent->lock); UNLOCK(&sock->parent->lock);
@@ -258,10 +272,9 @@ isc__nm_async_udpstop(isc__networker_t *worker, isc__netievent_t *ev0) {
} }
/* /*
* udp_recv_cb handles incoming UDP packet from uv. * udp_recv_cb handles incoming UDP packet from uv. The buffer here is
* The buffer here is reused for a series of packets, * reused for a series of packets, so we need to allocate a new one. This
* so we need to allocate a new one. This new one can * new one can be reused to send the response then.
* be reused to send the response then.
*/ */
static void static void
udp_recv_cb(uv_udp_t *handle, ssize_t nrecv, const uv_buf_t *buf, udp_recv_cb(uv_udp_t *handle, ssize_t nrecv, const uv_buf_t *buf,
@@ -434,6 +447,8 @@ udp_send_cb(uv_udp_send_t *req, int status) {
if (status < 0) { if (status < 0) {
result = isc__nm_uverr2result(status); result = isc__nm_uverr2result(status);
isc__nm_incstats(uvreq->sock->mgr,
uvreq->sock->statsindex[STATID_SENDFAIL]);
} }
uvreq->cb.send(uvreq->handle, result, uvreq->cbarg); uvreq->cb.send(uvreq->handle, result, uvreq->cbarg);
@@ -459,6 +474,8 @@ udp_send_direct(isc_nmsocket_t *sock, isc__nm_uvreq_t *req,
&sock->uv_handle.udp, &req->uvbuf, 1, &sock->uv_handle.udp, &req->uvbuf, 1,
&peer->type.sa, udp_send_cb); &peer->type.sa, udp_send_cb);
if (rv < 0) { if (rv < 0) {
isc__nm_incstats(req->sock->mgr,
req->sock->statsindex[STATID_SENDFAIL]);
return (isc__nm_uverr2result(rv)); return (isc__nm_uverr2result(rv));
} }