From: Aram Sargsyan Date: Tue, 21 Feb 2023 14:11:04 +0000 (+0000) Subject: Add reference count tracing for dns_catz_zone_t and dns_catz_zones_t X-Git-Tag: v9.19.11~25^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=53f0c5a9ac12e2079f430887eeb8988cb2f89552;p=thirdparty%2Fbind9.git Add reference count tracing for dns_catz_zone_t and dns_catz_zones_t Tracing can be activated by defining DNS_RPZ_TRACE in catz.h. --- diff --git a/bin/named/server.c b/bin/named/server.c index fe02e1e496d..54a51b78b7c 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -2881,7 +2881,7 @@ cleanup: cfg_obj_destroy(cfg->add_parser, &zoneconf); } dns_catz_entry_detach(cz->origin, &cz->entry); - dns_catz_zone_detach(&cz->origin); + dns_catz_detach_catz(&cz->origin); dns_view_detach(&cz->view); isc_mem_putanddetach(&cz->mctx, cz, sizeof(*cz)); } @@ -2955,7 +2955,7 @@ cleanup: dns_zone_detach(&zone); } dns_catz_entry_detach(cz->origin, &cz->entry); - dns_catz_zone_detach(&cz->origin); + dns_catz_detach_catz(&cz->origin); dns_view_detach(&cz->view); isc_mem_putanddetach(&cz->mctx, cz, sizeof(*cz)); } @@ -2987,7 +2987,7 @@ catz_run(dns_catz_entry_t *entry, dns_catz_zone_t *origin, dns_view_t *view, isc_mem_attach(view->mctx, &cz->mctx); dns_catz_entry_attach(entry, &cz->entry); - dns_catz_zone_attach(origin, &cz->origin); + dns_catz_attach_catz(origin, &cz->origin); dns_view_attach(view, &cz->view); isc_async_run(named_g_mainloop, action, cz); @@ -3150,7 +3150,7 @@ static dns_catz_zonemodmethods_t ns_catz_zonemodmethods = { static isc_result_t configure_catz(dns_view_t *view, dns_view_t *pview, const cfg_obj_t *config, const cfg_obj_t *catz_obj) { - const cfg_listelt_t *zone_element; + const cfg_listelt_t *zone_element = NULL; const dns_catz_zones_t *old = NULL; bool pview_must_detach = false; isc_result_t result; @@ -3178,9 +3178,9 @@ configure_catz(dns_view_t *view, dns_view_t *pview, const cfg_obj_t *config, } if (old != NULL) { - dns_catz_catzs_detach(&view->catzs); - dns_catz_catzs_attach(pview->catzs, &view->catzs); - dns_catz_catzs_detach(&pview->catzs); + dns_catz_detach_catzs(&view->catzs); + dns_catz_attach_catzs(pview->catzs, &view->catzs); + dns_catz_detach_catzs(&pview->catzs); dns_catz_prereconfig(view->catzs); } diff --git a/lib/dns/catz.c b/lib/dns/catz.c index b8030d21952..39c1b55c809 100644 --- a/lib/dns/catz.c +++ b/lib/dns/catz.c @@ -100,7 +100,7 @@ struct dns_catz_zone { }; static void -catz_timer_start(dns_catz_zone_t *catz); +dns__catz_timer_start(dns_catz_zone_t *catz); static isc_result_t catz_process_zones_entry(dns_catz_zone_t *catz, dns_rdataset_t *value, @@ -794,11 +794,11 @@ dns_catz_new_zone(dns_catz_zones_t *catzs, dns_catz_zone_t **catzp, return (ISC_R_SUCCESS); } -void -catz_timer_start(dns_catz_zone_t *catz) { - isc_time_t now; +static void +dns__catz_timer_start(dns_catz_zone_t *catz) { uint64_t tdiff; isc_interval_t interval; + isc_time_t now; REQUIRE(DNS_CATZ_ZONE_VALID(catz)); @@ -850,7 +850,7 @@ dns_catz_add_zone(dns_catz_zones_t *catzs, const dns_name_t *name, result = isc_ht_add(catzs->zones, catz->name.ndata, catz->name.length, catz); if (result != ISC_R_SUCCESS) { - dns_catz_zone_detach(&catz); + dns_catz_detach_catz(&catz); if (result != ISC_R_EXISTS) { goto cleanup; } @@ -888,18 +888,10 @@ dns_catz_get_zone(dns_catz_zones_t *catzs, const dns_name_t *name) { return (found); } -void -dns_catz_catzs_attach(dns_catz_zones_t *catzs, dns_catz_zones_t **catzsp) { - REQUIRE(DNS_CATZ_ZONES_VALID(catzs)); - REQUIRE(catzsp != NULL && *catzsp == NULL); - - isc_refcount_increment(&catzs->references); - *catzsp = catzs; -} - static void dns__catz_zone_destroy(dns_catz_zone_t *catz) { isc_mem_t *mctx = catz->catzs->mctx; + if (catz->entries != NULL) { isc_ht_iter_t *iter = NULL; isc_result_t result; @@ -965,42 +957,39 @@ dns__catz_zone_destroy(dns_catz_zone_t *catz) { isc_mem_put(mctx, catz, sizeof(*catz)); } -ISC_REFCOUNT_IMPL(dns_catz_zone, dns__catz_zone_destroy); - -void -dns_catz_catzs_detach(dns_catz_zones_t **catzsp) { - dns_catz_zones_t *catzs; - - REQUIRE(catzsp != NULL && DNS_CATZ_ZONES_VALID(*catzsp)); - - catzs = *catzsp; - *catzsp = NULL; - - if (isc_refcount_decrement(&catzs->references) == 1) { - catzs->magic = 0; - isc_mutex_destroy(&catzs->lock); - if (catzs->zones != NULL) { - isc_ht_iter_t *iter = NULL; - isc_result_t result; - isc_ht_iter_create(catzs->zones, &iter); - for (result = isc_ht_iter_first(iter); - result == ISC_R_SUCCESS;) - { - dns_catz_zone_t *catz = NULL; - isc_ht_iter_current(iter, (void **)&catz); - result = isc_ht_iter_delcurrent_next(iter); - dns_catz_zone_detach(&catz); - } - INSIST(result == ISC_R_NOMORE); - isc_ht_iter_destroy(&iter); - INSIST(isc_ht_count(catzs->zones) == 0); - isc_ht_destroy(&catzs->zones); +static void +dns__catz_zones_destroy(dns_catz_zones_t *catzs) { + if (catzs->zones != NULL) { + isc_ht_iter_t *iter = NULL; + isc_result_t result; + isc_ht_iter_create(catzs->zones, &iter); + for (result = isc_ht_iter_first(iter); result == ISC_R_SUCCESS;) + { + dns_catz_zone_t *zone = NULL; + isc_ht_iter_current(iter, (void **)&zone); + result = isc_ht_iter_delcurrent_next(iter); + dns_catz_detach_catz(&zone); } - isc_refcount_destroy(&catzs->references); - isc_mem_putanddetach(&catzs->mctx, catzs, sizeof(*catzs)); + INSIST(result == ISC_R_NOMORE); + isc_ht_iter_destroy(&iter); + INSIST(isc_ht_count(catzs->zones) == 0); + isc_ht_destroy(&catzs->zones); } + catzs->magic = 0; + isc_mutex_destroy(&catzs->lock); + isc_refcount_destroy(&catzs->references); + + isc_mem_putanddetach(&catzs->mctx, catzs, sizeof(*catzs)); } +#ifdef DNS_CATZ_TRACE +ISC_REFCOUNT_TRACE_IMPL(dns_catz_zone, dns__catz_zone_destroy); +ISC_REFCOUNT_TRACE_IMPL(dns_catz_zones, dns__catz_zones_destroy); +#else +ISC_REFCOUNT_IMPL(dns_catz_zone, dns__catz_zone_destroy); +ISC_REFCOUNT_IMPL(dns_catz_zones, dns__catz_zones_destroy); +#endif + typedef enum { CATZ_OPT_NONE, CATZ_OPT_ZONES, @@ -2045,7 +2034,7 @@ dns_catz_dbupdate_callback(dns_db_t *db, void *fn_arg) { if (!catz->updatepending) { catz->updatepending = true; dns_db_currentversion(db, &catz->dbversion); - catz_timer_start(catz); + dns__catz_timer_start(catz); } else { char dname[DNS_NAME_FORMATSIZE]; @@ -2136,7 +2125,7 @@ dns_catz_update_from_db(dns_db_t *db, dns_catz_zones_t *catzs) { result = dns_db_createiterator(db, DNS_DB_NONSEC3, &it); if (result != ISC_R_SUCCESS) { - dns_catz_zone_detach(&newcatz); + dns_catz_detach_catz(&newcatz); dns_db_closeversion(db, &oldcatz->dbversion, false); isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL, DNS_LOGMODULE_MASTER, ISC_LOG_ERROR, @@ -2155,7 +2144,7 @@ dns_catz_update_from_db(dns_db_t *db, dns_catz_zones_t *catzs) { result = dns_name_fromstring2(name, "version", &db->origin, 0, NULL); if (result != ISC_R_SUCCESS) { dns_dbiterator_destroy(&it); - dns_catz_zone_detach(&newcatz); + dns_catz_detach_catz(&newcatz); dns_db_closeversion(db, &oldcatz->dbversion, false); isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL, DNS_LOGMODULE_MASTER, ISC_LOG_ERROR, @@ -2300,7 +2289,7 @@ final: "catz: new catalog zone '%s' is broken and " "will not be processed", bname); - dns_catz_zone_detach(&newcatz); + dns_catz_detach_catz(&newcatz); return; } @@ -2308,7 +2297,7 @@ final: * Finally merge new zone into old zone. */ result = dns_catz_zones_merge(oldcatz, newcatz); - dns_catz_zone_detach(&newcatz); + dns_catz_detach_catz(&newcatz); if (result != ISC_R_SUCCESS) { isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL, DNS_LOGMODULE_MASTER, ISC_LOG_ERROR, @@ -2386,12 +2375,12 @@ dns_catz_postreconfig(dns_catz_zones_t *catzs) { &catz->name); INSIST(result == ISC_R_SUCCESS); dns_catz_zones_merge(catz, newcatz); - dns_catz_zone_detach(&newcatz); + dns_catz_detach_catz(&newcatz); /* Make sure that we have an empty catalog zone. */ INSIST(isc_ht_count(catz->entries) == 0); result = isc_ht_iter_delcurrent_next(iter); - dns_catz_zone_detach(&catz); + dns_catz_detach_catz(&catz); } else { result = isc_ht_iter_next(iter); } diff --git a/lib/dns/include/dns/catz.h b/lib/dns/include/dns/catz.h index 3cce9e71ace..97ee94d56fe 100644 --- a/lib/dns/include/dns/catz.h +++ b/lib/dns/include/dns/catz.h @@ -13,6 +13,11 @@ #pragma once +/* + * Define this for reference count tracing in the unit + */ +#undef DNS_CATZ_TRACE + #include #include @@ -355,25 +360,6 @@ dns_catz_get_zone(dns_catz_zones_t *catzs, const dns_name_t *name); * \li 'name' is a valid dns_name_t. */ -void -dns_catz_catzs_attach(dns_catz_zones_t *catzs, dns_catz_zones_t **catzsp); -/*%< - * Attach 'catzs' to 'catzsp'. - * - * Requires: - * \li 'catzs' is a valid dns_catz_zones_t. - * \li 'catzsp' is not NULL and *catzsp is NULL. - */ - -void -dns_catz_catzs_detach(dns_catz_zones_t **catzsp); -/*%< - * Detach 'catzsp', free if no further references. - * - * Requires: - * \li 'catzsp' is not NULL and *catzsp is not NULL. - */ - void dns_catz_catzs_set_view(dns_catz_zones_t *catzs, dns_view_t *view); /*%< @@ -452,4 +438,43 @@ dns_catz_get_iterator(dns_catz_zone_t *catz, isc_ht_iter_t **itp); * */ +#ifdef DNS_CATZ_TRACE +/* Compatibility macros */ +#define dns_catz_attach_catz(catz, catzp) \ + dns_catz_zone__attach(catz, catzp, __func__, __FILE__, __LINE__) +#define dns_catz_detach_catz(catzp) \ + dns_catz_zone__detach(catzp, __func__, __FILE__, __LINE__) +#define dns_catz_ref_catz(ptr) \ + dns_catz_zone__ref(ptr, __func__, __FILE__, __LINE__) +#define dns_catz_unref_catz(ptr) \ + dns_catz_zone__unref(ptr, __func__, __FILE__, __LINE__) + +#define dns_catz_attach_catzs(catzs, catzsp) \ + dns_catz_zones__attach(catzs, catzsp, __func__, __FILE__, __LINE__) +#define dns_catz_detach_catzs(catzsp) \ + dns_catz_zones__detach(catzsp, __func__, __FILE__, __LINE__) +#define dns_catz_ref_catzs(ptr) \ + dns_catz_zones__ref(ptr, __func__, __FILE__, __LINE__) +#define dns_catz_unref_catzs(ptr) \ + dns_catz_zones__unref(ptr, __func__, __FILE__, __LINE__) + +ISC_REFCOUNT_TRACE_DECL(dns_catz_zone); +ISC_REFCOUNT_TRACE_DECL(dns_catz_zones); +#else +/* Compatibility macros */ +#define dns_catz_attach_catz(catz, catzp) dns_catz_zone_attach(catz, catzp) +#define dns_catz_detach_catz(catzp) dns_catz_zone_detach(catzp) +#define dns_catz_ref_catz(ptr) dns_catz_zone_ref(ptr) +#define dns_catz_unref_catz(ptr) dns_catz_zone_unref(ptr) + +#define dns_catz_attach_catzs(catzs, catzsp) \ + dns_catz_zones_attach(catzs, catzsp) +#define dns_catz_detach_catzs(catzsp) dns_catz_zones_detach(catzsp) +#define dns_catz_ref_catzs(ptr) dns_catz_zones_ref(ptr) +#define dns_catz_unref_catzs(ptr) dns_catz_zones_unref(ptr) + +ISC_REFCOUNT_DECL(dns_catz_zone); +ISC_REFCOUNT_DECL(dns_catz_zones); +#endif /* DNS_CATZ_TRACE */ + ISC_LANG_ENDDECLS diff --git a/lib/dns/view.c b/lib/dns/view.c index ce86eaa320a..0d3580adc68 100644 --- a/lib/dns/view.c +++ b/lib/dns/view.c @@ -300,7 +300,7 @@ destroy(dns_view_t *view) { dns_rpz_detach_rpzs(&view->rpzs); } if (view->catzs != NULL) { - dns_catz_catzs_detach(&view->catzs); + dns_catz_detach_catzs(&view->catzs); } for (dlzdb = ISC_LIST_HEAD(view->dlz_searched); dlzdb != NULL; dlzdb = ISC_LIST_HEAD(view->dlz_searched)) @@ -548,7 +548,7 @@ dns_view_detach(dns_view_t **viewp) { } } if (view->catzs != NULL) { - dns_catz_catzs_detach(&view->catzs); + dns_catz_detach_catzs(&view->catzs); } if (view->ntatable_priv != NULL) { dns_ntatable_shutdown(view->ntatable_priv); diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 449b8485bcf..3668c4c4370 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -1260,7 +1260,7 @@ zone_free(dns_zone_t *zone) { zone->rpz_num = DNS_RPZ_INVALID_NUM; } if (zone->catzs != NULL) { - dns_catz_catzs_detach(&zone->catzs); + dns_catz_detach_catzs(&zone->catzs); } zone_freedbargs(zone); @@ -1913,7 +1913,7 @@ zone_catz_enable(dns_zone_t *zone, dns_catz_zones_t *catzs) { INSIST(zone->catzs == NULL || zone->catzs == catzs); dns_catz_catzs_set_view(catzs, zone->view); if (zone->catzs == NULL) { - dns_catz_catzs_attach(catzs, &zone->catzs); + dns_catz_attach_catzs(catzs, &zone->catzs); } } @@ -1934,7 +1934,7 @@ zone_catz_disable(dns_zone_t *zone) { if (zone->db != NULL) { dns_zone_catz_disable_db(zone, zone->db); } - dns_catz_catzs_detach(&zone->catzs); + dns_catz_detach_catzs(&zone->catzs); } }