From: Artem Boldariev Date: Thu, 10 Nov 2022 19:05:00 +0000 (+0200) Subject: TCP: use uv_try_write() to optimise sends X-Git-Tag: v9.19.8~37^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9b1c8c03fddb7cf8c85e9def09125348867b47b0;p=thirdparty%2Fbind9.git TCP: use uv_try_write() to optimise sends This commit make TCP code use uv_try_write() on best effort basis, just like TCP DNS and TLS DNS code does. This optimisation was added in 'caa5b6548a11da6ca772d6f7e10db3a164a18f8d' but, similar change was mistakenly omitted for generic TCP code. This commit fixes that. --- diff --git a/lib/isc/netmgr/tcp.c b/lib/isc/netmgr/tcp.c index 239a24fb5a7..bd3da5235cb 100644 --- a/lib/isc/netmgr/tcp.c +++ b/lib/isc/netmgr/tcp.c @@ -1071,8 +1071,23 @@ tcp_send_direct(isc_nmsocket_t *sock, isc__nm_uvreq_t *req) { return (ISC_R_CANCELED); } - r = uv_write(&req->uv_req.write, &sock->uv_handle.stream, &req->uvbuf, - 1, tcp_send_cb); + uv_buf_t uvbuf = { .base = req->uvbuf.base, .len = req->uvbuf.len }; + + r = uv_try_write(&sock->uv_handle.stream, &uvbuf, 1); + + if (r == (int)(uvbuf.len)) { + /* Wrote everything */ + isc__nm_sendcb(sock, req, ISC_R_SUCCESS, true); + return (ISC_R_SUCCESS); + } else if (r > 0) { + uvbuf.base += (size_t)r; + uvbuf.len -= (size_t)r; + } else if (!(r == UV_ENOSYS || r == UV_EAGAIN)) { + return (isc_uverr2result(r)); + } + + r = uv_write(&req->uv_req.write, &sock->uv_handle.stream, &uvbuf, 1, + tcp_send_cb); if (r < 0) { return (isc_uverr2result(r)); }