[ruby-core:102776] [Ruby master Bug#17678] Ractors do not restart after fork
From:
knuckles@...
Date:
2021-03-08 16:19:46 UTC
List:
ruby-core #102776
Issue #17678 has been reported by ivoanjo (Ivo Anjo).
----------------------------------------
Bug #17678: Ractors do not restart after fork
https://bugs.ruby-lang.org/issues/17678
* Author: ivoanjo (Ivo Anjo)
* Status: Open
* Priority: Normal
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN
----------------------------------------
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]`
```ruby
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
1. Auto-restart Ractors after fork
2. Add additional methods to Ractors that allow users to check & manage the status of the Ractor, similar to Thread.
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>