]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
On shutdown, reset the established TCP connections
authorOndřej Surý <ondrej@isc.org>
Thu, 10 Mar 2022 12:58:58 +0000 (13:58 +0100)
committerOndřej Surý <ondrej@isc.org>
Fri, 11 Mar 2022 08:56:57 +0000 (09:56 +0100)
Previously, the established TCP connections (both client and server)
would be gracefully closed waiting for the write timeout.

Don't wait for TCP connections to gracefully shutdown, but directly
reset them for faster shutdown.

lib/isc/netmgr/netmgr.c

index 3ac756917601cff23988f5c172921d397961ddf1..cabe9d54a56c25df977d0300657f3a95d16d78e6 100644 (file)
@@ -2811,6 +2811,7 @@ reset_shutdown(uv_handle_t *handle) {
        isc_nmsocket_t *sock = uv_handle_get_data(handle);
 
        isc__nmsocket_shutdown(sock);
+       isc__nmsocket_detach(&sock);
 }
 
 void
@@ -2833,14 +2834,19 @@ isc__nmsocket_reset(isc_nmsocket_t *sock) {
                break;
        }
 
-       if (!uv_is_closing(&sock->uv_handle.handle)) {
+       if (!uv_is_closing(&sock->uv_handle.handle) &&
+           uv_is_active(&sock->uv_handle.handle))
+       {
                /*
                 * The real shutdown will be handled in the respective
                 * close functions.
                 */
+               isc__nmsocket_attach(sock, &(isc_nmsocket_t *){ NULL });
                int r = uv_tcp_close_reset(&sock->uv_handle.tcp,
                                           reset_shutdown);
                UV_RUNTIME_CHECK(uv_tcp_close_reset, r);
+       } else {
+               isc__nmsocket_shutdown(sock);
        }
 }
 
@@ -2882,13 +2888,27 @@ shutdown_walk_cb(uv_handle_t *handle, void *arg) {
 
        switch (handle->type) {
        case UV_UDP:
+               isc__nmsocket_shutdown(sock);
+               return;
        case UV_TCP:
-               break;
+               switch (sock->type) {
+               case isc_nm_tcpsocket:
+               case isc_nm_tcpdnssocket:
+               case isc_nm_tlsdnssocket:
+                       if (sock->parent == NULL) {
+                               /* Reset the TCP connections on shutdown */
+                               isc__nmsocket_reset(sock);
+                               return;
+                       }
+                       /* FALLTHROUGH */
+               default:
+                       isc__nmsocket_shutdown(sock);
+               }
+
+               return;
        default:
                return;
        }
-
-       isc__nmsocket_shutdown(sock);
 }
 
 void