]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
implement refcount tracing in xfrin.c
authorEvan Hunt <each@isc.org>
Thu, 23 Feb 2023 18:29:33 +0000 (10:29 -0800)
committerEvan Hunt <each@isc.org>
Fri, 24 Feb 2023 08:30:33 +0000 (08:30 +0000)
use ISC_REFCOUNT_IMPL for dns_xfrin_ctx_t (which has been renamed
to dns_xfrin_t to keep the function names dns_xfrin_attach() and
dns_xfrin_detach() unchanged).

lib/dns/include/dns/xfrin.h
lib/dns/xfrin.c
lib/dns/zone.c

index f37aa7f1c798653db3c8eff80971c625f2d42d3d..7e269c48eba3f9cb1892917590b20cf7abf14550 100644 (file)
@@ -32,6 +32,9 @@
 #include <dns/transport.h>
 #include <dns/types.h>
 
+/* Define to 1 for detailed reference tracing */
+#undef DNS_XFRIN_TRACE
+
 /***
  *** Types
  ***/
@@ -39,7 +42,7 @@
 /*%
  * A transfer in progress.  This is an opaque type.
  */
-typedef struct dns_xfrin_ctx dns_xfrin_ctx_t;
+typedef struct dns_xfrin dns_xfrin_t;
 
 /***
  *** Functions
@@ -53,10 +56,10 @@ dns_xfrin_create(dns_zone_t *zone, dns_rdatatype_t xfrtype,
                 const isc_sockaddr_t *sourceaddr, dns_tsigkey_t *tsigkey,
                 dns_transport_t *transport, isc_tlsctx_cache_t *tlsctx_cache,
                 isc_mem_t *mctx, isc_nm_t *netmgr, dns_xfrindone_t done,
-                dns_xfrin_ctx_t **xfrp);
+                dns_xfrin_t **xfrp);
 /*%<
  * Attempt to start an incoming zone transfer of 'zone'
- * from 'primaryaddr', creating a dns_xfrin_ctx_t object to
+ * from 'primaryaddr', creating a dns_xfrin_t object to
  * manage it.  Attach '*xfrp' to the newly created object.
  *
  * Iff ISC_R_SUCCESS is returned, '*done' is called with
@@ -80,24 +83,22 @@ dns_xfrin_create(dns_zone_t *zone, dns_rdatatype_t xfrtype,
  */
 
 void
-dns_xfrin_shutdown(dns_xfrin_ctx_t *xfr);
+dns_xfrin_shutdown(dns_xfrin_t *xfr);
 /*%<
  * If the zone transfer 'xfr' has already finished,
  * do nothing.  Otherwise, abort it and cause it to call
  * its done callback with a status of ISC_R_CANCELED.
  */
 
-void
-dns_xfrin_detach(dns_xfrin_ctx_t **xfrp);
-/*%<
- * Detach a reference to a zone transfer object.
- * Caller to maintain external locking if required.
- */
-
-void
-dns_xfrin_attach(dns_xfrin_ctx_t *source, dns_xfrin_ctx_t **target);
-/*%<
- * Caller to maintain external locking if required.
- */
-
+#if DNS_XFRIN_TRACE
+#define dns_xfrin_ref(ptr)   dns_xfrin__ref(ptr, __func__, __FILE__, __LINE__)
+#define dns_xfrin_unref(ptr) dns_xfrin__unref(ptr, __func__, __FILE__, __LINE__)
+#define dns_xfrin_attach(ptr, ptrp) \
+       dns_xfrin__attach(ptr, ptrp, __func__, __FILE__, __LINE__)
+#define dns_xfrin_detach(ptrp) \
+       dns_xfrin__detach(ptrp, __func__, __FILE__, __LINE__)
+ISC_REFCOUNT_TRACE_DECL(dns_xfrin);
+#else
+ISC_REFCOUNT_DECL(dns_xfrin);
+#endif
 ISC_LANG_ENDDECLS
