diff --git a/CHANGES b/CHANGES
index 2f875887b8..d4a806b0fd 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+5517. [bug] Handle 'UV_EOF' differently and don't contribute it to
+ the RECVFAIL statistic count. [GL #2208]
+
5516. [func] The default EDNS buffer size has been changed from 4096
to 1232. [GL #2183]
diff --git a/bin/tests/system/statistics/tests.sh b/bin/tests/system/statistics/tests.sh
index 0301fb49a8..66e11b17df 100644
--- a/bin/tests/system/statistics/tests.sh
+++ b/bin/tests/system/statistics/tests.sh
@@ -162,6 +162,8 @@ if $FEATURETEST --have-libxml2 && [ -x "${CURL}" ] && [ -x "${XSLTPROC}" ] ; th
${CURL} http://10.53.0.3:${EXTRAPORT1}/xml/v3 > curl.out.${n}.xml 2>/dev/null || ret=1
${CURL} http://10.53.0.3:${EXTRAPORT1}/bind9.xsl > curl.out.${n}.xsl 2>/dev/null || ret=1
${XSLTPROC} curl.out.${n}.xsl - < curl.out.${n}.xml > xsltproc.out.${n} 2>/dev/null || ret=1
+ cp curl.out.${n}.xml stats.xml.out || ret=1
+
#
# grep for expected sections.
#
@@ -206,6 +208,30 @@ if [ $ret != 0 ]; then echo_i "failed"; fi
status=`expr $status + $ret`
n=`expr $n + 1`
+ret=0
+echo_i "checking bind9.xml socket statistics ($n)"
+if $FEATURETEST --have-libxml2 && [ -x "${CURL}" ] && [ -x "${XSLTPROC}" ] ; then
+ # Socket statistics (expect no errors)
+ grep "0" stats.xml.out >/dev/null || ret=1
+ grep "0" stats.xml.out >/dev/null || ret=1
+ grep "0" stats.xml.out >/dev/null || ret=1
+ grep "0" stats.xml.out >/dev/null || ret=1
+ grep "0" stats.xml.out >/dev/null || ret=1
+ grep "0" stats.xml.out >/dev/null || ret=1
+
+ grep "0" stats.xml.out >/dev/null || ret=1
+ grep "0" stats.xml.out >/dev/null || ret=1
+ grep "0" stats.xml.out >/dev/null || ret=1
+ grep "0" stats.xml.out >/dev/null || ret=1
+ grep "0" stats.xml.out >/dev/null || ret=1
+ grep "0" stats.xml.out >/dev/null || ret=1
+else
+ echo_i "skipping test as libxml2 and/or curl and/or xsltproc was not found"
+fi
+if [ $ret != 0 ]; then echo_i "failed"; fi
+status=`expr $status + $ret`
+n=`expr $n + 1`
+
ret=0
echo_i "checking priming queries are counted ($n)"
grep "1 priming queries" ns3/named.stats
diff --git a/doc/notes/notes-current.rst b/doc/notes/notes-current.rst
index 462dc0f422..5471c38509 100644
--- a/doc/notes/notes-current.rst
+++ b/doc/notes/notes-current.rst
@@ -67,3 +67,6 @@ Bug Fixes
- `named` would start continous rollovers for policies that algorithms
Ed25519 or Ed448 due to a mismatch in created key size and expected key size.
[GL #2171]
+
+- Handle `UV_EOF` differently such that it is not treated as a `TCP4RecvErr` or
+ `TCP6RecvErr`. [GL #2208]
diff --git a/lib/isc/netmgr/tcp.c b/lib/isc/netmgr/tcp.c
index 9c1471217c..3cd7bcd468 100644
--- a/lib/isc/netmgr/tcp.c
+++ b/lib/isc/netmgr/tcp.c
@@ -803,8 +803,10 @@ read_cb(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf) {
* This might happen if the inner socket is closing. It means that
* it's detached, so the socket will be closed.
*/
- if (cb != NULL) {
+ if (nread != UV_EOF) {
isc__nm_incstats(sock->mgr, sock->statsindex[STATID_RECVFAIL]);
+ }
+ if (cb != NULL) {
isc__nmsocket_clearcb(sock);
cb(sock->statichandle, ISC_R_EOF, NULL, cbarg);
}