Skip to content

Commit

Permalink
Detach bisect process to avoid making zombie process
Browse files Browse the repository at this point in the history
If we do not `waitpid` or `detach` the bisect process become a zombie
process.

As mentionned in waitpid doc:
> As long as a zombie is not removed from the system via a wait, it will consume a slot in the kernel process table, and if this table fills, it will not be possible to create further processes.

`detach` is a good idea. From the Ruby doc:
> Some operating systems retain the status of terminated child processes until the parent collects that status (normally using some variant of wait()). If the parent never collects this status, the child stays around as a zombie process. Process::detach prevents this by setting up a separate Ruby thread whose sole job is to reap the status of the process pid when it terminates. Use detach only when you do not intend to explicitly wait for the child to terminate.

Related:
- #2669
- https://andrykonchin.github.io/rails/2019/12/25/deadlock-in-rspec.html
  • Loading branch information
benoittgt authored and JonRowe committed Jun 29, 2020
1 parent 77455dd commit e3ce6cf
Showing 1 changed file with 5 additions and 2 deletions.
7 changes: 5 additions & 2 deletions lib/rspec/core/bisect/fork_runner.rb
Expand Up @@ -91,9 +91,12 @@ def initialize(runner, channel)
end

def dispatch_specs(run_descriptor)
fork { run_specs(run_descriptor) }
pid = fork { run_specs(run_descriptor) }
# We don't use Process.waitpid here as it was causing bisects to
# block due to the file descriptor limit on OSX / Linux.
# block due to the file descriptor limit on OSX / Linux. We need
# to detach the process to avoid having zombie process and consume
# slot in the kernel process table.
Process.detach(pid)
end

private
Expand Down

0 comments on commit e3ce6cf

Please sign in to comment.