Merge branch '3801-reduce-memory-bloat-caused-by-delayed-view-detach-lock-order-inversion-v9_18' into 'v9_18'

[9.18] Detach the zone views outside of the zone lock

See merge request isc-projects/bind9!7408
This commit is contained in:
Ondřej Surý 2023-01-19 10:00:49 +00:00
commit 1f6d54d1fb

View file

@ -14976,6 +14976,7 @@ zone_shutdown(isc_task_t *task, isc_event_t *event) {
dns_zone_t *zone = (dns_zone_t *)event->ev_arg;
bool free_needed, linked = false;
dns_zone_t *raw = NULL, *secure = NULL;
dns_view_t *view = NULL, *prev_view = NULL;
UNUSED(task);
REQUIRE(DNS_ZONE_VALID(zone));
@ -15023,13 +15024,15 @@ zone_shutdown(isc_task_t *task, isc_event_t *event) {
LOCK_ZONE(zone);
INSIST(zone != zone->raw);
/* Detach the views early, we don't need them anymore */
if (zone->view != NULL) {
dns_view_weakdetach(&zone->view);
}
if (zone->prev_view != NULL) {
dns_view_weakdetach(&zone->prev_view);
}
/*
* Detach the views early, we don't need them anymore. However, we need
* to detach them outside of the zone lock to break the lock loop
* between view, adb and zone locks.
*/
view = zone->view;
zone->view = NULL;
prev_view = zone->prev_view;
zone->prev_view = NULL;
if (linked) {
isc_refcount_decrement(&zone->irefs);
@ -15091,6 +15094,14 @@ zone_shutdown(isc_task_t *task, isc_event_t *event) {
zone->secure = NULL;
}
UNLOCK_ZONE(zone);
if (view != NULL) {
dns_view_weakdetach(&view);
}
if (prev_view != NULL) {
dns_view_weakdetach(&prev_view);
}
if (raw != NULL) {
dns_zone_detach(&raw);
}