Project

General

Profile

Feature #16476

Updated by kirs (Kir Shatrov) over 1 year ago

It seems like the blocking syscall done by `Socket.getaddrinfo` blocks Ruby VM in a way that Timeout.timeout has no effect. 
 See reproduction steps in getaddrinfo_interrupt.rb attached. This affects all modern Ruby versions, including the latest 2.7.0. 

 Combined with default 10s resolv timeout on many Linux systems, this can have a very noticeable effect on production Ruby apps being not resilient to slow DNS resolutions, and being unable to fail fast even with `Timeout.timeout`. 

 While https://bugs.ruby-lang.org/issues/15553 improves the situation for `Addrinfo.getaddrinfo`, situation, `Socket.getaddrinfo` is still blocking the VM and Timeout has no effect. 

 I'd like to discuss what could be done to make that call non-blocking for threads in Ruby VM.

Back