Bug #17678
openRactors do not restart after fork
Description
Hello there! I'm working at Datadog on the ddtrace
gem -- https://github.com/DataDog/dd-trace-rb and we're experimenting with using Ractors in our library but run into a few issues.
Background¶
When running a Ractor as a background process, the Ractor stops & does not restart when the application forks.
How to reproduce (Ruby version & script)¶
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]
r2 = Ractor.new do
loop { puts "[#{Process.pid}] Ractor"; sleep(1) }
end
sleep(1)
puts "[#{Process.pid}] Forking..."
fork do
sleep(5)
puts "[#{Process.pid}] End fork."
end
loop do
sleep(1)
end
Expectation and result¶
The application prints “Ractor” each second in the main process, but not in the fork.
Expected the Ractor (defined as r2
) to run in the fork.
[29] Ractor
[29] Ractor
[29] Forking...
[29] Ractor
[29] Ractor
[29] Ractor
[29] Ractor
[29] Ractor
[32] End fork.
[29] Ractor
[29] Ractor
[29] Ractor
Additional notes¶
Threads do not restart across forks either, so it might not be unreasonable to expect consistent behavior. However, it’s possible to detect a dead Thread and recreate it after a fork (e.g. with #alive?
, #status
), but there’s no such mechanism for Ractors.
Suggested solutions¶
- Auto-restart Ractors after fork
- Add additional methods to Ractors that allow users to check & manage the status of the Ractor, similar to Thread.