+4010. [cleanup] Clear the prefetchable state when initiating a prefetch.
+ [RT #37399]
+
4009. [func] delv: added a +tcp option. [RT #37855]
4008. [contrib] Updated zkt to latest version (1.1.3). [RT #37886]
ns_client_t *dummy = NULL;
unsigned int options;
- if (client->view->prefetch_trigger == 0U ||
+ if (client->query.prefetch != NULL ||
+ client->view->prefetch_trigger == 0U ||
rdataset->ttl > client->view->prefetch_trigger ||
(rdataset->attributes & DNS_RDATASETATTR_PREFETCH) == 0)
return;
isc_stats_increment(ns_g_server->nsstats,
dns_nsstatscounter_recursclients);
}
- if (client->query.prefetch != NULL)
- return;
tmprdataset = query_newrdataset(client);
if (tmprdataset == NULL)
query_putrdataset(client, &tmprdataset);
ns_client_detach(&dummy);
}
+ dns_rdataset_clearprefetch(rdataset);
}
static isc_result_t
NULL, /* setadditional */
NULL, /* putadditional */
rdataset_settrust, /* settrust */
- NULL /* expire */
+ NULL, /* expire */
+ NULL /* clearprefetch */
};
typedef struct ecdb_rdatasetiter {
void (*settrust)(dns_rdataset_t *rdataset,
dns_trust_t trust);
void (*expire)(dns_rdataset_t *rdataset);
+ void (*clearprefetch)(dns_rdataset_t *rdataset);
} dns_rdatasetmethods_t;
#define DNS_RDATASET_MAGIC ISC_MAGIC('D','N','S','R')
* Mark the rdataset to be expired in the backing database.
*/
+void
+dns_rdataset_clearprefetch(dns_rdataset_t *rdataset);
+/*%<
+ * Clear the PREFETCH attribute for the given rdataset in the
+ * underlying database.
+ *
+ * In the cache database, this signals that the rdataset is not
+ * eligible to be prefetched when the TTL is close to expiring.
+ * It has no function in other databases.
+ */
+
void
dns_rdataset_trimttl(dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset,
dns_rdata_rrsig_t *rrsig, isc_stdtime_t now,
NULL,
NULL,
rdataset_settrust,
+ NULL,
NULL
};
static void prune_tree(isc_task_t *task, isc_event_t *event);
static void rdataset_settrust(dns_rdataset_t *rdataset, dns_trust_t trust);
static void rdataset_expire(dns_rdataset_t *rdataset);
+static void rdataset_clearprefetch(dns_rdataset_t *rdataset);
static dns_rdatasetmethods_t rdataset_methods = {
rdataset_disassociate,
rdataset_setadditional,
rdataset_putadditional,
rdataset_settrust,
- rdataset_expire
+ rdataset_expire,
+ rdataset_clearprefetch
};
static void rdatasetiter_destroy(dns_rdatasetiter_t **iteratorp);
isc_rwlocktype_write);
}
+static void
+rdataset_clearprefetch(dns_rdataset_t *rdataset) {
+ dns_rbtdb_t *rbtdb = rdataset->private1;
+ dns_rbtnode_t *rbtnode = rdataset->private2;
+ rdatasetheader_t *header = rdataset->private3;
+
+ NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock,
+ isc_rwlocktype_write);
+ header->attributes &= ~RDATASET_ATTR_PREFETCH;
+ NODE_UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock,
+ isc_rwlocktype_write);
+}
+
/*
* Rdataset Iterator Methods
*/
NULL,
NULL,
NULL,
+ NULL,
NULL
};
NULL,
NULL,
NULL,
+ NULL,
NULL
};
(rdataset->methods->expire)(rdataset);
}
+void
+dns_rdataset_clearprefetch(dns_rdataset_t *rdataset) {
+ REQUIRE(DNS_RDATASET_VALID(rdataset));
+ REQUIRE(rdataset->methods != NULL);
+
+ if (rdataset->methods->clearprefetch != NULL)
+ (rdataset->methods->clearprefetch)(rdataset);
+}
+
void
dns_rdataset_trimttl(dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset,
dns_rdata_rrsig_t *rrsig, isc_stdtime_t now,
NULL,
NULL,
NULL,
+ NULL,
NULL
};
NULL,
NULL,
NULL,
+ NULL,
NULL
};
NULL,
NULL,
NULL,
+ NULL,
NULL
};
dns_rdatalist_init
dns_rdatalist_tordataset
dns_rdataset_additionaldata
+dns_rdataset_clearprefetch
dns_rdataset_clone
dns_rdataset_count
dns_rdataset_current