]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add reference count tracing for dns_catz_zone_t and dns_catz_zones_t
authorAram Sargsyan <aram@isc.org>
Tue, 21 Feb 2023 14:11:04 +0000 (14:11 +0000)
committerOndřej Surý <ondrej@isc.org>
Fri, 24 Feb 2023 14:00:26 +0000 (15:00 +0100)
Tracing can be activated by defining DNS_RPZ_TRACE in catz.h.

bin/named/server.c
lib/dns/catz.c
lib/dns/include/dns/catz.h
lib/dns/view.c
lib/dns/zone.c

index fe02e1e496d0c1d626ec2f5923efbe5600a34c73..54a51b78b7cc726f6b6377d370e5871d503ce38c 100644 (file)
@@ -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);
        }
 
index b8030d219529df013ef66a379f5398bda0e41d83..39c1b55c809adff2cfca0cd8c548a34b9e070ff1 100644 (file)
@@ -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);
                }
index 3cce9e71ace0e5dce51a591e5fa9d3c2abc29f8d..97ee94d56fec10d34cc1f344e32d2c2569aa3554 100644 (file)
 
 #pragma once
 
+/*
+ * Define this for reference count tracing in the unit
+ */
+#undef DNS_CATZ_TRACE
+
 #include <inttypes.h>
 #include <stdbool.h>
 
@@ -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
index ce86eaa320acb4b61bbf65ef3489a739177c833c..0d3580adc683c3cbd9fafe5ec3d704482c7b8613 100644 (file)
@@ -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);
index 449b8485bcfc1accb172ee62e120e39ddc5ab93a..3668c4c43702945c74061851fb48ad8ea8539bcc 100644 (file)
@@ -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);
        }
 }