From: Evan Hunt Date: Thu, 23 Feb 2023 18:29:33 +0000 (-0800) Subject: implement refcount tracing in xfrin.c X-Git-Tag: v9.19.11~30^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a4c8decc6ad33f3315a0c2630e04ff29ff04b5fa;p=thirdparty%2Fbind9.git implement refcount tracing in xfrin.c 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). --- diff --git a/lib/dns/include/dns/xfrin.h b/lib/dns/include/dns/xfrin.h index f37aa7f1c79..7e269c48eba 100644 --- a/lib/dns/include/dns/xfrin.h +++ b/lib/dns/include/dns/xfrin.h @@ -32,6 +32,9 @@ #include #include +/* 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 diff --git a/lib/dns/xfrin.c b/lib/dns/xfrin.c index be1d41234d0..c74cce66f91 100644 --- a/lib/dns/xfrin.c +++ b/lib/dns/xfrin.c @@ -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]; diff --git a/lib/dns/zone.c b/lib/dns/zone.c index e60b7547d26..af3bac270c8 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -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 */