mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-02 07:35:26 +00:00
Don't expire fresh ADB names and entries
The overmem cleaning in ADB could become overzealous and clean fresh ADB names and entries. Add a safety check to not clean any ADB names and entries that are below ADB_CACHE_MINIMUM threshold.
This commit is contained in:
@@ -1375,7 +1375,7 @@ get_attached_and_locked_name(dns_adb_t *adb, const dns_name_t *name,
|
|||||||
break;
|
break;
|
||||||
case ISC_R_SUCCESS:
|
case ISC_R_SUCCESS:
|
||||||
LOCK(&adbname->lock); /* Must be unlocked by the caller */
|
LOCK(&adbname->lock); /* Must be unlocked by the caller */
|
||||||
if (adbname->last_used + ADB_STALE_MARGIN <= last_update) {
|
if (adbname->last_used + ADB_CACHE_MINIMUM <= last_update) {
|
||||||
adbname->last_used = now;
|
adbname->last_used = now;
|
||||||
|
|
||||||
ISC_LIST_UNLINK(adb->names_lru, adbname, link);
|
ISC_LIST_UNLINK(adb->names_lru, adbname, link);
|
||||||
@@ -1449,7 +1449,7 @@ get_attached_and_locked_entry(dns_adb_t *adb, isc_stdtime_t now,
|
|||||||
dns_adbentry_detach(&adbentry);
|
dns_adbentry_detach(&adbentry);
|
||||||
goto create;
|
goto create;
|
||||||
}
|
}
|
||||||
if (adbentry->last_used + ADB_STALE_MARGIN <= last_update) {
|
if (adbentry->last_used + ADB_CACHE_MINIMUM <= last_update) {
|
||||||
adbentry->last_used = now;
|
adbentry->last_used = now;
|
||||||
|
|
||||||
ISC_LIST_UNLINK(adb->entries_lru, adbentry, link);
|
ISC_LIST_UNLINK(adb->entries_lru, adbentry, link);
|
||||||
@@ -1708,6 +1708,15 @@ purge_stale_names(dns_adb_t *adb, isc_stdtime_t now) {
|
|||||||
goto next;
|
goto next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure that we are not purging ADB names that has been
|
||||||
|
* just created.
|
||||||
|
*/
|
||||||
|
if (adbname->last_used + ADB_CACHE_MINIMUM >= now) {
|
||||||
|
prev = NULL;
|
||||||
|
goto next;
|
||||||
|
}
|
||||||
|
|
||||||
if (overmem) {
|
if (overmem) {
|
||||||
expire_name(adbname, DNS_EVENT_ADBCANCELED, now);
|
expire_name(adbname, DNS_EVENT_ADBCANCELED, now);
|
||||||
removed++;
|
removed++;
|
||||||
@@ -1717,13 +1726,14 @@ purge_stale_names(dns_adb_t *adb, isc_stdtime_t now) {
|
|||||||
if (adbname->last_used + ADB_STALE_MARGIN < now) {
|
if (adbname->last_used + ADB_STALE_MARGIN < now) {
|
||||||
expire_name(adbname, DNS_EVENT_ADBCANCELED, now);
|
expire_name(adbname, DNS_EVENT_ADBCANCELED, now);
|
||||||
removed++;
|
removed++;
|
||||||
|
goto next;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* we won't expire anything on the LRU list as the
|
* We won't expire anything on the LRU list as the
|
||||||
* .last_used + ADB_STALE_MARGIN will always be bigger
|
* .last_used + ADB_STALE_MARGIN will always be bigger
|
||||||
* than `now` for all previous entries, so we just stop
|
* than `now` for all previous entries, so we just stop
|
||||||
* the scanning
|
* the scanning.
|
||||||
*/
|
*/
|
||||||
prev = NULL;
|
prev = NULL;
|
||||||
next:
|
next:
|
||||||
@@ -1801,6 +1811,15 @@ purge_stale_entries(dns_adb_t *adb, isc_stdtime_t now) {
|
|||||||
goto next;
|
goto next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure that we are not purging ADB named that has been
|
||||||
|
* just created.
|
||||||
|
*/
|
||||||
|
if (adbentry->last_used + ADB_CACHE_MINIMUM >= now) {
|
||||||
|
prev = NULL;
|
||||||
|
goto next;
|
||||||
|
}
|
||||||
|
|
||||||
if (overmem) {
|
if (overmem) {
|
||||||
maybe_expire_entry(adbentry, INT_MAX);
|
maybe_expire_entry(adbentry, INT_MAX);
|
||||||
removed++;
|
removed++;
|
||||||
@@ -1814,7 +1833,7 @@ purge_stale_entries(dns_adb_t *adb, isc_stdtime_t now) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* we won't expire anything on the LRU list as the
|
* We won't expire anything on the LRU list as the
|
||||||
* .last_used + ADB_STALE_MARGIN will always be bigger
|
* .last_used + ADB_STALE_MARGIN will always be bigger
|
||||||
* than `now` for all previous entries, so we just stop
|
* than `now` for all previous entries, so we just stop
|
||||||
* the scanning
|
* the scanning
|
||||||
|
Reference in New Issue
Block a user