chiark / gitweb /
resolved: when sending fails, don't try connecting to the next DNS server if we actua...
[elogind.git] / src / resolve / resolved-dns-transaction.c
index 48da432a1200f94fb2b6105801e790aa24eaae8d..ad1b277555254a4b92efff9520cda20a4750235d 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!");
@@ -518,6 +523,11 @@ int dns_transaction_go(DnsTransaction *t) {
                 return 0;
         }
         if (r < 0) {
+                if (t->scope->protocol != DNS_PROTOCOL_DNS) {
+                        dns_transaction_complete(t, DNS_TRANSACTION_RESOURCES);
+                        return 0;
+                }
+
                 /* Couldn't send? Try immediately again, with a new server */
                 dns_scope_next_dns_server(t->scope);