Project

General

Profile

Actions

Bug #18911

closed

Process._fork hook point is not called when Process.daemon is used

Added by ivoanjo (Ivo Anjo) almost 2 years ago. Updated 7 months ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin20]
[ruby-core:109196]

Description

Hello there! I'm working at Datadog on the ddtrace gem, 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:

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 :)

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0