Project

General

Profile

Actions

Bug #20346

open

FiberScheduler.unblock not called by Thread#join when Thread body contains Ractor.take

Added by forthoney (Seong-Heon Jung) 9 months ago. Updated 6 months ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:117216]

Description

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

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

Updated by jpcamara (JP Camara) 6 months ago

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.

Actions

Also available in: Atom PDF

Like1
Like0