Feature #14430
opennet/http: use Socket.tcp with connect_timeout, instead of TCPSocket.open wrapped in Timeout.timeout
Description
Instead of using TCPSocket.open, wrapped in Timeout.timeout, that will create a temporary thread. By using Socket.tcp with the connect_timeout argument for open_timeout the connection opening is much more efficient as the kernels timeout is used instead.
Updated by normalperson (Eric Wong) almost 7 years ago
carl.hoerberg@gmail.com wrote:
Instead of using TCPSocket.open, wrapped in Timeout.timeout,
that will create a temporary thread. By using Socket.tcp with
the connect_timeout argument for open_timeout the connection
opening is much more efficient as the kernels timeout is used
instead.
Unfortunately, we can't do this, yet. The Addrinfo calls use
getaddrinfo(3) which doesn't support timeout natively.
My goals for later this year is:
-
implement Timeout in the VM itself so it doesn't need to create
a temporary thread. -
update resolv-replace.rb to cover Addrinfo cases, including
nscd cache lookup for glibc compatibility.
Updated by shevegen (Robert A. Heiler) almost 7 years ago
implement Timeout in the VM itself so it doesn't need
to create a temporary thread.
There be dragons hiding in the VM.
\o/
Updated by carl.hoerberg (Carl Hörberg) almost 7 years ago
normalperson (Eric Wong) wrote:
Unfortunately, we can't do this, yet. The Addrinfo calls use
getaddrinfo(3) which doesn't support timeout natively.
Right, good catch.
- update resolv-replace.rb to cover Addrinfo cases, including
nscd cache lookup for glibc compatibility.
Looking into this i realize that /etc/nsswitch.conf has be to taken into account first. And then maybe nscd, but very few distros (if any?) install it by default anymore, and it generally seems to have a very bad rep "around the internets".
But which one do you suggest? Go down the route of Socket.tcp, but make the DNS resolving interruptible/async (without doing it in a separate threads) or to implement thread-less timeout in the VM and continue to rely on getinfoaddr from glibc?
Updated by Glass_saga (Masaki Matsushita) almost 6 years ago
- Related to Feature #15553: Addrinfo.getaddrinfo supports timeout added
Updated by byroot (Jean Boussier) about 5 years ago
We've been recently bitten by this.
Does the merge of [#15553] makes https://github.com/ruby/ruby/pull/1806 functional?
Updated by carl.hoerberg (Carl Hörberg) almost 4 years ago
The PR is updated, based on master and adds Net::HTTP#resolve_timeout, which delegates to Socket.tcp resolve_timeout, based on https://bugs.ruby-lang.org/issues/16381 but reraiseing Errno::ETIMEOUT as Net::OpenTimeout