]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
4010. [cleanup] Clear the prefetchable state when initiating a prefetch.
authorMark Andrews <marka@isc.org>
Mon, 24 Nov 2014 00:18:30 +0000 (11:18 +1100)
committerMark Andrews <marka@isc.org>
Mon, 24 Nov 2014 00:18:30 +0000 (11:18 +1100)
                        [RT #37399]

12 files changed:
CHANGES
bin/named/query.c
lib/dns/ecdb.c
lib/dns/include/dns/rdataset.h
lib/dns/ncache.c
lib/dns/rbtdb.c
lib/dns/rdatalist.c
lib/dns/rdataset.c
lib/dns/rdataslab.c
lib/dns/sdb.c
lib/dns/sdlz.c
lib/dns/win32/libdns.def.in

diff --git a/CHANGES b/CHANGES
index 726379d43fee8b40e2165670f612bbf5d6c8190d..3da1632ea4cf55d95505555feb8e16b78000c993 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+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]
index 4222b1721fd07cc9fcbc7f9a20dac3b9fc9a2233..9a325523cda7a6652f8a60b4f8df05e44beade67 100644 (file)
@@ -3880,7 +3880,8 @@ query_prefetch(ns_client_t *client, dns_name_t *qname,
        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;
@@ -3893,8 +3894,6 @@ query_prefetch(ns_client_t *client, dns_name_t *qname,
                isc_stats_increment(ns_g_server->nsstats,
                                    dns_nsstatscounter_recursclients);
        }
-       if (client->query.prefetch != NULL)
-               return;
 
        tmprdataset = query_newrdataset(client);
        if (tmprdataset == NULL)
@@ -3916,6 +3915,7 @@ query_prefetch(ns_client_t *client, dns_name_t *qname,
                query_putrdataset(client, &tmprdataset);
                ns_client_detach(&dummy);
        }
+       dns_rdataset_clearprefetch(rdataset);
 }
 
 static isc_result_t
index 06e1d8b67a5dbc24b0025253b29d4859ad6e6f7a..553a339bb54507f8b24ed058bf434119f27198d0 100644 (file)
@@ -113,7 +113,8 @@ static dns_rdatasetmethods_t rdataset_methods = {
        NULL,                   /* setadditional */
        NULL,                   /* putadditional */
        rdataset_settrust,      /* settrust */
-       NULL                    /* expire */
+       NULL,                   /* expire */
+       NULL                    /* clearprefetch */
 };
 
 typedef struct ecdb_rdatasetiter {
index 37b970611f741557166a4366ede0431456c7dbd8..252738d07505e0d61467a6bd99283b86884099a0 100644 (file)
@@ -114,6 +114,7 @@ typedef struct dns_rdatasetmethods {
        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')
@@ -654,6 +655,17 @@ dns_rdataset_expire(dns_rdataset_t *rdataset);
  * 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,
index bcb3d057898d50ede2c2a061e56d879b7d1ff706..53c822c37f1791b4ecfc4fada40ab83e813a39ad 100644 (file)
@@ -503,6 +503,7 @@ static dns_rdatasetmethods_t rdataset_methods = {
        NULL,
        NULL,
        rdataset_settrust,
+       NULL,
        NULL
 };
 
index 58cb7bcba8c9cfc9af132c151b2771784dd2acf5..8ef04b2936f814bb8864cc6fec905058bad38c25 100644 (file)
@@ -744,6 +744,7 @@ static void resign_delete(dns_rbtdb_t *rbtdb, rbtdb_version_t *version,
 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,
@@ -760,7 +761,8 @@ static dns_rdatasetmethods_t rdataset_methods = {
        rdataset_setadditional,
        rdataset_putadditional,
        rdataset_settrust,
-       rdataset_expire
+       rdataset_expire,
+       rdataset_clearprefetch
 };
 
 static void rdatasetiter_destroy(dns_rdatasetiter_t **iteratorp);
@@ -8721,6 +8723,19 @@ rdataset_expire(dns_rdataset_t *rdataset) {
                  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
  */
index 63d8b116cf1b824ade5d3a1f57fe790c29a350e8..9dc22f1b69a958743d307ef64a0e5319dc960e74 100644 (file)
@@ -48,6 +48,7 @@ static dns_rdatasetmethods_t methods = {
        NULL,
        NULL,
        NULL,
+       NULL,
        NULL
 };
 
index b7f12aa4ec81685dc91caedf38a4d4e978832aab..43c7b5b5601e4efa32e16f8039c0dfe992455b9d 100644 (file)
@@ -206,6 +206,7 @@ static dns_rdatasetmethods_t question_methods = {
        NULL,
        NULL,
        NULL,
+       NULL,
        NULL
 };
 
@@ -775,6 +776,15 @@ dns_rdataset_expire(dns_rdataset_t *rdataset) {
                (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,
index 9367127d9eaf372bd10f175bdaf58fc57c368880..e29dc8415ac630f160554e2e22dc853d470635c8 100644 (file)
@@ -466,6 +466,7 @@ static dns_rdatasetmethods_t rdataset_methods = {
        NULL,
        NULL,
        NULL,
+       NULL,
        NULL
 };
 
index 5556e2ca93580c2462c9d41011d53a77e0b675cb..40e57e5cfcfbf213f6465e6a127ca154f1d84df1 100644 (file)
@@ -1429,6 +1429,7 @@ static dns_rdatasetmethods_t methods = {
        NULL,
        NULL,
        NULL,
+       NULL,
        NULL
 };
 
index 86a31f5b588eecb049a641fdef45e758264c3347..5cb143b9a36b2a8dd5eae5076bdcb9ecfd41e0a8 100644 (file)
@@ -1481,6 +1481,7 @@ static dns_rdatasetmethods_t rdataset_methods = {
        NULL,
        NULL,
        NULL,
+       NULL,
        NULL
 };
 
index 41c0c9cfda43faf7218b5baffa842199b0635260..57d5bc608de4607224e6be58c770140b83689b77 100644 (file)
@@ -608,6 +608,7 @@ dns_rdataclass_totext
 dns_rdatalist_init
 dns_rdatalist_tordataset
 dns_rdataset_additionaldata
+dns_rdataset_clearprefetch
 dns_rdataset_clone
 dns_rdataset_count
 dns_rdataset_current