Issue #17664 has been updated by eviljoel (evil joel).
@ioquatix, thank you for your reply.
The sockets are created in Ruby. I'm interacting with OpenSSL via FFI, so that part is
also largely in Ruby.
Since I commented yesterday, I fixed the code to work with Ruby 3. I changed all relevant
calls to OpenSSL to behave in a non-blocking manner leveraging IO.select. It really
wasn't as difficult as I expected.
Thanks again.
----------------------------------------
Bug #17664: Behavior of sockets changed in Ruby 3.0 to non-blocking
https://bugs.ruby-lang.org/issues/17664#change-101588
* Author: ciconia (Sharon Rosner)
* Status: Assigned
* Priority: Normal
* Assignee: ioquatix (Samuel Williams)
* ruby -v: 3.0.0
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN
----------------------------------------
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](https://github.com/ruby/ruby/blame/78f188524f551c97b1a7a44ae1351….
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](https://github.com/digital-fabric/polyphony/blob/d3c9cf3ddc1f41438…
is to make sure `O_NONBLOCK` is not set before attempting I/O operations on any fd.
--
https://bugs.ruby-lang.org/