]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: dns: Delay the attempt to run a DNS resolution on check failure.
authorOlivier Houchard <ohouchard@haproxy.com>
Tue, 22 May 2018 16:40:07 +0000 (18:40 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 23 May 2018 14:57:15 +0000 (16:57 +0200)
When checks fail, the code tries to run a dns resolution, in case the IP
changed.
The old way of doing that was to check, in case the last dns resolution
hadn't expired yet, if there were an applicable IP, which should be useless,
because it has already be done when the resolution was first done, or to
run a new resolution.
Both are a locking nightmare, and lead to deadlocks, so instead, just wake the
resolvers task, that should do the trick.

This should be backported to 1.8.

src/dns.c

index 385ecbb6dd06fea45dfec7bfc920a040caad2c26..9984e2c31e73c5e4388a015fd553d9409c84b413 100644 (file)
--- a/src/dns.c
+++ b/src/dns.c
@@ -348,11 +348,9 @@ void dns_trigger_resolution(struct dns_requester *req)
        /* The resolution must not be triggered yet. Use the cached response, if
         * valid */
        exp = tick_add(res->last_resolution, resolvers->hold.valid);
-       if (res->status == RSLV_STATUS_VALID &&
-           tick_isset(res->last_resolution) && !tick_is_expired(exp, now_ms))
-               req->requester_cb(req, NULL);
-       else
-               dns_run_resolution(res);
+       if (resolvers->t && (res->status != RSLV_STATUS_VALID ||
+           !tick_isset(res->last_resolution) || tick_is_expired(exp, now_ms)))
+               task_wakeup(resolvers->t, TASK_WOKEN_OTHER);
 }