From: "mame (Yusuke Endoh)" Date: 2022-07-21T13:36:16+00:00 Subject: [ruby-core:109286] [Ruby master Bug#18911] Process._fork hook point is not called when Process.daemon is used Issue #18911 has been updated by mame (Yusuke Endoh). > ...would it be reasonable to add a "Note: Process#daemon is similar to fork, but does not go through this method." or something similar? Let's go with this! Could you please send a PR? --- At the dev meeting, I briefly talked with @akr about this issue. A main motivation of `Process._fork` discussed in #17795 was to disconnect the database connections before fork. This was to prevent corrupted communication if the parent and child processes accessed the database connection in parallel after fork. `Process.daemon` uses fork(2) but does not cause this problem because the parent process exits immediately after fork. Thus, for those who override `Process._fork` for the original purpose, it would be more natural for `Process._fork` not to be invoked in `Process.daemon`. Unfortunately, this design does not fit with your use case to restart a monitoring thread after fork. ivoanjo (Ivo Anjo) wrote in #note-4: > Yeah, it surprised me because it was a situation where there's a fork (albeit indirectly) and threads die, so I needed to do cleanups/restart stuff, but was not covered by the `_fork`. Just FYI, according to @akr, some OSes supports daemon(3) more directly; daemon(3) does not use "double fork" hack internally on a such OS. ---------------------------------------- Bug #18911: Process._fork hook point is not called when Process.daemon is used https://bugs.ruby-lang.org/issues/18911#change-98417 * 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: