chiark / gitweb /
resolved: bypass local cache when we issue a transaction for verification purposes
authorLennart Poettering <lennart@poettering.net>
Mon, 4 Aug 2014 23:42:15 +0000 (01:42 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 4 Aug 2014 23:52:24 +0000 (01:52 +0200)
src/resolve/resolved-dns-transaction.c

index 48da432a1200f94fb2b6105801e790aa24eaae8d..83933c6502d59c60f44dfc1bc389ab470aa659c2 100644 (file)
@@ -465,24 +465,29 @@ int dns_transaction_go(DnsTransaction *t) {
         t->cached = dns_answer_unref(t->cached);
         t->cached_rcode = 0;
 
-        /* Before trying the cache, let's make sure we figured out a
-         * server to use. Should this cause a change of server this
-         * might flush the cache. */
-        dns_scope_get_dns_server(t->scope);
+        /* Check the cache, but only if this transaction is not used
+         * for probing or verifying a zone item. */
+        if (set_isempty(t->zone_items)) {
 
-        /* Let's then prune all outdated entries */
-        dns_cache_prune(&t->scope->cache);
+                /* Before trying the cache, let's make sure we figured out a
+                 * server to use. Should this cause a change of server this
+                 * might flush the cache. */
+                dns_scope_get_dns_server(t->scope);
 
-        r = dns_cache_lookup(&t->scope->cache, t->question, &t->cached_rcode, &t->cached);
-        if (r < 0)
-                return r;
-        if (r > 0) {
-                log_debug("Cache hit!");
-                if (t->cached_rcode == DNS_RCODE_SUCCESS)
-                        dns_transaction_complete(t, DNS_TRANSACTION_SUCCESS);
-                else
-                        dns_transaction_complete(t, DNS_TRANSACTION_FAILURE);
-                return 0;
+                /* Let's then prune all outdated entries */
+                dns_cache_prune(&t->scope->cache);
+
+                r = dns_cache_lookup(&t->scope->cache, t->question, &t->cached_rcode, &t->cached);
+                if (r < 0)
+                        return r;
+                if (r > 0) {
+                        log_debug("Cache hit!");
+                        if (t->cached_rcode == DNS_RCODE_SUCCESS)
+                                dns_transaction_complete(t, DNS_TRANSACTION_SUCCESS);
+                        else
+                                dns_transaction_complete(t, DNS_TRANSACTION_FAILURE);
+                        return 0;
+                }
         }
 
         log_debug("Cache miss!");