index be1d41234d0382a856773cdcc0733a6b2d71ab48..c74cce66f917e14a2ef934f1af0d12e36197c4e0 100644 (file)
@@ -90,7 +90,7 @@ typedef enum {
  * Incoming zone transfer context.
  */
 
-struct dns_xfrin_ctx {
+struct dns_xfrin {
        unsigned int magic;
        isc_mem_t *mctx;
        dns_zone_t *zone;
@@ -199,43 +199,42 @@ xfrin_create(isc_mem_t *mctx, dns_zone_t *zone, dns_db_t *db, isc_nm_t *netmgr,
             dns_rdatatype_t reqtype, const isc_sockaddr_t *primaryaddr,
             const isc_sockaddr_t *sourceaddr, dns_tsigkey_t *tsigkey,
             dns_transport_t *transport, isc_tlsctx_cache_t *tlsctx_cache,
-            dns_xfrin_ctx_t **xfrp);
+            dns_xfrin_t **xfrp);
 
 static isc_result_t
-axfr_init(dns_xfrin_ctx_t *xfr);
+axfr_init(dns_xfrin_t *xfr);
 static isc_result_t
-axfr_makedb(dns_xfrin_ctx_t *xfr, dns_db_t **dbp);
+axfr_makedb(dns_xfrin_t *xfr, dns_db_t **dbp);
 static isc_result_t
-axfr_putdata(dns_xfrin_ctx_t *xfr, dns_diffop_t op, dns_name_t *name,
-            dns_ttl_t ttl, dns_rdata_t *rdata);
+axfr_putdata(dns_xfrin_t *xfr, dns_diffop_t op, dns_name_t *name, dns_ttl_t ttl,
+            dns_rdata_t *rdata);
 static isc_result_t
-axfr_apply(dns_xfrin_ctx_t *xfr);
+axfr_apply(dns_xfrin_t *xfr);
 static isc_result_t
-axfr_commit(dns_xfrin_ctx_t *xfr);
+axfr_commit(dns_xfrin_t *xfr);
 static isc_result_t
-axfr_finalize(dns_xfrin_ctx_t *xfr);
+axfr_finalize(dns_xfrin_t *xfr);
 
 static isc_result_t
-ixfr_init(dns_xfrin_ctx_t *xfr);
+ixfr_init(dns_xfrin_t *xfr);
 static isc_result_t
-ixfr_apply(dns_xfrin_ctx_t *xfr);
+ixfr_apply(dns_xfrin_t *xfr);
 static isc_result_t
-ixfr_putdata(dns_xfrin_ctx_t *xfr, dns_diffop_t op, dns_name_t *name,
-            dns_ttl_t ttl, dns_rdata_t *rdata);
+ixfr_putdata(dns_xfrin_t *xfr, dns_diffop_t op, dns_name_t *name, dns_ttl_t ttl,
+            dns_rdata_t *rdata);
 static isc_result_t
-ixfr_commit(dns_xfrin_ctx_t *xfr);
+ixfr_commit(dns_xfrin_t *xfr);
 
 static isc_result_t
-xfr_rr(dns_xfrin_ctx_t *xfr, dns_name_t *name, uint32_t ttl,
-       dns_rdata_t *rdata);
+xfr_rr(dns_xfrin_t *xfr, dns_name_t *name, uint32_t ttl, dns_rdata_t *rdata);
 
 static isc_result_t
-xfrin_start(dns_xfrin_ctx_t *xfr);
+xfrin_start(dns_xfrin_t *xfr);
 
 static void
 xfrin_connect_done(isc_nmhandle_t *handle, isc_result_t result, void *cbarg);
 static isc_result_t
-xfrin_send_request(dns_xfrin_ctx_t *xfr);
+xfrin_send_request(dns_xfrin_t *xfr);
 static void
 xfrin_send_done(isc_nmhandle_t *handle, isc_result_t result, void *cbarg);
 static void
@@ -243,10 +242,10 @@ xfrin_recv_done(isc_nmhandle_t *handle, isc_result_t result,
                isc_region_t *region, void *cbarg);
 
 static void
-xfrin_destroy(dns_xfrin_ctx_t *xfr);
+xfrin_destroy(dns_xfrin_t *xfr);
 
 static void
-xfrin_fail(dns_xfrin_ctx_t *xfr, isc_result_t result, const char *msg);
+xfrin_fail(dns_xfrin_t *xfr, isc_result_t result, const char *msg);
 static isc_result_t
 render(dns_message_t *msg, isc_mem_t *mctx, isc_buffer_t *buf);
 
@@ -256,7 +255,7 @@ xfrin_logv(dns_xfrin_t *xff, int level, const char *zonetext,
        ISC_FORMAT_PRINTF(5, 0);
 
 static void
-xfrin_log(dns_xfrin_ctx_t *xfr, int level, const char *fmt, ...)
+xfrin_log(dns_xfrin_t *xfr, int level, const char *fmt, ...)
        ISC_FORMAT_PRINTF(3, 4);
 
 /**************************************************************************/
@@ -265,7 +264,7 @@ xfrin_log(dns_xfrin_ctx_t *xfr, int level, const char *fmt, ...)
  */
 
 static isc_result_t
-axfr_init(dns_xfrin_ctx_t *xfr) {
+axfr_init(dns_xfrin_t *xfr) {
        isc_result_t result;
 
        xfr->is_ixfr = false;
@@ -283,7 +282,7 @@ failure:
 }
 
 static isc_result_t
-axfr_makedb(dns_xfrin_ctx_t *xfr, dns_db_t **dbp) {
+axfr_makedb(dns_xfrin_t *xfr, dns_db_t **dbp) {
        isc_result_t result;
 
        result = dns_db_create(xfr->mctx, /* XXX */
@@ -299,8 +298,8 @@ axfr_makedb(dns_xfrin_ctx_t *xfr, dns_db_t **dbp) {
 }
 
 static isc_result_t
-axfr_putdata(dns_xfrin_ctx_t *xfr, dns_diffop_t op, dns_name_t *name,
-            dns_ttl_t ttl, dns_rdata_t *rdata) {
+axfr_putdata(dns_xfrin_t *xfr, dns_diffop_t op, dns_name_t *name, dns_ttl_t ttl,
+            dns_rdata_t *rdata) {
        isc_result_t result;
 
        dns_difftuple_t *tuple = NULL;
@@ -325,7 +324,7 @@ failure:
  * Store a set of AXFR RRs in the database.
  */
 static isc_result_t
-axfr_apply(dns_xfrin_ctx_t *xfr) {
+axfr_apply(dns_xfrin_t *xfr) {
        isc_result_t result;
        uint64_t records;
 
@@ -345,7 +344,7 @@ failure:
 }
 
 static isc_result_t
-axfr_commit(dns_xfrin_ctx_t *xfr) {
+axfr_commit(dns_xfrin_t *xfr) {
        isc_result_t result;
 
        CHECK(axfr_apply(xfr));
@@ -358,7 +357,7 @@ failure:
 }
 
 static isc_result_t
-axfr_finalize(dns_xfrin_ctx_t *xfr) {
+axfr_finalize(dns_xfrin_t *xfr) {
        isc_result_t result;
 
        CHECK(dns_zone_replacedb(xfr->zone, xfr->db, true));
@@ -374,7 +373,7 @@ failure:
  */
 
 static isc_result_t
-ixfr_init(dns_xfrin_ctx_t *xfr) {
+ixfr_init(dns_xfrin_t *xfr) {
        isc_result_t result;
        char *journalfile = NULL;
 
@@ -400,8 +399,8 @@ failure:
 }
 
 static isc_result_t
-ixfr_putdata(dns_xfrin_ctx_t *xfr, dns_diffop_t op, dns_name_t *name,
-            dns_ttl_t ttl, dns_rdata_t *rdata) {
+ixfr_putdata(dns_xfrin_t *xfr, dns_diffop_t op, dns_name_t *name, dns_ttl_t ttl,
+            dns_rdata_t *rdata) {
        isc_result_t result;
        dns_difftuple_t *tuple = NULL;
 
@@ -427,7 +426,7 @@ failure:
  * Apply a set of IXFR changes to the database.
  */
 static isc_result_t
-ixfr_apply(dns_xfrin_ctx_t *xfr) {
+ixfr_apply(dns_xfrin_t *xfr) {
        isc_result_t result;
        uint64_t records;
 
@@ -459,7 +458,7 @@ failure:
 }
 
 static isc_result_t
-ixfr_commit(dns_xfrin_ctx_t *xfr) {
+ixfr_commit(dns_xfrin_t *xfr) {
        isc_result_t result;
 
        CHECK(ixfr_apply(xfr));
@@ -487,8 +486,7 @@ failure:
  * state.
  */
 static isc_result_t
-xfr_rr(dns_xfrin_ctx_t *xfr, dns_name_t *name, uint32_t ttl,
-       dns_rdata_t *rdata) {
+xfr_rr(dns_xfrin_t *xfr, dns_name_t *name, uint32_t ttl, dns_rdata_t *rdata) {
        isc_result_t result;
 
        xfr->nrecs++;
@@ -692,9 +690,9 @@ dns_xfrin_create(dns_zone_t *zone, dns_rdatatype_t xfrtype,
                 const isc_sockaddr_t *sourceaddr, dns_tsigkey_t *tsigkey,
                 dns_transport_t *transport, isc_tlsctx_cache_t *tlsctx_cache,
                 isc_mem_t *mctx, isc_nm_t *netmgr, dns_xfrindone_t done,
-                dns_xfrin_ctx_t **xfrp) {
+                dns_xfrin_t **xfrp) {
        dns_name_t *zonename = dns_zone_getorigin(zone);
-       dns_xfrin_ctx_t *xfr = NULL;
+       dns_xfrin_t *xfr = NULL;
        isc_result_t result;
        dns_db_t *db = NULL;
 
@@ -749,41 +747,21 @@ dns_xfrin_create(dns_zone_t *zone, dns_rdatatype_t xfrtype,
        return (result);
 }
 
-static void
-xfrin_cancelio(dns_xfrin_ctx_t *xfr);
-
 void
-dns_xfrin_shutdown(dns_xfrin_ctx_t *xfr) {
+dns_xfrin_shutdown(dns_xfrin_t *xfr) {
        REQUIRE(VALID_XFRIN(xfr));
 
        xfrin_fail(xfr, ISC_R_CANCELED, "shut down");
 }
 
-void
-dns_xfrin_attach(dns_xfrin_ctx_t *source, dns_xfrin_ctx_t **target) {
-       REQUIRE(VALID_XFRIN(source));
-       REQUIRE(target != NULL && *target == NULL);
-       (void)isc_refcount_increment(&source->references);
-
-       *target = source;
-}
-
-void
-dns_xfrin_detach(dns_xfrin_ctx_t **xfrp) {
-       dns_xfrin_ctx_t *xfr = NULL;
-
-       REQUIRE(xfrp != NULL && VALID_XFRIN(*xfrp));
-
-       xfr = *xfrp;
-       *xfrp = NULL;
-
-       if (isc_refcount_decrement(&xfr->references) == 1) {
-               xfrin_destroy(xfr);
-       }
-}
+#if DNS_XFRIN_TRACE
+ISC_REFCOUNT_TRACE_IMPL(dns_xfrin, xfrin_destroy);
+#else
+ISC_REFCOUNT_IMPL(dns_xfrin, xfrin_destroy);
+#endif
 
 static void
-xfrin_cancelio(dns_xfrin_ctx_t *xfr) {
+xfrin_cancelio(dns_xfrin_t *xfr) {
        if (xfr->readhandle == NULL) {
                return;
        }
@@ -793,7 +771,7 @@ xfrin_cancelio(dns_xfrin_ctx_t *xfr) {
 }
 
 static void
-xfrin_reset(dns_xfrin_ctx_t *xfr) {
+xfrin_reset(dns_xfrin_t *xfr) {
        REQUIRE(VALID_XFRIN(xfr));
 
        xfrin_log(xfr, ISC_LOG_INFO, "resetting");
@@ -822,7 +800,7 @@ xfrin_reset(dns_xfrin_ctx_t *xfr) {
 }
 
 static void
-xfrin_fail(dns_xfrin_ctx_t *xfr, isc_result_t result, const char *msg) {
+xfrin_fail(dns_xfrin_t *xfr, isc_result_t result, const char *msg) {
        /* Make sure only the first xfrin_fail() trumps */
        if (atomic_compare_exchange_strong(&xfr->shuttingdown, &(bool){ false },
                                           true))
@@ -858,19 +836,19 @@ xfrin_create(isc_mem_t *mctx, dns_zone_t *zone, dns_db_t *db, isc_nm_t *netmgr,
             dns_rdatatype_t reqtype, const isc_sockaddr_t *primaryaddr,
             const isc_sockaddr_t *sourceaddr, dns_tsigkey_t *tsigkey,
             dns_transport_t *transport, isc_tlsctx_cache_t *tlsctx_cache,
-            dns_xfrin_ctx_t **xfrp) {
-       dns_xfrin_ctx_t *xfr = NULL;
+            dns_xfrin_t **xfrp) {
+       dns_xfrin_t *xfr = NULL;
 
        xfr = isc_mem_get(mctx, sizeof(*xfr));
-       *xfr = (dns_xfrin_ctx_t){ .netmgr = netmgr,
-                                 .shutdown_result = ISC_R_UNSET,
-                                 .rdclass = rdclass,
-                                 .reqtype = reqtype,
-                                 .id = (dns_messageid_t)isc_random16(),
-                                 .maxrecords = dns_zone_getmaxrecords(zone),
-                                 .primaryaddr = *primaryaddr,
-                                 .sourceaddr = *sourceaddr,
-                                 .firstsoa = DNS_RDATA_INIT };
+       *xfr = (dns_xfrin_t){ .netmgr = netmgr,
+                             .shutdown_result = ISC_R_UNSET,
+                             .rdclass = rdclass,
+                             .reqtype = reqtype,
+                             .id = (dns_messageid_t)isc_random16(),
+                             .maxrecords = dns_zone_getmaxrecords(zone),
+                             .primaryaddr = *primaryaddr,
+                             .sourceaddr = *sourceaddr,
+                             .firstsoa = DNS_RDATA_INIT };
 
        isc_mem_attach(mctx, &xfr->mctx);
        dns_zone_iattach(zone, &xfr->zone);
@@ -923,9 +901,9 @@ xfrin_create(isc_mem_t *mctx, dns_zone_t *zone, dns_db_t *db, isc_nm_t *netmgr,
 }
 
 static isc_result_t
-xfrin_start(dns_xfrin_ctx_t *xfr) {
+xfrin_start(dns_xfrin_t *xfr) {
        isc_result_t result;
-       dns_xfrin_ctx_t *connect_xfr = NULL;
+       dns_xfrin_t *connect_xfr = NULL;
        dns_transport_type_t transport_type = DNS_TRANSPORT_TCP;
        isc_tlsctx_t *tlsctx = NULL;
        isc_tlsctx_client_session_cache_t *sess_cache = NULL;
@@ -996,7 +974,7 @@ failure:
  */
 static void
 xfrin_connect_done(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
-       dns_xfrin_ctx_t *xfr = (dns_xfrin_ctx_t *)cbarg;
+       dns_xfrin_t *xfr = (dns_xfrin_t *)cbarg;
        char sourcetext[ISC_SOCKADDR_FORMATSIZE];
        char signerbuf[DNS_NAME_FORMATSIZE];
        const char *signer = "", *sep = "";
@@ -1091,7 +1069,7 @@ tuple2msgname(dns_difftuple_t *tuple, dns_message_t *msg, dns_name_t **target) {
  * Build an *XFR request and send its length prefix.
  */
 static isc_result_t
-xfrin_send_request(dns_xfrin_ctx_t *xfr) {
+xfrin_send_request(dns_xfrin_t *xfr) {
        isc_result_t result;
        isc_region_t region;
        dns_rdataset_t *qrdataset = NULL;
@@ -1100,7 +1078,7 @@ xfrin_send_request(dns_xfrin_ctx_t *xfr) {
        dns_name_t *qname = NULL;
        dns_dbversion_t *ver = NULL;
        dns_name_t *msgsoaname = NULL;
-       dns_xfrin_ctx_t *send_xfr = NULL;
+       dns_xfrin_t *send_xfr = NULL;
 
        /* Create the request message */
        dns_message_create(xfr->mctx, DNS_MESSAGE_INTENTRENDER, &msg);
@@ -1184,8 +1162,8 @@ failure:
 
 static void
 xfrin_send_done(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
-       dns_xfrin_ctx_t *xfr = (dns_xfrin_ctx_t *)cbarg;
-       dns_xfrin_ctx_t *recv_xfr = NULL;
+       dns_xfrin_t *xfr = (dns_xfrin_t *)cbarg;
+       dns_xfrin_t *recv_xfr = NULL;
 
        REQUIRE(VALID_XFRIN(xfr));
 
@@ -1215,7 +1193,7 @@ failure:
 static void
 xfrin_recv_done(isc_nmhandle_t *handle, isc_result_t result,
                isc_region_t *region, void *cbarg) {
-       dns_xfrin_ctx_t *xfr = (dns_xfrin_ctx_t *)cbarg;
+       dns_xfrin_t *xfr = (dns_xfrin_t *)cbarg;
        dns_message_t *msg = NULL;
        dns_name_t *name = NULL;
        const dns_name_t *tsigowner = NULL;
@@ -1511,7 +1489,7 @@ failure:
 }
 
 static void
-xfrin_destroy(dns_xfrin_ctx_t *xfr) {
+xfrin_destroy(dns_xfrin_t *xfr) {
        uint64_t msecs;
        uint64_t persec;
        const char *result_str;
@@ -1647,7 +1625,7 @@ xfrin_logv(dns_xfrin_t *xfr, int level, const char *zonetext,
  */
 
 static void
-xfrin_log(dns_xfrin_ctx_t *xfr, int level, const char *fmt, ...) {
+xfrin_log(dns_xfrin_t *xfr, int level, const char *fmt, ...) {
        va_list ap;
        char zonetext[DNS_NAME_MAXTEXT + 32];
 
index e60b7547d26cbdbd723668a3f8a5b64b49b8d33b..af3bac270c88a995459bdb3df9ad8ba30547798c 100644 (file)
@@ -323,7 +323,7 @@ struct dns_zone {
        isc_sockaddr_t xfrsource4;
        isc_sockaddr_t xfrsource6;
        isc_sockaddr_t sourceaddr;
-       dns_xfrin_ctx_t *xfr;       /* loop locked */
+       dns_xfrin_t *xfr;           /* loop locked */
        dns_tsigkey_t *tsigkey;     /* key used for xfr */
        dns_transport_t *transport; /* transport used for xfr */
        /* Access Control Lists */