req->state = RDNS_REQUEST_REPLIED;
req->func (rep, req->arg);
REF_RELEASE (req);
+
+ return;
}
/* Select random IO channel */
renew = true;
}
+ /*
+ * Note: when `renew` is true, then send_request deals with the
+ * timers and events itself
+ */
r = rdns_send_request (req, req->io->sock, renew);
if (r == 0) {
/* Retransmit one more time */
- req->async->del_timer (req->async->data,
+ if (!renew) {
+ req->async->del_timer (req->async->data,
req->async_event);
- req->async_event = req->async->add_write (req->async->data,
- req->io->sock, req);
+ req->async_event = req->async->add_write (req->async->data,
+ req->io->sock, req);
+ }
+
req->state = RDNS_REQUEST_WAIT_SEND;
}
else if (r == -1) {
UPSTREAM_FAIL (req->io->srv, time (NULL));
}
+ if (!renew) {
+ req->async->del_timer (req->async->data,
+ req->async_event);
+ }
+
/* We have not scheduled timeout actually due to send error */
rep = rdns_make_reply (req, RDNS_RC_NETERR);
req->state = RDNS_REQUEST_REPLIED;