Decouple view->resolver and friends shutdown and detach

In !7538, the shutdown procedure was simplified, but the ordering was
wrong, we need to shutdown the resolver, adb and requestmgr before
detaching those objects from the view, because there are cross
dependencies between at least the resolver and the adb.

Execute the shutdown(s) first, only when all three shutdowns have been
executed, detach those objects from the view.
This commit is contained in:
Ondřej Surý 2023-02-28 14:14:06 +01:00
parent 004d2a7ad0
commit dfd195e77c

View file

@ -288,12 +288,12 @@ destroy(dns_view_t *view) {
if (view->statickeys != NULL) {
dns_tsigkeyring_detach(&view->statickeys);
}
if (view->adb != NULL) {
dns_adb_detach(&view->adb);
}
if (view->resolver != NULL) {
dns_resolver_detach(&view->resolver);
}
/* These must have been detached in dns_view_detach() */
INSIST(view->adb == NULL);
INSIST(view->resolver == NULL);
INSIST(view->requestmgr == NULL);
dns_rrl_view_destroy(view);
if (view->rpzs != NULL) {
dns_rpz_shutdown_rpzs(view->rpzs);
@ -315,9 +315,6 @@ destroy(dns_view_t *view) {
ISC_LIST_UNLINK(view->dlz_unsearched, dlzdb, link);
dns_dlzdestroy(&dlzdb);
}
if (view->requestmgr != NULL) {
dns_requestmgr_detach(&view->requestmgr);
}
if (view->hints != NULL) {
dns_db_detach(&view->hints);
}
@ -513,20 +510,35 @@ dns_view_detach(dns_view_t **viewp) {
isc_refcount_destroy(&view->references);
/* Shutdown the attached objects first */
if (view->resolver != NULL) {
dns_resolver_shutdown(view->resolver);
}
if (view->adb != NULL) {
dns_adb_shutdown(view->adb);
}
if (view->requestmgr != NULL) {
dns_requestmgr_shutdown(view->requestmgr);
}
/* Swap the pointers under the lock */
LOCK(&view->lock);
if (view->resolver != NULL) {
resolver = view->resolver;
view->resolver = NULL;
}
if (view->adb != NULL) {
adb = view->adb;
view->adb = NULL;
}
if (view->requestmgr != NULL) {
requestmgr = view->requestmgr;
view->requestmgr = NULL;
}
if (view->zonetable != NULL) {
zt = view->zonetable;
view->zonetable = NULL;
@ -559,17 +571,15 @@ dns_view_detach(dns_view_t **viewp) {
/* Detach outside view lock */
if (resolver != NULL) {
dns_resolver_shutdown(resolver);
dns_resolver_detach(&resolver);
}
if (adb != NULL) {
dns_adb_shutdown(adb);
dns_adb_detach(&adb);
}
if (requestmgr != NULL) {
dns_requestmgr_shutdown(requestmgr);
dns_requestmgr_detach(&requestmgr);
}
if (zt != NULL) {
dns_zt_detach(&zt);
}