#include <dns/qp.h>
#include <dns/view.h>
+#include "probes-dns.h"
+
#define DELEGDB_NODE_MAGIC ISC_MAGIC('D', 'e', 'G', 'N')
#define VALID_DELEGDB_NODE(node) ISC_MAGIC_VALID(node, DELEGDB_NODE_MAGIC)
ISC_SIEVE_INIT(delegdb->lru[i]);
}
+ LIBDNS_DELEGDB_CREATE(delegdb);
+
*delegdbp = delegdb;
}
dns_delegdb_attach(oldview->deleg, &newview->deleg);
isc_refcount_increment(&oldview->deleg->owners);
+
+ LIBDNS_DELEGDB_REUSE(newview->deleg);
}
typedef struct nodes_rcu_head {
isc_result_t result = ISC_R_SHUTTINGDOWN;
dns_qpmulti_t *nodes = NULL;
dns_qpread_t qpr = {};
+ char namebuf[DNS_NAME_FORMATSIZE];
+
+ if (LIBDNS_DELEGDB_LOOKUP_START_ENABLED() ||
+ LIBDNS_DELEGDB_LOOKUP_DONE_ENABLED())
+ {
+ dns_name_format(name, namebuf, sizeof(namebuf));
+ }
+ LIBDNS_DELEGDB_LOOKUP_START(delegdb, namebuf);
rcu_read_lock();
nodes = rcu_dereference(delegdb->nodes);
}
rcu_read_unlock();
+ LIBDNS_DELEGDB_LOOKUP_DONE(delegdb, namebuf, result);
+
return result;
}
return;
}
+ LIBDNS_DELEGDB_CLEANUP_START(delegdb, (int)requested);
+
while (reclaimed < requested) {
node = ISC_SIEVE_NEXT(delegdb->lru[isc_tid()], visited, link);
}
reclaimed += node->size;
+ if (LIBDNS_DELEGDB_EVICT_ENABLED()) {
+ char namebuf[DNS_NAME_FORMATSIZE];
+ dns_name_format(&node->zonecut, namebuf,
+ sizeof(namebuf));
+ LIBDNS_DELEGDB_EVICT(delegdb, node, namebuf);
+ }
+
ISC_SIEVE_UNLINK(delegdb->lru[isc_tid()], node, link);
(void)dns_qp_deletename(qp, &node->zonecut,
DNS_DBNAMESPACE_NORMAL, NULL, NULL);
}
+
+ LIBDNS_DELEGDB_CLEANUP_DONE(delegdb, (int)reclaimed);
}
static size_t
dns_qpread_t qpr = {};
isc_stdtime_t now = isc_stdtime_now();
dns_qpmulti_t *nodes = NULL;
+ char zonecutbuf[DNS_NAME_FORMATSIZE];
REQUIRE(VALID_DELEGDB(delegdb));
REQUIRE(DNS_NAME_VALID(zonecut));
*/
REQUIRE(delegset->mctx == delegdb->mctx);
+ if (LIBDNS_DELEGDB_INSERT_START_ENABLED() ||
+ LIBDNS_DELEGDB_INSERT_DONE_ENABLED())
+ {
+ dns_name_format(zonecut, zonecutbuf, sizeof(zonecutbuf));
+ }
+ LIBDNS_DELEGDB_INSERT_START(delegdb, zonecutbuf);
+
rcu_read_lock();
nodes = rcu_dereference(delegdb->nodes);
if (nodes == NULL) {
- rcu_read_unlock();
- return ISC_R_SHUTTINGDOWN;
+ CLEANUP(ISC_R_SHUTTINGDOWN);
}
/*
cleanup:
rcu_read_unlock();
+ LIBDNS_DELEGDB_INSERT_DONE(delegdb, zonecutbuf, result);
+
return result;
}
dns_qpmulti_t *nodes = NULL;
dns_qp_t *qp = NULL;
isc_result_t result = ISC_R_SHUTTINGDOWN;
+ char namebuf[DNS_NAME_FORMATSIZE];
+
+ if (LIBDNS_DELEGDB_DELETE_ENABLED()) {
+ dns_name_format(name, namebuf, sizeof(namebuf));
+ }
rcu_read_lock();
nodes = rcu_dereference(delegdb->nodes);
}
rcu_read_unlock();
+ LIBDNS_DELEGDB_DELETE(delegdb, namebuf, (int)tree, result);
+
return result;
}
REQUIRE(isc_loop_get(isc_tid()) == isc_loop_main());
REQUIRE(delegdb != NULL && VALID_DELEGDB(delegdb));
+
if (isc_refcount_decrement(&delegdb->owners) == 1) {
dns_qpmulti_t *nodes = rcu_xchg_pointer(&delegdb->nodes, NULL);
};
call_rcu(&nrh->rcu_head, deleg_destroy_qpmulti);
}
+ LIBDNS_DELEGDB_SHUTDOWN(delegdb);
}
}
*/
provider libdns {
+ probe delegdb_cleanup_done(void *, int);
+ probe delegdb_cleanup_start(void *, int);
+ probe delegdb_create(void *);
+ probe delegdb_delete(void *, char *, int, int);
+ probe delegdb_evict(void *, void *, char *);
+ probe delegdb_insert_done(void *, char *, int);
+ probe delegdb_insert_start(void *, char *);
+ probe delegdb_lookup_done(void *, char *, int);
+ probe delegdb_lookup_start(void *, char *);
+ probe delegdb_reuse(void *);
+ probe delegdb_shutdown(void *);
probe xfrin_axfr_finalize_begin(void *, char *);
probe xfrin_axfr_finalize_end(void *, char *, int);
probe xfrin_connected(void *, char *, int);
master_data = []
subdir('testdata/master')
+deleg_probe_stub = custom_target(
+ 'deleg-test-probes-dns',
+ input: files('../../lib/dns/probes-dns.d'),
+ output: 'probes-dns.h',
+ command: [
+ files('../../util/dtrace.sh'),
+ '-h',
+ '-s', '@INPUT@',
+ '-o', '@OUTPUT@',
+ ],
+)
+
foreach unit : dns_tests
+ extra_sources = []
+ if unit == 'deleg'
+ extra_sources += deleg_probe_stub
+ endif
test_bin = executable(
unit,
files(f'@unit@_test.c'),
meson.project_source_root() / 'bin' / 'tests' / 'system' / 'geoip2' / 'data',
),
],
- sources: default_sanitize_options,
+ sources: [default_sanitize_options, extra_sources],
dependencies: [
libisc_dep,
libdns_dep,