int need_vc;
struct timeval start_t;
-
struct timeval sent_t;
+ struct timeval queue_t;
dlink_node lru;
IDNSCB *callback;
void *callback_data;
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());
}
nameservers[ns].nqueries++;
+ q->queue_t = current_time;
dlinkAdd(q, &q->lru, &lru_list);
idnsTickleQueue();
}
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 = static_cast<idns_query*>(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);