]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Import from bugzilla
authorAmos Jeffries <squid3@treenet.co.nz>
Sun, 28 Sep 2008 10:00:08 +0000 (22:00 +1200)
committerAmos Jeffries <squid3@treenet.co.nz>
Sun, 28 Sep 2008 10:00:08 +0000 (22:00 +1200)
src/dns_internal.cc

index f3b8d2403b0fe6523ce7bcfce9ec512660841236..76dd0e7e533d89b753782c9d4f70cbea48677c29 100644 (file)
@@ -105,8 +105,8 @@ struct _idns_query
     int need_vc;
 
     struct timeval start_t;
-
     struct timeval sent_t;
+    struct timeval queue_t;
     dlink_node lru;
     IDNSCB *callback;
     void *callback_data;
@@ -823,7 +823,7 @@ idnsSendQuery(idns_query * q)
 
         q->nsends++;
 
-        q->sent_t = current_time;
+        q->queue_t = q->sent_t = current_time;
 
         if (x < 0)
             debugs(50, 1, "idnsSendQuery: FD " << DnsSocket << ": sendto: " << xstrerror());
@@ -1197,19 +1197,28 @@ idnsCheckQueue(void *unused)
     idns_query *q;
     event_queued = 0;
 
+    if (0 == nns)
+        /* name servers went away; reconfiguring or shutting down */
+        return;
+
     for (n = lru_list.tail; n; n = p) {
-        if (0 == nns)
-            /* name servers went away; reconfiguring or shutting down */
-            break;
 
-        q = (idns_query *)n->data;
+        p = n->prev;
+        q = n->data;
 
-        if (tvSubDsec(q->sent_t, current_time) < Config.Timeout.idns_retransmit * (1 << (q->nsends - 1) % nns))
-            break;
+        /* Anything to process in the queue? */
+        if (tvSubDsec(q->queue_t, current_time) < Config.Timeout.idns_retransmit )
+           break;
 
-        debugs(78, 3, "idnsCheckQueue: ID 0x" << std::hex << std::setfill('0') << std::setw(4) << q->id << "timeout" );
+        /* Query timer expired? */
+        if (tvSubDsec(q->sent_t, current_time) < Config.Timeout.idns_retransmit * 1 << ((q->nsends - 1) / nns)) {
+            dlinkDelete(&q->lru, &lru_list);
+            q->queue_t = current_time;
+            dlinkAdd(q, &q->lru, &lru_list);
+            continue;
+        }
 
-        p = n->prev;
+        debugs(78, 3, "idnsCheckQueue: ID 0x" << std::hex << std::setfill('0') << std::setw(4) << q->id << "timeout" );
 
         dlinkDelete(&q->lru, &lru_list);