diff --git a/lib/dns/qpcache.c b/lib/dns/qpcache.c index d99f2c795a..2be3466bb2 100644 --- a/lib/dns/qpcache.c +++ b/lib/dns/qpcache.c @@ -235,7 +235,6 @@ struct dns_qpdb { isc_mem_t *hmctx; isc_mutex_t heaplock; - /* isc_timer_t *heaptimer; */ isc_heap_t *heap; dns_qpmulti_t *tree; /* Main QP trie for data storage */ @@ -798,10 +797,6 @@ static void newttl(dns_slabheader_t *newheader) { dns_qpdb_t *qpdb = (dns_qpdb_t *)newheader->db; - if (newheader) { - return; - } - LOCK(&qpdb->heaplock); isc_heap_insert(qpdb->heap, newheader); UNLOCK(&qpdb->heaplock); @@ -812,10 +807,6 @@ static void setttl(dns_slabheader_t *header, dns_ttl_t newttl) { dns_ttl_t oldttl = header->ttl; - if (header) { - return; - } - header->ttl = newttl; if (header->db == NULL || !dns_db_iscache(header->db)) { @@ -839,30 +830,6 @@ setttl(dns_slabheader_t *header, dns_ttl_t newttl) { if (newttl == 0) { isc_heap_delete(header->heap, header->heap_index); } - - dns_slabheader_t *top_header = isc_heap_element(qpdb->heap, 1); - if (top_header != NULL) { - isc_stdtime_t now = isc_stdtime_now(); - dns_ttl_t ttl = header->ttl; - - if (isc_mem_isovermem(qpdb->common.mctx)) { - /* Only account for stale TTL if cache is not overmem */ - ttl += STALE_TTL(header, qpdb); - } - - if (ttl >= now - QPDB_VIRTUAL) { - isc_interval_t interval; - isc_interval_set(&interval, ttl + QPDB_VIRTUAL - now, - 0); - /* isc_timer_start(qpdb->heaptimer, isc_timertype_once, - */ - /* &interval); */ - } else { - /* isc_timer_start(qpdb->heaptimer, isc_timertype_once, - */ - /* isc_interval_zero); */ - } - } UNLOCK(&qpdb->heaplock); } @@ -2219,7 +2186,6 @@ free_qpdb_rcu(struct rcu_head *rcu_head) { isc_refcount_destroy(&qpdb->common.references); if (qpdb->loop != NULL) { isc_loop_detach(&qpdb->loop); - /* isc_timer_destroy(&qpdb->heaptimer); */ } isc_mutex_destroy(&qpdb->lock); @@ -2938,7 +2904,8 @@ cleanup: } static void -expire_ttl_headers(void *arg); +expire_ttl_headers(dns_qpdb_t *qpdb, dbmod_t *modctx, isc_stdtime_t now, + bool cache_is_overmem DNS__DB_FLARG); static isc_result_t addrdataset(dns_db_t *db, dns_dbnode_t *node, @@ -3060,6 +3027,9 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, modctx.tree = (dns_qp_t *)&modctx.qpr; } + expire_ttl_headers(qpdb, &modctx, now, + cache_is_overmem DNS__DB_FLARG_PASS); + SPINLOCK(&qpnode->spinlock); if (qpdb->rrsetstats != NULL) { @@ -3173,12 +3143,9 @@ setloop(dns_db_t *db, isc_loop_t *loop) { LOCK(&qpdb->lock); if (qpdb->loop != NULL) { isc_loop_detach(&qpdb->loop); - /* isc_timer_async_destroy(&qpdb->heaptimer); */ } if (loop != NULL) { isc_loop_attach(loop, &qpdb->loop); - /* isc_timer_create(qpdb->loop, expire_ttl_headers, qpdb, */ - /* &qpdb->heaptimer); */ } UNLOCK(&qpdb->lock); } @@ -3739,21 +3706,22 @@ deletedata(dns_db_t *db ISC_ATTR_UNUSED, dns_dbnode_t *node ISC_ATTR_UNUSED, } } -static void __attribute__((__unused__)) -expire_ttl_headers(void *arg) { - dns_qpdb_t *qpdb = arg; - dbmod_t modctx = { - .writing = true, - }; - isc_stdtime_t now = isc_stdtime_now(); - bool cache_is_overmem = isc_mem_isovermem(qpdb->common.mctx); - dns_slabheader_t *header = NULL; +/* + * Caller must be holding the node write lock. + */ +static void +expire_ttl_headers(dns_qpdb_t *qpdb, dbmod_t *modctx, isc_stdtime_t now, + bool cache_is_overmem DNS__DB_FLARG) { + for (size_t i = 0; i < DNS_QPDB_EXPIRE_TTL_COUNT; i++) { + LOCK(&qpdb->heaplock); + dns_slabheader_t *header = isc_heap_element(qpdb->heap, 1); + UNLOCK(&qpdb->heaplock); - dns_qpmulti_write(qpdb->tree, &modctx.tree); - dns_qpmulti_write(qpdb->nsec, &modctx.nsec); + if (header == NULL) { + /* No headers left on this TTL heap; exit cleaning */ + return; + } - LOCK(&qpdb->heaplock); - while ((header = isc_heap_element(qpdb->heap, 1)) != NULL) { qpdata_t *node = HEADERNODE(header); qpdata_ref(node); SPINLOCK(&node->spinlock); @@ -3772,23 +3740,15 @@ expire_ttl_headers(void *arg) { * the same heap can be eligible for expiry, either; * exit cleaning. */ - SPINUNLOCK(&node->spinlock); - qpdata_unref(node); - break; + i = DNS_QPDB_EXPIRE_TTL_COUNT; + } else { + expireheader(header, modctx, + dns_expire_ttl DNS__DB_FLARG_PASS); } - expireheader(header, &modctx, - dns_expire_ttl DNS__DB_FLARG_PASS); SPINUNLOCK(&node->spinlock); qpdata_unref(node); } - UNLOCK(&qpdb->heaplock); - - dns_qp_compact(modctx.tree, DNS_QPGC_MAYBE); - dns_qpmulti_commit(qpdb->tree, &modctx.tree); - - dns_qp_compact(modctx.nsec, DNS_QPGC_MAYBE); - dns_qpmulti_commit(qpdb->nsec, &modctx.nsec); } static dns_dbmethods_t qpdb_cachemethods = {