Remove different zero TTL handling for rdataset iterator

Zero TTL handling does not need to be different for 'rdatasetiter_first'
and 'rdatasetiter_next' and it interacts badly with 'bind_rdatadataset'
which makes different determinations.

(cherry picked from commit 1a39328feb)
This commit is contained in:
Mark Andrews 2022-11-21 11:59:45 +11:00
parent 47239b45e6
commit d218c7f2f3

View file

@ -8730,6 +8730,35 @@ rdatasetiter_destroy(dns_rdatasetiter_t **iteratorp) {
*iteratorp = NULL;
}
static bool
iterator_active(dns_rbtdb_t *rbtdb, rbtdb_rdatasetiter_t *rbtiterator,
rdatasetheader_t *header) {
dns_ttl_t stale_ttl = header->rdh_ttl + STALE_TTL(header, rbtdb);
/*
* Is this a "this rdataset doesn't exist" record?
*/
if (NONEXISTENT(header)) {
return (false);
}
/*
* If this is a zone or this header still active then return it.
*/
if (!IS_CACHE(rbtdb) || ACTIVE(header, rbtiterator->common.now)) {
return (true);
}
/*
* If we are not returning stale records or the rdataset is
* too old don't return it.
*/
if (!STALEOK(rbtiterator) || (rbtiterator->common.now > stale_ttl)) {
return (false);
}
return (true);
}
static isc_result_t
rdatasetiter_first(dns_rdatasetiter_t *iterator) {
rbtdb_rdatasetiter_t *rbtiterator = (rbtdb_rdatasetiter_t *)iterator;
@ -8737,16 +8766,7 @@ rdatasetiter_first(dns_rdatasetiter_t *iterator) {
dns_rbtnode_t *rbtnode = rbtiterator->common.node;
rbtdb_version_t *rbtversion = rbtiterator->common.version;
rdatasetheader_t *header, *top_next;
rbtdb_serial_t serial;
isc_stdtime_t now;
if (IS_CACHE(rbtdb)) {
serial = 1;
now = rbtiterator->common.now;
} else {
serial = rbtversion->serial;
now = 0;
}
rbtdb_serial_t serial = IS_CACHE(rbtdb) ? 1 : rbtversion->serial;
NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock,
isc_rwlocktype_read);
@ -8754,10 +8774,6 @@ rdatasetiter_first(dns_rdatasetiter_t *iterator) {
for (header = rbtnode->data; header != NULL; header = top_next) {
top_next = header->next;
do {
dns_ttl_t stale_ttl = header->rdh_ttl;
if (STALEOK(rbtiterator)) {
stale_ttl += STALE_TTL(header, rbtdb);
}
if (EXPIREDOK(rbtiterator)) {
if (!NONEXISTENT(header)) {
break;
@ -8765,17 +8781,9 @@ rdatasetiter_first(dns_rdatasetiter_t *iterator) {
header = header->down;
} else if (header->serial <= serial && !IGNORE(header))
{
/*
* Is this a "this rdataset doesn't exist"
* record? Or is it too old in the cache?
*
* Note: unlike everywhere else, we
* check for now > header->rdh_ttl instead
* of ">=". This allows ANY and RRSIG
* queries for 0 TTL rdatasets to work.
*/
if (NONEXISTENT(header) ||
(now != 0 && now > stale_ttl)) {
if (!iterator_active(rbtdb, rbtiterator,
header))
{
header = NULL;
}
break;
@ -8807,8 +8815,7 @@ rdatasetiter_next(dns_rdatasetiter_t *iterator) {
dns_rbtnode_t *rbtnode = rbtiterator->common.node;
rbtdb_version_t *rbtversion = rbtiterator->common.version;
rdatasetheader_t *header, *top_next;
rbtdb_serial_t serial;
isc_stdtime_t now;
rbtdb_serial_t serial = IS_CACHE(rbtdb) ? 1 : rbtversion->serial;
rbtdb_rdatatype_t type, negtype;
dns_rdatatype_t rdtype, covers;
bool expiredok = EXPIREDOK(rbtiterator);
@ -8818,14 +8825,6 @@ rdatasetiter_next(dns_rdatasetiter_t *iterator) {
return (ISC_R_NOMORE);
}
if (IS_CACHE(rbtdb)) {
serial = 1;
now = rbtiterator->common.now;
} else {
serial = rbtversion->serial;
now = 0;
}
NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock,
isc_rwlocktype_read);
@ -8860,10 +8859,6 @@ rdatasetiter_next(dns_rdatasetiter_t *iterator) {
for (; header != NULL; header = top_next) {
top_next = header->next;
do {
dns_ttl_t stale_ttl = header->rdh_ttl;
if (STALEOK(rbtiterator)) {
stale_ttl += STALE_TTL(header, rbtdb);
}
if (expiredok) {
if (!NONEXISTENT(header)) {
break;
@ -8871,17 +8866,9 @@ rdatasetiter_next(dns_rdatasetiter_t *iterator) {
header = header->down;
} else if (header->serial <= serial && !IGNORE(header))
{
/*
* Is this a "this rdataset doesn't
* exist" record?
*
* Note: unlike everywhere else, we
* check for now > header->ttl instead
* of ">=". This allows ANY and RRSIG
* queries for 0 TTL rdatasets to work.
*/
if (NONEXISTENT(header) ||
(now != 0 && now > stale_ttl)) {
if (!iterator_active(rbtdb, rbtiterator,
header))
{
header = NULL;
}
break;