]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
TCP: use uv_try_write() to optimise sends
authorArtem Boldariev <artem@boldariev.com>
Thu, 10 Nov 2022 19:05:00 +0000 (21:05 +0200)
committerArtem Boldariev <artem@boldariev.com>
Tue, 29 Nov 2022 11:41:10 +0000 (13:41 +0200)
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.

lib/isc/netmgr/tcp.c

index 239a24fb5a7f384b771ceaf31f0c363f38c97a33..bd3da5235cb348e758cf1d6c3b492e36189c2e8f 100644 (file)
@@ -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));
        }