Hello,
I'm using libunbound to perform iterative DNS lookups for a diagnostic service: github.com/letsdebug/letsdebug .
One of the problems I have is when one or more of a domain's authoritative nameservers are timing out, ub_resolve takes an incredibly long time to give up, something like ~10 minutes when the ub_ctx is configured with these options:
https://github.com/letsdebug/letsdebug/blob/e56f10a5741445645c44a6d6683b9f085f657999/dns_util.go#L84-L116
I've tried to grok the meaning of https://www.unbound.net/documentation/info_timeout.html but I'm not seeing the solution after some weeks of pondering the problem..
Ideally I would like to place a deadline of something like 180 seconds on the ub_resolve operation. I am using a fresh ub_ctx for each lookup, which is done to avoid sharing any resolver state between lookups.
Do you have any further guidance on the ability to restrict ub_resolve's runtime?
Thanks!
Alex
Hi Alex,
Hello,
I'm using libunbound to perform iterative DNS lookups for a diagnostic service: github.com/letsdebug/letsdebug .
One of the problems I have is when one or more of a domain's authoritative nameservers are timing out, ub_resolve takes an incredibly long time to give up, something like ~10 minutes when the ub_ctx is configured with these options:
If a timeout is needed, set a timeout. So the code calling libunbound
sets the timeout it wants. And then cancels or ignores the return value
of the lookup.
For example, use ub_resolve_async(), and then ub_fd(ctx) put that file
descriptor in select or poll, with a timeout that you want to select or
poll. So, sketching code that would look like this:
ub_resolve_async(ctx, name, type, class, 0, funcwhendone, &async_id);
struct pollfd fds[1];
fds[0].fd = ub_fd(ctx);
fds[0].events = POLLIN;
fds[0].revents = 0;
int r = poll(fds, 1, 180 * 1000);
if(r == 0) /* timeout */
else if(r == -1) /* poll has a system error */
else ub_process(ctx); /* calls funcwhendone */
At timeout you could call ub_cancel(ctx, async_id) or just ignore the
result when funcwhendone gets called (eventually). Or delete the
context, you say you only use it once, this also removes that callback.
Best regards, Wouter
Thanks Wouter, that very helpful.