From: Aram Sargsyan Date: Wed, 21 May 2025 15:27:53 +0000 (+0000) Subject: Emit a ISC_R_CANCELED result instead of ISC_R_SHUTTINGDOWN X-Git-Tag: v9.21.9~33^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f4cd307c6b705e13c45136ac4dc49e262a598297;p=thirdparty%2Fbind9.git Emit a ISC_R_CANCELED result instead of ISC_R_SHUTTINGDOWN 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. --- diff --git a/bin/tests/system/xfer/tests.sh b/bin/tests/system/xfer/tests.sh index 1a5b1d0b7e3..478141d1882 100755 --- a/bin/tests/system/xfer/tests.sh +++ b/bin/tests/system/xfer/tests.sh @@ -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)) diff --git a/lib/dns/request.c b/lib/dns/request.c index d13b7390418..3d8da41d085 100644 --- a/lib/dns/request.c +++ b/lib/dns/request.c @@ -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); } } diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 812669d6d6f..eed65a66a8d 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -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)) {