Bug #21506
openFix timeout in `Addrinfo.getaddrinfo` to actually take effect
Description
Description¶
This change fixes an issue where the timeout option in Addrinfo.getaddrinfo
was not functioning as expected.
https://github.com/ruby/ruby/pull/13803/files
It also addresses a related issue where specifying fast_fallback: false
with resolv_timeout
for Socket.tcp
andTCPSocket.new
would have no effect.
Background¶
The timeout option was originally introduced in:
https://github.com/ruby/ruby/commit/6382f5cc91ac9e36776bc854632d9a1237250da7
However, the value was noy used in current implementation:
https://github.com/ruby/ruby/blob/3f0e0d5c8bf9046aee7f262a3f9a7524d51aaf3e/ext/socket/raddrinfo.c#L1285
Therefore, even if a timeout is specified and the duration elapses during name resolution, nothing happens. This is clearly not the intended behavior.
What this change does¶
Addrinfo.getaddrinfo
has been made interruptible as of Feature #19965.
This change uses that feature to interrupt name resolution when the specified timeout period elapses, raising a user-specified timeout error.
The timeout can be specified in milliseconds.
Notes¶
The same issue affects Socket.tcp
and TCPSocket.new
when resolv_timeout
is set along with fast_fallback: false
.
resolv_timeout
was introduced in the following commits:
https://github.com/ruby/ruby/commit/6382f5cc91ac9e36776bc854632d9a1237250da7
https://github.com/ruby/ruby/commit/511fe23fa2bdf1f17faa91e0558be47b5bb62b2a
The reason is that with fast_fallback: false
, these methods internally call the same rsock_getaddrinfo()
as Addrinfo.getaddrinfo
.
This change addresses that as well.
No data to display