chiark / gitweb /
resolve: add more record types and convert to gperf table
[elogind.git] / src / resolve / resolved-dns-transaction.c
index 92f7e4c5b1f118fbbd8bfe14385c8a0fe81e9184..48da432a1200f94fb2b6105801e790aa24eaae8d 100644 (file)
@@ -465,12 +465,19 @@ int dns_transaction_go(DnsTransaction *t) {
         t->cached = dns_answer_unref(t->cached);
         t->cached_rcode = 0;
 
-        /* First, let's try the 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);
+
+        /* 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
@@ -478,6 +485,8 @@ int dns_transaction_go(DnsTransaction *t) {
                 return 0;
         }
 
+        log_debug("Cache miss!");
+
         /* Otherwise, we need to ask the network */
         r = dns_transaction_make_packet(t);
         if (r == -EDOM) {
@@ -515,7 +524,12 @@ int dns_transaction_go(DnsTransaction *t) {
                 return dns_transaction_go(t);
         }
 
-        r = sd_event_add_time(t->scope->manager->event, &t->timeout_event_source, CLOCK_MONOTONIC, now(CLOCK_MONOTONIC) + TRANSACTION_TIMEOUT_USEC(t->scope->protocol), 0, on_transaction_timeout, t);
+        r = sd_event_add_time(
+                        t->scope->manager->event,
+                        &t->timeout_event_source,
+                        clock_boottime_or_monotonic(),
+                        now(clock_boottime_or_monotonic()) + TRANSACTION_TIMEOUT_USEC(t->scope->protocol), 0,
+                        on_transaction_timeout, t);
         if (r < 0)
                 return r;