[ruby-core:93875] [Ruby master Bug#10443] Forking with contended mutex held can lead to deadlock in child process upon unlock

From: merch-redmine@...
Date: 2019-07-22 22:44:58 UTC
List: ruby-core #93875
Issue #10443 has been updated by jeremyevans0 (Jeremy Evans).

Status changed from Open to Closed

I think this problem is fixed.  The example given works on Linux and OpenBSD.  If anyone is still having the problem with the master branch, please post back here.

----------------------------------------
Bug #10443: Forking with contended mutex held can lead to deadlock in child process upon unlock
https://bugs.ruby-lang.org/issues/10443#change-79839

* Author: benweint (Ben Weintraub)
* Status: Closed
* Priority: Normal
* Assignee: kosaki (Motohiro KOSAKI)
* Target version: 
* ruby -v: ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-darwin13.0]
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
If a Ruby thread calls `Process.fork` while holding a Mutex (for example, within a `Mutex#synchronize` block) that is also concurrently being contended for by a background thread, the thread in the child process will occasionally be unable to unlock the mutex it was holding at the time of the fork, and will hang under `rb_mutex_unlock_th` when attempting to acquire `mutex->lock`.

I've been able to reproduce this on Ruby 2.1.1 - 2.1.3 and 2.2.0-preview1 (haven't tried elsewhere yet).

The attached test case demonstrates the issue, although it can take up to 20 minutes to hit a reproducing case. The test case will print one '.' each time it forks. Once it stops printing dots, it has hit this bug (the parent process is stuck in a call to `Process.wait`, and the child is stuck in `rb_mutex_unlock_th`).

The test case consists of a global lock that is contended for by 10 background threads, in addition to the main thread, which acquires it, forks, and then releases it.


---Files--------------------------------
rb-mutex-unlock-fork-test.rb (372 Bytes)
rb-mutex-unlock-fork-test.rb (339 Bytes)
0001-thread.c-reinitialize-keeping-mutexes-on-fork.patch (3.06 KB)


-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next