Behavior of sockets changed in Ruby 3.0 to non-blocking
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 jeremyevans0 (Jeremy Evans) about 1 month 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.