From: Diego Fronza Date: Tue, 10 Nov 2020 16:50:54 +0000 (-0300) Subject: Check 'stale-refresh-time' when sharing cache between views X-Git-Tag: v9.17.7~5^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=581e2a8f283d24f0f34f5b873fd960a3f84995de;p=thirdparty%2Fbind9.git Check 'stale-refresh-time' when sharing cache between views This commit ensures that, along with previous restrictions, a cache is shareable between views only if their 'stale-refresh-time' value are equal. --- diff --git a/bin/named/server.c b/bin/named/server.c index f83473c1b2f..17889f9d495 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -1869,7 +1869,7 @@ cache_reusable(dns_view_t *originview, dns_view_t *view, static bool cache_sharable(dns_view_t *originview, dns_view_t *view, bool new_zero_no_soattl, uint64_t new_max_cache_size, - uint32_t new_stale_ttl) { + uint32_t new_stale_ttl, uint32_t new_stale_refresh_time) { /* * If the cache cannot even reused for the same view, it cannot be * shared with other views. @@ -1883,6 +1883,7 @@ cache_sharable(dns_view_t *originview, dns_view_t *view, * the sharing views. */ if (dns_cache_getservestalettl(originview->cache) != new_stale_ttl || + dns_cache_getservestalerefresh(originview->cache) != new_stale_refresh_time || dns_cache_getcachesize(originview->cache) != new_max_cache_size) { return (false); @@ -4435,7 +4436,7 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist, cfg_obj_t *config, nsc = cachelist_find(cachelist, cachename, view->rdclass); if (nsc != NULL) { if (!cache_sharable(nsc->primaryview, view, zero_no_soattl, - max_cache_size, max_stale_ttl)) + max_cache_size, max_stale_ttl, stale_refresh_time)) { isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR, diff --git a/lib/dns/cache.c b/lib/dns/cache.c index 873b825f2ed..931340fe539 100644 --- a/lib/dns/cache.c +++ b/lib/dns/cache.c @@ -142,6 +142,7 @@ struct dns_cache { char **db_argv; size_t size; dns_ttl_t serve_stale_ttl; + dns_ttl_t serve_stale_refresh; isc_stats_t *stats; /* Locked by 'filelock'. */ @@ -1000,12 +1001,27 @@ dns_cache_getservestalettl(dns_cache_t *cache) { } void -dns_cache_setservestalerefresh(dns_cache_t *cache, uint32_t interval) { +dns_cache_setservestalerefresh(dns_cache_t *cache, dns_ttl_t interval) { REQUIRE(VALID_CACHE(cache)); + LOCK(&cache->lock); + cache->serve_stale_refresh = interval; + UNLOCK(&cache->lock); + (void)dns_db_setservestalerefresh(cache->db, interval); } +dns_ttl_t +dns_cache_getservestalerefresh(dns_cache_t *cache) { + isc_result_t result; + dns_ttl_t interval; + + REQUIRE(VALID_CACHE(cache)); + + result = dns_db_getservestalerefresh(cache->db, &interval); + return (result == ISC_R_SUCCESS ? interval : 0); +} + /* * The cleaner task is shutting down; do the necessary cleanup. */ diff --git a/lib/dns/include/dns/cache.h b/lib/dns/include/dns/cache.h index 0474d78dbdc..22e94da9d5a 100644 --- a/lib/dns/include/dns/cache.h +++ b/lib/dns/include/dns/cache.h @@ -256,7 +256,7 @@ dns_cache_getservestalettl(dns_cache_t *cache); */ void -dns_cache_setservestalerefresh(dns_cache_t *cache, uint32_t interval); +dns_cache_setservestalerefresh(dns_cache_t *cache, dns_ttl_t interval); /*%< * Sets the length of time to wait before attempting to refresh a rrset * if a previous attempt in doing so has failed. @@ -267,6 +267,16 @@ dns_cache_setservestalerefresh(dns_cache_t *cache, uint32_t interval); *\li 'cache' to be valid. */ +dns_ttl_t +dns_cache_getservestalerefresh(dns_cache_t *cache); +/*%< + * Gets the 'stale-refresh-time' value, set by a previous call to + * 'dns_cache_setservestalerefresh'. + * + * Requires: + *\li 'cache' to be valid. + */ + isc_result_t dns_cache_flush(dns_cache_t *cache); /*%<