]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Change single write timer to per-send timers
authorOndřej Surý <ondrej@isc.org>
Thu, 10 Mar 2022 12:51:08 +0000 (13:51 +0100)
committerOndřej Surý <ondrej@isc.org>
Fri, 11 Mar 2022 08:56:57 +0000 (09:56 +0100)
Previously, there was a single per-socket write timer that would get
restarted for every new write.  This turned out to be insufficient
because the other side could keep reseting the timer, and never reading
back the responses.

Change the single write timer to per-send timer which would in turn
reset the TCP connection on the first send timeout.

lib/isc/netmgr/netmgr-int.h
lib/isc/netmgr/netmgr.c
lib/isc/netmgr/tcp.c
lib/isc/netmgr/tcpdns.c
lib/isc/netmgr/timer.c
lib/isc/netmgr/tlsdns.c
lib/isc/netmgr/udp.c

index 596423458b01ff1fe05a28d82ed249305d9201f9..75949c869aba1bb66998cd065366268a15c1c8a3 100644 (file)
@@ -377,15 +377,15 @@ struct isc__nm_uvreq {
        int magic;
        isc_nmsocket_t *sock;
        isc_nmhandle_t *handle;
-       char tcplen[2];       /* The TCP DNS message length */
-       uv_buf_t uvbuf;       /* translated isc_region_t, to be
-                              * sent or received */
-       isc_sockaddr_t local; /* local address */
-       isc_sockaddr_t peer;  /* peer address */
-       isc__nm_cb_t cb;      /* callback */
-       void *cbarg;          /* callback argument */
-       uv_pipe_t ipc;        /* used for sending socket
-                              * uv_handles to other threads */
+       char tcplen[2];        /* The TCP DNS message length */
+       uv_buf_t uvbuf;        /* translated isc_region_t, to be
+                               * sent or received */
+       isc_sockaddr_t local;  /* local address */
+       isc_sockaddr_t peer;   /* peer address */
+       isc__nm_cb_t cb;       /* callback */
+       void *cbarg;           /* callback argument */
+       isc_nm_timer_t *timer; /* TCP write timer */
+
        union {
                uv_handle_t handle;
                uv_req_t req;
@@ -972,9 +972,7 @@ struct isc_nmsocket {
        /*%
         * TCP write timeout timer.
         */
-       uv_timer_t write_timer;
        uint64_t write_timeout;
-       int64_t writes;
 
        /*% outer socket is for 'wrapped' sockets - e.g. tcpdns in tcp */
        isc_nmsocket_t *outer;
@@ -2097,7 +2095,7 @@ isc__nmsocket_connecttimeout_cb(uv_timer_t *timer);
 void
 isc__nmsocket_readtimeout_cb(uv_timer_t *timer);
 void
-isc__nmsocket_writetimeout_cb(uv_timer_t *timer);
+isc__nmsocket_writetimeout_cb(void *data, isc_result_t eresult);
 
 #define UV_RUNTIME_CHECK(func, ret)                                           \
        if (ret != 0) {                                                       \
index f23be6bca9a17a4dd464a6fa93b13aa4ba0ea06f..3ac756917601cff23988f5c172921d397961ddf1 100644 (file)
@@ -1985,11 +1985,15 @@ isc__nm_accept_connection_log(isc_result_t result, bool can_log_quota) {
 }
 
 void
-isc__nmsocket_writetimeout_cb(uv_timer_t *timer) {
-       isc_nmsocket_t *sock = uv_handle_get_data((uv_handle_t *)timer);
+isc__nmsocket_writetimeout_cb(void *data, isc_result_t eresult) {
+       isc__nm_uvreq_t *req = data;
+       isc_nmsocket_t *sock = NULL;
 
-       int r = uv_timer_stop(&sock->write_timer);
-       UV_RUNTIME_CHECK(uv_timer_stop, r);
+       REQUIRE(eresult == ISC_R_TIMEDOUT);
+       REQUIRE(VALID_UVREQ(req));
+       REQUIRE(VALID_NMSOCK(req->sock));
+
+       sock = req->sock;
 
        isc__nmsocket_reset(sock);
 }
@@ -2802,6 +2806,13 @@ isc__nm_async_detach(isc__networker_t *worker, isc__netievent_t *ev0) {
        nmhandle_detach_cb(&ievent->handle FLARG_PASS);
 }
 
+static void
+reset_shutdown(uv_handle_t *handle) {
+       isc_nmsocket_t *sock = uv_handle_get_data(handle);
+
+       isc__nmsocket_shutdown(sock);
+}
+
 void
 isc__nmsocket_reset(isc_nmsocket_t *sock) {
        REQUIRE(VALID_NMSOCK(sock));
@@ -2827,10 +2838,10 @@ isc__nmsocket_reset(isc_nmsocket_t *sock) {
                 * The real shutdown will be handled in the respective
                 * close functions.
                 */
-               int r = uv_tcp_close_reset(&sock->uv_handle.tcp, NULL);
+               int r = uv_tcp_close_reset(&sock->uv_handle.tcp,
+                                          reset_shutdown);
                UV_RUNTIME_CHECK(uv_tcp_close_reset, r);
        }
-       isc__nmsocket_shutdown(sock);
 }
 
 void
index 43761b633790181ee32f4139db428e2acdd1b850..85edea5df6b5d6ed3d66d768f2d83e3ec3497cdf 100644 (file)
@@ -78,9 +78,6 @@ quota_accept_cb(isc_quota_t *quota, void *sock0);
 static void
 failed_accept_cb(isc_nmsocket_t *sock, isc_result_t eresult);
 
-static void
-failed_send_cb(isc_nmsocket_t *sock, isc__nm_uvreq_t *req,
-              isc_result_t eresult);
 static void
 stop_tcp_parent(isc_nmsocket_t *sock);
 static void
@@ -144,10 +141,6 @@ tcp_connect_direct(isc_nmsocket_t *sock, isc__nm_uvreq_t *req) {
        UV_RUNTIME_CHECK(uv_timer_init, r);
        uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
 
-       r = uv_timer_init(&worker->loop, &sock->write_timer);
-       UV_RUNTIME_CHECK(uv_timer_init, r);
-       uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
-
        r = uv_tcp_open(&sock->uv_handle.tcp, sock->fd);
        if (r != 0) {
                isc__nm_closesocket(sock->fd);
@@ -542,10 +535,6 @@ isc__nm_async_tcplisten(isc__networker_t *worker, isc__netievent_t *ev0) {
        UV_RUNTIME_CHECK(uv_timer_init, r);
        uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
 
-       r = uv_timer_init(&worker->loop, &sock->write_timer);
-       UV_RUNTIME_CHECK(uv_timer_init, r);
-       uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
-
        LOCK(&sock->parent->lock);
 
        r = uv_tcp_open(&sock->uv_handle.tcp, sock->fd);
@@ -718,19 +707,6 @@ destroy:
        }
 }
 
-static void
-failed_send_cb(isc_nmsocket_t *sock, isc__nm_uvreq_t *req,
-              isc_result_t eresult) {
-       REQUIRE(VALID_NMSOCK(sock));
-       REQUIRE(VALID_UVREQ(req));
-
-       if (req->cb.send != NULL) {
-               isc__nm_sendcb(sock, req, eresult, true);
-       } else {
-               isc__nm_uvreq_put(&req, sock);
-       }
-}
-
 void
 isc__nm_tcp_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
        REQUIRE(VALID_NMHANDLE(handle));
@@ -992,10 +968,6 @@ accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) {
        UV_RUNTIME_CHECK(uv_timer_init, r);
        uv_handle_set_data((uv_handle_t *)&csock->read_timer, csock);
 
-       r = uv_timer_init(&worker->loop, &csock->write_timer);
-       UV_RUNTIME_CHECK(uv_timer_init, r);
-       uv_handle_set_data((uv_handle_t *)&csock->write_timer, csock);
-
        r = uv_accept(&ssock->uv_handle.stream, &csock->uv_handle.stream);
        if (r != 0) {
                result = isc__nm_uverr2result(r);
@@ -1106,20 +1078,20 @@ isc__nm_tcp_send(isc_nmhandle_t *handle, const isc_region_t *region,
 static void
 tcp_send_cb(uv_write_t *req, int status) {
        isc__nm_uvreq_t *uvreq = (isc__nm_uvreq_t *)req->data;
+       isc_nmsocket_t *sock = NULL;
 
        REQUIRE(VALID_UVREQ(uvreq));
-       REQUIRE(VALID_NMHANDLE(uvreq->handle));
+       REQUIRE(VALID_NMSOCK(uvreq->sock));
 
-       isc_nmsocket_t *sock = uvreq->sock;
+       sock = uvreq->sock;
 
-       if (--sock->writes == 0) {
-               int r = uv_timer_stop(&sock->write_timer);
-               UV_RUNTIME_CHECK(uv_timer_stop, r);
-       }
+       isc_nm_timer_stop(uvreq->timer);
+       isc_nm_timer_detach(&uvreq->timer);
 
        if (status < 0) {
                isc__nm_incstats(sock, STATID_SENDFAIL);
-               failed_send_cb(sock, uvreq, isc__nm_uverr2result(status));
+               isc__nm_failed_send_cb(sock, uvreq,
+                                      isc__nm_uverr2result(status));
                return;
        }
 
@@ -1143,7 +1115,7 @@ isc__nm_async_tcpsend(isc__networker_t *worker, isc__netievent_t *ev0) {
        result = tcp_send_direct(sock, uvreq);
        if (result != ISC_R_SUCCESS) {
                isc__nm_incstats(sock, STATID_SENDFAIL);
-               failed_send_cb(sock, uvreq, result);
+               isc__nm_failed_send_cb(sock, uvreq, result);
        }
 }
 
@@ -1160,17 +1132,18 @@ tcp_send_direct(isc_nmsocket_t *sock, isc__nm_uvreq_t *req) {
                return (ISC_R_CANCELED);
        }
 
-       r = uv_timer_start(&sock->write_timer, isc__nmsocket_writetimeout_cb,
-                          sock->write_timeout, 0);
-       UV_RUNTIME_CHECK(uv_timer_start, r);
-       RUNTIME_CHECK(sock->writes++ >= 0);
-
        r = uv_write(&req->uv_req.write, &sock->uv_handle.stream, &req->uvbuf,
                     1, tcp_send_cb);
        if (r < 0) {
                return (isc__nm_uverr2result(r));
        }
 
+       isc_nm_timer_create(req->handle, isc__nmsocket_writetimeout_cb, req,
+                           &req->timer);
+       if (sock->write_timeout > 0) {
+               isc_nm_timer_start(req->timer, sock->write_timeout);
+       }
+
        return (ISC_R_SUCCESS);
 }
 
@@ -1241,17 +1214,6 @@ read_timer_close_cb(uv_handle_t *handle) {
        }
 }
 
-static void
-write_timer_close_cb(uv_handle_t *timer) {
-       isc_nmsocket_t *sock = uv_handle_get_data(timer);
-       uv_handle_set_data(timer, NULL);
-
-       REQUIRE(VALID_NMSOCK(sock));
-
-       uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
-       uv_close((uv_handle_t *)&sock->read_timer, read_timer_close_cb);
-}
-
 static void
 stop_tcp_child(isc_nmsocket_t *sock) {
        REQUIRE(sock->type == isc_nm_tcpsocket);
@@ -1304,8 +1266,6 @@ stop_tcp_parent(isc_nmsocket_t *sock) {
 
 static void
 tcp_close_direct(isc_nmsocket_t *sock) {
-       int r;
-
        REQUIRE(VALID_NMSOCK(sock));
        REQUIRE(sock->tid == isc_nm_tid());
        REQUIRE(atomic_load(&sock->closing));
@@ -1327,10 +1287,8 @@ tcp_close_direct(isc_nmsocket_t *sock) {
        isc__nmsocket_timer_stop(sock);
        isc__nm_stop_reading(sock);
 
-       r = uv_timer_stop(&sock->write_timer);
-       UV_RUNTIME_CHECK(uv_timer_stop, r);
-       uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
-       uv_close((uv_handle_t *)&sock->write_timer, write_timer_close_cb);
+       uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
+       uv_close((uv_handle_t *)&sock->read_timer, read_timer_close_cb);
 }
 
 void
index fd5a1b6781cd98ca474303e48f77eaa1e8a7e989..a0d7961ff80f139570f83e363474cffc4d72b39b 100644 (file)
@@ -102,10 +102,6 @@ tcpdns_connect_direct(isc_nmsocket_t *sock, isc__nm_uvreq_t *req) {
        UV_RUNTIME_CHECK(uv_timer_init, r);
        uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
 
-       r = uv_timer_init(&worker->loop, &sock->write_timer);
-       UV_RUNTIME_CHECK(uv_timer_init, r);
-       uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
-
        if (isc__nm_closing(sock)) {
                result = ISC_R_SHUTTINGDOWN;
                goto error;
@@ -505,10 +501,6 @@ isc__nm_async_tcpdnslisten(isc__networker_t *worker, isc__netievent_t *ev0) {
        UV_RUNTIME_CHECK(uv_timer_init, r);
        uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
 
-       r = uv_timer_init(&worker->loop, &sock->write_timer);
-       UV_RUNTIME_CHECK(uv_timer_init, r);
-       uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
-
        LOCK(&sock->parent->lock);
 
        r = uv_tcp_open(&sock->uv_handle.tcp, sock->fd);
@@ -978,10 +970,6 @@ accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) {
        UV_RUNTIME_CHECK(uv_timer_init, r);
        uv_handle_set_data((uv_handle_t *)&csock->read_timer, csock);
 
-       r = uv_timer_init(&worker->loop, &csock->write_timer);
-       UV_RUNTIME_CHECK(uv_timer_init, r);
-       uv_handle_set_data((uv_handle_t *)&csock->write_timer, csock);
-
        r = uv_accept(&ssock->uv_handle.stream, &csock->uv_handle.stream);
        if (r != 0) {
                result = isc__nm_uverr2result(r);
@@ -1118,14 +1106,12 @@ tcpdns_send_cb(uv_write_t *req, int status) {
        isc_nmsocket_t *sock = NULL;
 
        REQUIRE(VALID_UVREQ(uvreq));
-       REQUIRE(VALID_NMHANDLE(uvreq->handle));
+       REQUIRE(VALID_NMSOCK(uvreq->sock));
 
        sock = uvreq->sock;
 
-       if (--sock->writes == 0) {
-               int r = uv_timer_stop(&sock->write_timer);
-               UV_RUNTIME_CHECK(uv_timer_stop, r);
-       }
+       isc_nm_timer_stop(uvreq->timer);
+       isc_nm_timer_detach(&uvreq->timer);
 
        if (status < 0) {
                isc__nm_incstats(sock, STATID_SENDFAIL);
@@ -1193,11 +1179,6 @@ isc__nm_async_tcpdnssend(isc__networker_t *worker, isc__netievent_t *ev0) {
                goto fail;
        }
 
-       r = uv_timer_start(&sock->write_timer, isc__nmsocket_writetimeout_cb,
-                          sock->write_timeout, 0);
-       UV_RUNTIME_CHECK(uv_timer_start, r);
-       RUNTIME_CHECK(sock->writes++ >= 0);
-
        r = uv_write(&uvreq->uv_req.write, &sock->uv_handle.stream, bufs, nbufs,
                     tcpdns_send_cb);
        if (r < 0) {
@@ -1205,6 +1186,12 @@ isc__nm_async_tcpdnssend(isc__networker_t *worker, isc__netievent_t *ev0) {
                goto fail;
        }
 
+       isc_nm_timer_create(uvreq->handle, isc__nmsocket_writetimeout_cb, uvreq,
+                           &uvreq->timer);
+       if (sock->write_timeout > 0) {
+               isc_nm_timer_start(uvreq->timer, sock->write_timeout);
+       }
+
        return;
 fail:
        isc__nm_incstats(sock, STATID_SENDFAIL);
@@ -1282,17 +1269,6 @@ read_timer_close_cb(uv_handle_t *timer) {
        }
 }
 
-static void
-write_timer_close_cb(uv_handle_t *timer) {
-       isc_nmsocket_t *sock = uv_handle_get_data(timer);
-       uv_handle_set_data(timer, NULL);
-
-       REQUIRE(VALID_NMSOCK(sock));
-
-       uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
-       uv_close((uv_handle_t *)&sock->read_timer, read_timer_close_cb);
-}
-
 static void
 stop_tcpdns_child(isc_nmsocket_t *sock) {
        REQUIRE(sock->type == isc_nm_tcpdnssocket);
@@ -1345,7 +1321,6 @@ stop_tcpdns_parent(isc_nmsocket_t *sock) {
 
 static void
 tcpdns_close_direct(isc_nmsocket_t *sock) {
-       int r;
        REQUIRE(VALID_NMSOCK(sock));
        REQUIRE(sock->tid == isc_nm_tid());
        REQUIRE(atomic_load(&sock->closing));
@@ -1361,10 +1336,8 @@ tcpdns_close_direct(isc_nmsocket_t *sock) {
        isc__nmsocket_timer_stop(sock);
        isc__nm_stop_reading(sock);
 
-       r = uv_timer_stop(&sock->write_timer);
-       UV_RUNTIME_CHECK(uv_timer_stop, r);
-       uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
-       uv_close((uv_handle_t *)&sock->write_timer, write_timer_close_cb);
+       uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
+       uv_close((uv_handle_t *)&sock->read_timer, read_timer_close_cb);
 }
 
 void
index 3016387b0fad1d75f5347bcb4274eaf3313fa92c..83287750ab5ecdf83c6b6c7dcb3ffd9af37eb817 100644 (file)
@@ -41,6 +41,7 @@ isc_nm_timer_create(isc_nmhandle_t *handle, isc_nm_timer_cb cb, void *cbarg,
        sock = handle->sock;
        worker = &sock->mgr->workers[isc_nm_tid()];
 
+       /* TODO: per-loop object cache */
        timer = isc_mem_get(sock->mgr->mctx, sizeof(*timer));
        *timer = (isc_nm_timer_t){ .cb = cb, .cbarg = cbarg };
        isc_refcount_init(&timer->references, 1);
@@ -91,7 +92,8 @@ isc_nm_timer_detach(isc_nm_timer_t **timerp) {
        REQUIRE(VALID_NMSOCK(handle->sock));
 
        if (isc_refcount_decrement(&timer->references) == 1) {
-               uv_timer_stop(&timer->timer);
+               int r = uv_timer_stop(&timer->timer);
+               UV_RUNTIME_CHECK(uv_timer_stop, r);
                uv_close((uv_handle_t *)&timer->timer, timer_destroy);
        }
 }
index cea2041f9ed4e9ddc7963a72cd406a350a8b2fa2..1347666232da61c6c8288be29790ff88a49b078f 100644 (file)
@@ -118,10 +118,6 @@ tlsdns_connect_direct(isc_nmsocket_t *sock, isc__nm_uvreq_t *req) {
        UV_RUNTIME_CHECK(uv_timer_init, r);
        uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
 
-       r = uv_timer_init(&worker->loop, &sock->write_timer);
-       UV_RUNTIME_CHECK(uv_timer_init, r);
-       uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
-
        if (isc__nm_closing(sock)) {
                result = ISC_R_SHUTTINGDOWN;
                goto error;
@@ -576,10 +572,6 @@ isc__nm_async_tlsdnslisten(isc__networker_t *worker, isc__netievent_t *ev0) {
        UV_RUNTIME_CHECK(uv_timer_init, r);
        uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
 
-       r = uv_timer_init(&worker->loop, &sock->write_timer);
-       UV_RUNTIME_CHECK(uv_timer_init, r);
-       uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
-
        LOCK(&sock->parent->lock);
 
        r = uv_tcp_open(&sock->uv_handle.tcp, sock->fd);
@@ -1171,10 +1163,8 @@ tls_write_cb(uv_write_t *req, int status) {
        isc__nm_uvreq_t *uvreq = (isc__nm_uvreq_t *)req->data;
        isc_nmsocket_t *sock = uvreq->sock;
 
-       if (--sock->writes == 0) {
-               int r = uv_timer_stop(&sock->write_timer);
-               UV_RUNTIME_CHECK(uv_timer_stop, r);
-       }
+       isc_nm_timer_stop(uvreq->timer);
+       isc_nm_timer_detach(&uvreq->timer);
 
        free_senddata(sock);
 
@@ -1215,7 +1205,8 @@ tls_cycle_output(isc_nmsocket_t *sock) {
                sock->tls.senddata.base = isc_mem_get(sock->mgr->mctx, pending);
                sock->tls.senddata.length = pending;
 
-               req = isc__nm_uvreq_get(sock->mgr, sock);
+               /* It's a bit misnomer here, but it does the right thing */
+               req = isc__nm_get_read_req(sock, NULL);
                req->uvbuf.base = (char *)sock->tls.senddata.base;
                req->uvbuf.len = sock->tls.senddata.length;
 
@@ -1249,12 +1240,6 @@ tls_cycle_output(isc_nmsocket_t *sock) {
                        break;
                }
 
-               r = uv_timer_start(&sock->write_timer,
-                                  isc__nmsocket_writetimeout_cb,
-                                  sock->write_timeout, 0);
-               UV_RUNTIME_CHECK(uv_timer_start, r);
-               RUNTIME_CHECK(sock->writes++ >= 0);
-
                r = uv_write(&req->uv_req.write, &sock->uv_handle.stream,
                             &req->uvbuf, 1, tls_write_cb);
                if (r < 0) {
@@ -1264,6 +1249,12 @@ tls_cycle_output(isc_nmsocket_t *sock) {
                        break;
                }
 
+               isc_nm_timer_create(req->handle, isc__nmsocket_writetimeout_cb,
+                                   req, &req->timer);
+               if (sock->write_timeout > 0) {
+                       isc_nm_timer_start(req->timer, sock->write_timeout);
+               }
+
                break;
        }
 
@@ -1499,10 +1490,6 @@ accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) {
        UV_RUNTIME_CHECK(uv_timer_init, r);
        uv_handle_set_data((uv_handle_t *)&csock->read_timer, csock);
 
-       r = uv_timer_init(&worker->loop, &csock->write_timer);
-       UV_RUNTIME_CHECK(uv_timer_init, r);
-       uv_handle_set_data((uv_handle_t *)&csock->write_timer, csock);
-
        r = uv_accept(&ssock->uv_handle.stream, &csock->uv_handle.stream);
        if (r != 0) {
                result = isc__nm_uverr2result(r);
@@ -1849,17 +1836,6 @@ read_timer_close_cb(uv_handle_t *handle) {
        }
 }
 
-static void
-write_timer_close_cb(uv_handle_t *timer) {
-       isc_nmsocket_t *sock = uv_handle_get_data(timer);
-       uv_handle_set_data(timer, NULL);
-
-       REQUIRE(VALID_NMSOCK(sock));
-
-       uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
-       uv_close((uv_handle_t *)&sock->read_timer, read_timer_close_cb);
-}
-
 static void
 stop_tlsdns_child(isc_nmsocket_t *sock) {
        REQUIRE(sock->type == isc_nm_tlsdnssocket);
@@ -1913,8 +1889,6 @@ stop_tlsdns_parent(isc_nmsocket_t *sock) {
 
 static void
 tlsdns_close_direct(isc_nmsocket_t *sock) {
-       int r;
-
        REQUIRE(VALID_NMSOCK(sock));
        REQUIRE(sock->tid == isc_nm_tid());
        REQUIRE(atomic_load(&sock->closing));
@@ -1932,10 +1906,8 @@ tlsdns_close_direct(isc_nmsocket_t *sock) {
        isc__nmsocket_timer_stop(sock);
        isc__nm_stop_reading(sock);
 
-       r = uv_timer_stop(&sock->write_timer);
-       UV_RUNTIME_CHECK(uv_timer_stop, r);
-       uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
-       uv_close((uv_handle_t *)&sock->write_timer, write_timer_close_cb);
+       uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
+       uv_close((uv_handle_t *)&sock->read_timer, read_timer_close_cb);
 }
 
 void
index 624932bc9852572d8a571a7d4ed23b491dc0979b..1067f0153313997650a49ee08f5f4e63375f7a87 100644 (file)
@@ -76,9 +76,6 @@ udp_close_cb(uv_handle_t *handle);
 static void
 read_timer_close_cb(uv_handle_t *handle);
 
-static void
-write_timer_close_cb(uv_handle_t *handle);
-
 static void
 udp_close_direct(isc_nmsocket_t *sock);
 
@@ -272,10 +269,6 @@ route_connect_direct(isc_nmsocket_t *sock) {
        UV_RUNTIME_CHECK(uv_timer_init, r);
        uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
 
-       r = uv_timer_init(&worker->loop, &sock->write_timer);
-       UV_RUNTIME_CHECK(uv_timer_init, r);
-       uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
-
        if (isc__nm_closing(sock)) {
                result = ISC_R_SHUTTINGDOWN;
                goto error;
@@ -454,10 +447,6 @@ isc__nm_async_udplisten(isc__networker_t *worker, isc__netievent_t *ev0) {
        UV_RUNTIME_CHECK(uv_timer_init, r);
        uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
 
-       r = uv_timer_init(&worker->loop, &sock->write_timer);
-       UV_RUNTIME_CHECK(uv_timer_init, r);
-       uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
-
        LOCK(&sock->parent->lock);
 
        r = uv_udp_open(&sock->uv_handle.udp, sock->fd);
@@ -874,10 +863,6 @@ udp_connect_direct(isc_nmsocket_t *sock, isc__nm_uvreq_t *req) {
        UV_RUNTIME_CHECK(uv_timer_init, r);
        uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
 
-       r = uv_timer_init(&worker->loop, &sock->write_timer);
-       UV_RUNTIME_CHECK(uv_timer_init, r);
-       uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
-
        if (isc__nm_closing(sock)) {
                result = ISC_R_SHUTTINGDOWN;
                goto error;
@@ -1240,17 +1225,6 @@ read_timer_close_cb(uv_handle_t *handle) {
        }
 }
 
-static void
-write_timer_close_cb(uv_handle_t *timer) {
-       isc_nmsocket_t *sock = uv_handle_get_data(timer);
-       uv_handle_set_data(timer, NULL);
-
-       REQUIRE(VALID_NMSOCK(sock));
-
-       uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
-       uv_close((uv_handle_t *)&sock->read_timer, read_timer_close_cb);
-}
-
 static void
 stop_udp_child(isc_nmsocket_t *sock) {
        REQUIRE(sock->type == isc_nm_udpsocket);
@@ -1303,14 +1277,11 @@ stop_udp_parent(isc_nmsocket_t *sock) {
 
 static void
 udp_close_direct(isc_nmsocket_t *sock) {
-       int r;
        REQUIRE(VALID_NMSOCK(sock));
        REQUIRE(sock->tid == isc_nm_tid());
 
-       r = uv_timer_stop(&sock->write_timer);
-       UV_RUNTIME_CHECK(uv_timer_stop, r);
-       uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
-       uv_close((uv_handle_t *)&sock->write_timer, write_timer_close_cb);
+       uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
+       uv_close((uv_handle_t *)&sock->read_timer, read_timer_close_cb);
 }
 
 void