]> 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 16:20:13 +0000 (16:20 +0000)
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.

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

index 1a5b1d0b7e3ce7c401fbc781e4328379974546fd..478141d1882cb1f3dc7181a8f665a821e0520358 100755 (executable)
@@ -777,7 +777,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 d13b73904184c0f8d1cca6a55df1734e5b656531..3d8da41d085b1bd86ae0f2e9da8ce57dd37232fa 100644 (file)
@@ -144,7 +144,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));
        }
 
@@ -170,7 +170,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;
        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 812669d6d6f220736ae2957586e3af2668a78b26..eed65a66a8dc2949f158bb89d78e9911740308f8 100644 (file)
@@ -13584,6 +13584,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)) {
@@ -13928,6 +13929,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)) {