Bug #17664


Behavior of sockets changed in Ruby 3.0 to non-blocking

Added by ciconia (Sharon Rosner) 4 months ago. Updated 4 months ago.

Target version:


I'm not sure this is a bug, but apparently a change was introduced in Ruby 3.0 that makes sockets non-blocking by default. This change was apparently introduced as part of the work on the FiberScheduler interface. This change of behaviour is not discussed in the Ruby 3.0.0 release notes.

This change complicates the implementation of an io_uring-based fiber scheduler, since io_uring SQE's on fd's with O_NONBLOCK can return EAGAIN just like normal syscalls. Using io_uring with non-blocking fd's defeats the whole purpose of using io_uring in the first place.

A workaround I have put in place in the Polyphony io_uring backend is to make sure O_NONBLOCK is not set before attempting I/O operations on any fd.

Updated by xtkoba (Tee KOBAYASHI) 4 months ago

Is this issue related to #17607 and/or #15356 ?

Updated by jeremyevans0 (Jeremy Evans) 4 months ago

  • Assignee set to ioquatix (Samuel Williams)
  • Status changed from Open to Assigned

I believe this is expected, even if not mentioned in the release notes. I think the Ruby-level API remains the same, but passing the underlying file descriptors to C functions can see changed behavior. Assigning to ioquatix (Samuel Williams) to confirm this is expected.


Also available in: Atom PDF