]> 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>
Thu, 17 Mar 2022 15:07:52 +0000 (16:07 +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.

(cherry picked from commit 6ddac2d56de980717aaba7fc0ad73af0f3890399)

lib/isc/netmgr/netmgr.c

index 41e4bce616316f9454b541b4fcdffbf36474e9c3..24947a562a8cf227a2ce04fa5803f8d966f4674c 100644 (file)
@@ -2686,6 +2686,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
@@ -2706,14 +2707,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);
        }
 }
 
@@ -2751,13 +2757,26 @@ 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:
+                       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