[Bug 271490] Deadlock between _rtld_atfork_pre and _thr_attr_init
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 271490] Deadlock between _rtld_atfork_pre and _thr_attr_init"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 271490] Deadlock between _rtld_atfork_pre and _thr_attr_init"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 271490] Deadlock between _rtld_atfork_pre and _thr_attr_init"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 271490] Deadlock between _rtld_atfork_pre and _thr_attr_init"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 271490] Deadlock between _rtld_atfork_pre and _thr_attr_init"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 271490] Deadlock between _rtld_atfork_pre and _thr_attr_init"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 271490] Deadlock between _rtld_atfork_pre and _thr_attr_init"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 271490] Deadlock between _rtld_atfork_pre and _thr_attr_init"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 271490] Deadlock between _rtld_atfork_pre and _thr_attr_init"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 271490] Deadlock between _rtld_atfork_pre and _thr_attr_init"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 271490] Deadlock between _rtld_atfork_pre and _thr_attr_init"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 271490] Deadlock between _rtld_atfork_pre and _thr_attr_init"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 271490] Deadlock between _rtld_atfork_pre and _thr_attr_init"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 271490] Deadlock between _rtld_atfork_pre and _thr_attr_init"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 271490] Deadlock between _rtld_atfork_pre and _thr_attr_init"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 271490] Deadlock between _rtld_atfork_pre and _thr_attr_init"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 271490] Deadlock between _rtld_atfork_pre and _thr_attr_init"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 271490] Deadlock between _rtld_atfork_pre and _thr_attr_init"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 18 May 2023 13:22:04 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=271490 Bug ID: 271490 Summary: Deadlock between _rtld_atfork_pre and _thr_attr_init Product: Base System Version: 13.2-RELEASE Hardware: amd64 OS: Any Status: New Severity: Affects Some People Priority: --- Component: threads Assignee: threads@FreeBSD.org Reporter: kj@kjtsanaktsidis.id.au Created attachment 242250 --> https://bugs.freebsd.org/bugzilla/attachment.cgi?id=242250&action=edit GDB output from my stuck process I'm working on fixing some test failures in Ruby on FreeBSD, and I've found what I think is a deadlock in FreeBSD between two threads, one of which is forking and one of which is just starting. The Ruby test which does this looks something like the following: ``` require 'timeout' def test_daemon_no_threads data = Timeout.timeout(3) do IO.popen("-") do |f| break f.readlines.map(&:chomp) if f th = Thread.start { sleep 3 } Process.daemon(true, true) puts "this is sometimes never reached!" end end end ``` The test forks, and then in the child, starts a thread and then forks again (via a call to daemon(3)). On my machine, this will semi-reliably produce a deadlock inside the call to `Process.daemon` (and before the second fork actually takes place). The thread calling `daemon(3)` gets stuck acquiring locks in `_rtld_atfork_pre`, whilst the new thread (the one which is started as `Thread.start { sleep 3 }` is stuck inside jemalloc's `extent_deactivate` as part of a call to `_thr_attr_init`. --- To reproduce this in the Ruby source, one can checkout the latest Ruby master from github.com/ruby/ruby.git, do the autoconf/configure dance, run `make`, and then run ``` while ./miniruby -I./lib -I. -I.ext/common ./tool/runruby.rb --extout=.ext -- ./test/runner.rb test/ruby/test_process.rb -n test_daemon_no_threads; do echo "ok"; done; ``` On my machine, this will eventually get stuck forever in the test. n.b. - if you find the test failing for this reason - http://rubyci.s3.amazonaws.com/freebsd13/ruby-master/log/20230517T003001Z.fail.html.gz - that's a _different_ issue, in Ruby itself, that I am trying to fix - that's how I discovered this deadlock thing... --- I've attached a pair of backtraces I got from attaching gdb to the process. I don't really know where to go from here to debug the issue though; I can't seem to make it happen in a similar C program, and by inspection I can't really see why there's a deadlock at all. I can't work out why the forking thread would hold any jemalloc locks, and I _really_ can't see why the new thread would hold any rtld locks. Any thoughts? Thanks! -- You are receiving this mail because: You are the assignee for the bug.