> https://github.com/curl/curl/blob/f03cc1b7a693b03eddfed2b4c7f8b5fcba9a22e5/lib/asyn-ares.c#L789

Ahh! I was looking into 7.66. curl code, so now I see how ares_getaddrinfo() is 
used.

> c-ares details need to be taken to that mailing list.

Yes, I agree that most of this discussion belongs to c-ares mailing list.
But the question remains whether libcurl should always rely on a default DNS 
timeout set by c-ares, whatever it is, instead of explicitly setting the "curl" 
one?

The concern is that different c-ares versions may have different default 
timeouts which can create inconsistent behavior and the snippet:

/* How long we are willing to wait for additional parallel responses after
   obtaining a "definitive" one.

   This is intended to equal the c-ares default timeout.  cURL always uses that
   default value.  Unfortunately, c-ares doesn't expose its default timeout in
   its API, but it is officially documented as 5 seconds.

   See query_completed_cb() for an explanation of how this is used.
 */
#define HAPPY_EYEBALLS_DNS_TIMEOUT 5000

makes tight coupling libcurl with c-ares default timeout.


Don't you think that it would be better to break this dependency and have 
something like:

#define DEFAULT_DNS_TIMEOUT 2000 // i.e. 2 seconds
...
#define HAPPY_EYEBALLS_DNS_TIMEOUT DEFAULT_DNS_TIMEOUT
...
Curl_resolver_init() {
...
      int optmask = ARES_OPT_SOCK_STATE_CB | ARES_OPT_TIMEOUTMS;
      ...
      options.timeout = DEFAULT_DNS_TIMEOUT;
      ...
}

This simple change will make libcurl DNS timeout consistent regardless if the 
default timeout changes in c-ares.

Thanks,
Dmitry Karpov


-----Original Message-----
From: Daniel Stenberg <dan...@haxx.se> 
Sent: Monday, December 13, 2021 11:37 PM
To: Dmitry Karpov <dkar...@roku.com>
Cc: Dmitry Karpov via curl-library <curl-library@lists.haxx.se>
Subject: RE: Question about DNS timeout in libCurl

On Mon, 13 Dec 2021, Dmitry Karpov wrote:

> Somehow, I didn't find ares_getaddrinfo() in libcurl code, so you 
> probably meant ares_gethostbyname() used by 
> Curl_resolver_getaddrinfo() in lib\asyn-ares.c, right?

Line 789:

https://github.com/curl/curl/blob/f03cc1b7a693b03eddfed2b4c7f8b5fcba9a22e5/lib/asyn-ares.c#L789

> my concern was that if we lowered it in c-ares, then it would not be 
> aligned with the default 5s value expected from the resolv.conf on 
> Linux systems anymore, which might be not a default behavior expected 
> from a general-purpose resolver library.

That's a discussion for the c-ares mailing list! My personal view is that 
c-ares isn't bound to that timeout value.

> But on the other hand, libcurl doesn't have to follow exactly the 
> resolver library constraints (if it is agreed that having 5s default 
> in c-ares to match the default value from resolv.conf is a must ), and 
> it can use its own default DNS resolver value, which may be lower than 
> the c-ares default value.

I think you can drop this line of thinking, switch to ares_getaddrinfo() and 
then if there are remaining timeout issues, they will be entirely in the c-ares 
camp.

If you insist on doing c-ares the old way, I agree that we can lower the 
timeout.

> If it is agreed that changing the c-ares default timeout from 5s to 
> some lower value and thus breaking its connection with the default 
> value implied by resolv.conf is not a problem, then it is the best 
> plan. Especially, if things can be done in parallel, which is very 
> important for dual-stack and Happy Eyeballs.

c-ares details need to be taken to that mailing list.

-- 

  / daniel.haxx.se
  | Commercial curl support up to 24x7 is available!
  | Private help, bug fixes, support, ports, new features
  | https://curl.se/support.html
-- 
Unsubscribe: https://lists.haxx.se/listinfo/curl-library
Etiquette:   https://curl.haxx.se/mail/etiquette.html

Reply via email to