evdns: disable probing with EVDNS_BASE_DISABLE_WHEN_INACTIVE
authorAzat Khuzhin <a3at.mail@gmail.com>
Fri, 21 Mar 2014 13:04:58 +0000 (17:04 +0400)
committerAzat Khuzhin <a3at.mail@gmail.com>
Wed, 9 Apr 2014 15:02:39 +0000 (19:02 +0400)
When user install EVDNS_BASE_DISABLE_WHEN_INACTIVE flag for evdns base,
we must remove the timer that is used for probing, if current dns server
failed, otherwise it won't break the loop.

evdns.c

diff --git a/evdns.c b/evdns.c
index 66a3bff3b8b3fb0f38d662db85384b0f91a06b6c..b196229b49eea3e9b8b1ac7a03e7dee7c71954af 100644 (file)
--- a/evdns.c
+++ b/evdns.c
@@ -662,6 +662,7 @@ request_finished(struct request *const req, struct request **head, int free_hand
            req->ns->requests_inflight == 0 &&
            req->base->disable_when_inactive) {
                event_del(&req->ns->event);
+               evtimer_del(&req->ns->timeout_event);
        }
 
        if (!req->request_appended) {
@@ -2198,9 +2199,10 @@ evdns_request_transmit_to(struct request *req, struct nameserver *server) {
        ASSERT_VALID_REQUEST(req);
 
        if (server->requests_inflight == 1 &&
-               req->base->disable_when_inactive &&
-               event_add(&server->event, NULL) < 0) {
-               return 1;
+               req->base->disable_when_inactive) {
+               if (event_add(&server->event, NULL) < 0 ||
+                       evtimer_add(&req->ns->timeout_event, &req->base->global_nameserver_probe_initial_timeout) < 0)
+                       return 1;
        }
 
        r = sendto(server->socket, (void*)req->request, req->request_len, 0,