ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
* [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).