]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Check 'stale-refresh-time' when sharing cache between views
authorDiego Fronza <diego@isc.org>
Tue, 10 Nov 2020 16:50:54 +0000 (13:50 -0300)
committerDiego Fronza <diego@isc.org>
Wed, 11 Nov 2020 15:53:24 +0000 (12:53 -0300)
This commit ensures that, along with previous restrictions, a cache is
shareable between views only if their 'stale-refresh-time' value are
equal.

bin/named/server.c
lib/dns/cache.c
lib/dns/include/dns/cache.h

index f83473c1b2fde55117001b263e5266063020c017..17889f9d49561323cd4fae563f7b2fd66f830a21 100644 (file)
@@ -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,
index 873b825f2edc89f2f2808b8e086d9d9c7becf490..931340fe5393208625448011c55a882a90e37843 100644 (file)
@@ -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.
  */
index 0474d78dbdce66b7d71b23f7cb57cf12ea367906..22e94da9d5af45f843f07f4f68e440b100afcdd2 100644 (file)
@@ -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);
 /*%<