* [ruby-core:117216] [Ruby master Bug#20346] FiberScheduler.unblock not called by Thread#join when Thread body contains Ractor.take
@ 2024-03-18 19:06 forthoney (Seong-Heon Jung) via ruby-core
2024-06-18 0:09 ` [ruby-core:118335] " jpcamara (JP Camara) via ruby-core
2025-06-05 21:45 ` [ruby-core:122470] [Ruby " luke-gru (Luke Gruber) via ruby-core
0 siblings, 2 replies; 3+ messages in thread
From: forthoney (Seong-Heon Jung) via ruby-core @ 2024-03-18 19:06 UTC (permalink / raw)
To: ruby-core; +Cc: forthoney (Seong-Heon Jung)
Issue #20346 has been reported by forthoney (Seong-Heon Jung).
----------------------------------------
Bug #20346: FiberScheduler.unblock not called by Thread#join when Thread body contains Ractor.take
https://bugs.ruby-lang.org/issues/20346
* Author: forthoney (Seong-Heon Jung)
* Status: Open
* Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN
----------------------------------------
When using a `Ractor.take` inside a different thread, `Thread#join` on the thread running `Ractor.take` fails to call `FiberScheduler.unblock`. The below code can replicate this behavior
```ruby
require "async"
class RactorWrapper
def initialize
@ractor = Ractor.new do
Ractor.recv # Ractor doesn't start until explicitly told to
# Do some calculations
fib = ->(x) { x < 2 ? 1 : fib.call(x - 1) + fib.call(x - 2) }
fib.call(20)
end
end
def take_async
@ractor.send(nil)
Thread.new { @ractor.take }.join.value
end
end
Async do |task|
10000.times do |i|
task.async do
RactorWrapper.new.take_async
puts i
end
end
end
```
The above code deadlocks, and when we leave a debugging print statement inside of `Async`'s scheduler's `block` and `unblock` method, we can confirm that we only call `Scheduler.block`, and never `Scheduler.unblock`
--
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/
^ permalink raw reply [flat|nested] 3+ messages in thread
* [ruby-core:118335] [Ruby master Bug#20346] FiberScheduler.unblock not called by Thread#join when Thread body contains Ractor.take
2024-03-18 19:06 [ruby-core:117216] [Ruby master Bug#20346] FiberScheduler.unblock not called by Thread#join when Thread body contains Ractor.take forthoney (Seong-Heon Jung) via ruby-core
@ 2024-06-18 0:09 ` jpcamara (JP Camara) via ruby-core
2025-06-05 21:45 ` [ruby-core:122470] [Ruby " luke-gru (Luke Gruber) via ruby-core
1 sibling, 0 replies; 3+ messages in thread
From: jpcamara (JP Camara) via ruby-core @ 2024-06-18 0:09 UTC (permalink / raw)
To: ruby-core; +Cc: jpcamara (JP Camara)
Issue #20346 has been updated by jpcamara (JP Camara).
Looks as though the fiber scheduler is not supported by Ractors right now, due to fixes that need to be implemented in the Ractor API. Not clear if it is expected to be fixed for 3.4 or not.
<img src="https://jpcamara.com/uploads/2024/ractor-api.jpg" width="500" height="436" alt="">
----------------------------------------
Bug #20346: FiberScheduler.unblock not called by Thread#join when Thread body contains Ractor.take
https://bugs.ruby-lang.org/issues/20346#change-108841
* Author: forthoney (Seong-Heon Jung)
* Status: Open
* Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN
----------------------------------------
When using a `Ractor.take` inside a different thread, `Thread#join` on the thread running `Ractor.take` fails to call `FiberScheduler.unblock`. The below code can replicate this behavior
```ruby
require "async"
class RactorWrapper
def initialize
@ractor = Ractor.new do
Ractor.recv # Ractor doesn't start until explicitly told to
# Do some calculations
fib = ->(x) { x < 2 ? 1 : fib.call(x - 1) + fib.call(x - 2) }
fib.call(20)
end
end
def take_async
@ractor.send(nil)
Thread.new { @ractor.take }.join.value
end
end
Async do |task|
10000.times do |i|
task.async do
RactorWrapper.new.take_async
puts i
end
end
end
```
The above code deadlocks, and when we leave a debugging print statement inside of `Async`'s scheduler's `block` and `unblock` method, we can confirm that we only call `Scheduler.block`, and never `Scheduler.unblock`
--
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/
^ permalink raw reply [flat|nested] 3+ messages in thread
* [ruby-core:122470] [Ruby Bug#20346] FiberScheduler.unblock not called by Thread#join when Thread body contains Ractor.take
2024-03-18 19:06 [ruby-core:117216] [Ruby master Bug#20346] FiberScheduler.unblock not called by Thread#join when Thread body contains Ractor.take forthoney (Seong-Heon Jung) via ruby-core
2024-06-18 0:09 ` [ruby-core:118335] " jpcamara (JP Camara) via ruby-core
@ 2025-06-05 21:45 ` luke-gru (Luke Gruber) via ruby-core
1 sibling, 0 replies; 3+ messages in thread
From: luke-gru (Luke Gruber) via ruby-core @ 2025-06-05 21:45 UTC (permalink / raw)
To: ruby-core; +Cc: luke-gru (Luke Gruber)
Issue #20346 has been updated by luke-gru (Luke Gruber).
I created a PR for this: https://github.com/ruby/ruby/pull/13517
----------------------------------------
Bug #20346: FiberScheduler.unblock not called by Thread#join when Thread body contains Ractor.take
https://bugs.ruby-lang.org/issues/20346#change-113658
* Author: forthoney (Seong-Heon Jung)
* Status: Assigned
* Assignee: ractor
* Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN
----------------------------------------
When using a `Ractor.take` inside a different thread, `Thread#join` on the thread running `Ractor.take` fails to call `FiberScheduler.unblock`. The below code can replicate this behavior
```ruby
require "async"
class RactorWrapper
def initialize
@ractor = Ractor.new do
Ractor.recv # Ractor doesn't start until explicitly told to
# Do some calculations
fib = ->(x) { x < 2 ? 1 : fib.call(x - 1) + fib.call(x - 2) }
fib.call(20)
end
end
def take_async
@ractor.send(nil)
Thread.new { @ractor.take }.join.value
end
end
Async do |task|
10000.times do |i|
task.async do
RactorWrapper.new.take_async
puts i
end
end
end
```
The above code deadlocks, and when we leave a debugging print statement inside of `Async`'s scheduler's `block` and `unblock` method, we can confirm that we only call `Scheduler.block`, and never `Scheduler.unblock`
--
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-06-05 21:46 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-03-18 19:06 [ruby-core:117216] [Ruby master Bug#20346] FiberScheduler.unblock not called by Thread#join when Thread body contains Ractor.take forthoney (Seong-Heon Jung) via ruby-core
2024-06-18 0:09 ` [ruby-core:118335] " jpcamara (JP Camara) via ruby-core
2025-06-05 21:45 ` [ruby-core:122470] [Ruby " luke-gru (Luke Gruber) via ruby-core
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).