[#109207] [Ruby master Feature#18915] New error class: NotImplementedYetError or scope change for NotImplementedYet — Quintasan <noreply@...>
Issue #18915 has been reported by Quintasan (Michał Zając).
18 messages
2022/07/14
[ruby-core:109199] [Ruby master Bug#18911] Process._fork hook point is not called when Process.daemon is used
From:
"mame (Yusuke Endoh)" <noreply@...>
Date:
2022-07-14 01:07:27 UTC
List:
ruby-core #109199
Issue #18911 has been updated by mame (Yusuke Endoh).
@ivoanjo Do you have difficulties due to this behavior in terms of ddtrace? Or you were just "surprised"? The motivation is very important to discuss the issue. `Process.daemon` stops threads, so I guess you have any difficulties, but I'd like to confirm it before the dev meeting.
----------------------------------------
Bug #18911: Process._fork hook point is not called when Process.daemon is used
https://bugs.ruby-lang.org/issues/18911#change-98338
* Author: ivoanjo (Ivo Anjo)
* Status: Open
* Priority: Normal
* Assignee: akr (Akira Tanaka)
* ruby -v: ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin20]
* Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN
----------------------------------------
Hello there! I'm working at Datadog [on the `ddtrace` gem](https://github.com/DataDog/dd-trace-rb), and we need to hook into fork operations to make sure that our products work correctly/automatically even in environments that fork.
As part as #17795 a new `Process._fork` method was added to allow libraries and frameworks to easily hook into fork operations. I was investigating its use in `ddtrace` and noticed the following gap: the `Process.daemon` API internally makes use of `fork`, but the new hook point is not called for that API.
Testcase:
```ruby
puts RUBY_DESCRIPTION
module ForkHook
def _fork(*args)
puts " #{Process.pid} Before fork!"
res = super
puts " #{Process.pid} After fork!"
res
end
end
Process.singleton_class.prepend(ForkHook)
puts "#{Process.pid} Regular fork:"
fork { exit }
Process.wait
puts "#{Process.pid} Process.daemon:"
Process.daemon(nil, true)
puts "#{Process.pid} Finishing!"
```
Testcase output:
```
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin20]
48136 Regular fork: # <-- original process
48136 Before fork!
48136 After fork! # <-- original process
48137 After fork! # <-- child process
48136 Process.daemon: # <-- original process
48139 Finishing! # <-- forks and pid changes, but the hook isn't called
```
This was surprising to me since the advantage of this hook point would not not needing to hook into the many other places where `fork` can get called from.
Thanks a lot :)
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:[email protected]?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>