]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Emit a ISC_R_CANCELED result instead of ISC_R_SHUTTINGDOWN
authorAram Sargsyan <aram@isc.org>
Wed, 21 May 2025 15:27:53 +0000 (15:27 +0000)
committerOndřej Surý <ondrej@isc.org>
Wed, 28 May 2025 17:18:19 +0000 (19:18 +0200)
When request manager shuts down, it also shuts down all its ongoing
requests. Currently it calls their callback functions with a
ISC_R_SHUTTINGDOWN result code for the request. Since a request
manager can shutdown not only during named shutdown but also during
named reconfiguration, instead of sending ISC_R_SHUTTINGDOWN result
code send a ISC_R_CANCELED code to avoid confusion and errors with
the expectation that a ISC_R_SHUTTINGDOWN result code can only be
received during actual shutdown of named.

All the callback functions which are passed to either the
dns_request_create() or the dns_request_createraw() functions have
been analyzed to confirm that they can process both the
ISC_R_SHUTTINGDOWN and ISC_R_CANCELED result codes. Changes were
made where it was necessary.

(cherry picked from commit f4cd307c6b705e13c45136ac4dc49e262a598297)

bin/tests/system/xfer/tests.sh
lib/dns/request.c
lib/dns/zone.c

index 8b44dcfd988a77333a9c6980df210b06312c7399..2ba58710e9204064c34fada5e3188b9d58fb6fdb 100755 (executable)
@@ -763,7 +763,7 @@ sleep 1
 # Reconfigure named while zone transfer attempt is in progress.
 $RNDCCMD 10.53.0.6 reconfig 2>&1 | sed 's/^/ns6 /' | cat_i
 # Confirm that the ongoing SOA request was canceled, caused by the reconfiguratoin.
-retry_quiet 60 wait_for_message "refresh: request result: shutting down" || tmp=1
+retry_quiet 60 wait_for_message "refresh: request result: operation canceled" || tmp=1
 if test $tmp != 0; then echo_i "failed"; fi
 status=$((status + tmp))
 
index c2ba096dbfcf476fffb98a44cfe688fb88e99d63..38130e80bf181065bb6a992ffda9d2a95acd1f8c 100644 (file)
@@ -143,7 +143,7 @@ dns_requestmgr_create(isc_mem_t *mctx, isc_loopmgr_t *loopmgr,
        for (size_t i = 0; i < nloops; i++) {
                ISC_LIST_INIT(requestmgr->requests[i]);
 
-               /* unreferenced in requests_shutdown() */
+               /* unreferenced in requests_cancel() */
                isc_loop_ref(isc_loop_get(requestmgr->loopmgr, i));
        }
 
@@ -169,7 +169,7 @@ dns_requestmgr_create(isc_mem_t *mctx, isc_loopmgr_t *loopmgr,
 }
 
 static void
-requests_shutdown(void *arg) {
+requests_cancel(void *arg) {
        dns_requestmgr_t *requestmgr = arg;
        dns_request_t *request = NULL, *next = NULL;
        uint32_t tid = isc_tid();
@@ -181,7 +181,7 @@ requests_shutdown(void *arg) {
                        /* The callback has been already scheduled */
                        continue;
                }
-               req_sendevent(request, ISC_R_SHUTTINGDOWN);
+               req_sendevent(request, ISC_R_CANCELED);
        }
 
        isc_loop_unref(isc_loop_get(requestmgr->loopmgr, tid));
@@ -217,12 +217,12 @@ dns_requestmgr_shutdown(dns_requestmgr_t *requestmgr) {
 
                if (i == tid) {
                        /* Run the current loop synchronously */
-                       requests_shutdown(requestmgr);
+                       requests_cancel(requestmgr);
                        continue;
                }
 
                isc_loop_t *loop = isc_loop_get(requestmgr->loopmgr, i);
-               isc_async_run(loop, requests_shutdown, requestmgr);
+               isc_async_run(loop, requests_cancel, requestmgr);
        }
 }
 
index 816e801bf7fe41397619180c8776000bcd83233a..845902b160252c21e5ff881410f84afa49905fe5 100644 (file)
@@ -13609,6 +13609,7 @@ stub_callback(void *arg) {
        case ISC_R_SUCCESS:
                break;
        case ISC_R_SHUTTINGDOWN:
+       case ISC_R_CANCELED:
                goto exiting;
        case ISC_R_TIMEDOUT:
                if (!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_NOEDNS)) {
@@ -13953,6 +13954,7 @@ refresh_callback(void *arg) {
        case ISC_R_SUCCESS:
                break;
        case ISC_R_SHUTTINGDOWN:
+       case ISC_R_CANCELED:
                goto exiting;
        case ISC_R_TIMEDOUT:
                if (!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_NOEDNS)) {