fixup! Temporarily disable TTL-based cleaning

This commit is contained in:
Ondřej Surý
2024-03-13 16:57:40 +01:00
parent c89fe7adb9
commit 6078fad8ae
+23 -63
View File
@@ -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 = {