Allow IO#close to interrupt IO operations on fibers using fiber_interrupt hook.#12839
Conversation
❌ Tests Failed✖️no tests failed ✔️61866 tests passed(1 flake) |
ee34fe8 to
56d24c9
Compare
|
For what it's worth this patch makes sense and LGTM, but I have no experience using the fiber scheduler and this needs another reviewer. But thank you for making the changes I suggested 😄 |
IO#close to interrupt IO operations on fibers using fiber_interrupt hook.
4836882 to
b69bafb
Compare
cb63a82 to
5694eb1
Compare
5694eb1 to
0c48c46
Compare
There was a problem hiding this comment.
Pull Request Overview
This PR introduces a new C function to perform interruptible IO operations in the fiber scheduler, allowing IO#close to interrupt fibers and raise an IOError during blocking operations. Key changes include the implementation of rb_thread_io_blocking_operation with its ensure routine, integration of a new Fiber::Scheduler#fiber_interrupt hook for interrupting fibers, and updated IO buffering and scheduler functions to use the new interruptible operations.
Reviewed Changes
Copilot reviewed 7 out of 7 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| thread.c | Added new functions for interruptible IO operations and modified return type conversion in IO close. |
| test/fiber/scheduler.rb | Added exception handling for IO.select and introduced FiberInterrupt and fiber_interrupt functions. |
| scheduler.c | Added new scheduler methods that wrap IO methods with the new interruptible blocking operation. |
| io_buffer.c | Updated read/write/pwrite functions to correctly resolve IO instances before performing operations. |
| internal/thread.h | Declared the new rb_thread_io_blocking_operation function along with updated comments. |
| include/ruby/fiber/scheduler.h | Updated documentation for the new fiber_interrupt API. |
| NEWS.md | Documented the addition of Fiber::Scheduler#fiber_interrupt for better developer visibility. |
42b1f72 to
2239ea0
Compare
411f214 to
9a1a3ce
Compare
9a1a3ce to
872afdd
Compare
|
Benchmark results: |
Ruby's
IO#closecan causeIO#read,IO#write,IO#wait,IO#wait_readableandIO#wait_writableto be interrupted with an IOError (stream closed on another thread).The fiber scheduler did not implement this for
io_read,io_writeandio_waithooks. Finally after several years, someone made a bug report - see socketry/async#368 for background. In order to solve this problem for the fiber scheduler, we need to expose the ability forIO#closeto interrupt a fiber.This PR introduces a new internal C function
rb_thread_io_blocking_operationwhich takes an IO instance and a callback. During that callback, if the IO is closed, the callback will be interrupted.It also introduces a new fiber scheduler method,
fiber_interruptwhich allows us to interrupt a specific fiber with an error, in this case with anIOError.https://bugs.ruby-lang.org/issues/21166