[ruby-dev:49103] [Ruby trunk - Bug #11265] deadlock on Solaris 10 since r50900

From: ngotogenome@...
Date: 2015-06-17 15:40:51 UTC
List: ruby-dev #49103
Issue #11265 has been updated by Naohisa Goto.


test/lib/test/unit.rb の _run_parallel メソッド内の 408-410行目にて、以下のタイミングで発生していることはわかりました。

1. 408行目では start_watchdog を呼ぶ。
2. start_watchdog メソッド内では、新スレッドを作成してすぐにリターンする。
3. start_watchdog で作成したスレッド内では、Process.wait2 を呼んでいる。しかし、まだ子プロセスを作成する前なので、Errno::ECHILD 例外が発生し、せっかく作った新スレッドはあえなく終了する。(つまり、名前に反して watchdog を行うことは無い。これはバグだと思う。)
4. 409行めは空行。410行目にて @options[:parallel].times {launch_worker} が実行される。 launch_worker は内部ですぐに Worker.launch を呼び、その中で IO.popen にて別プロセスのRubyを起動する。

この上記3の Process.wait2 に失敗してスレッドが終了するのと、上記4のIO.popenの実行がだいたい同時に発生したら、デッドロックが発生するようです。

ただし、上記3のうち、Process.wait2 と、スレッド終了のどちらが要因なのかは、同定できませんでした。


----------------------------------------
Bug #11265: deadlock on Solaris 10 since r50900
https://bugs.ruby-lang.org/issues/11265#change-52986

* Author: Naohisa Goto
* Status: Open
* Priority: Normal
* Assignee: 
* ruby -v: -
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN
----------------------------------------
Solaris10にて、r50900 以降、
 TestParallel::TestParallel#test_jobs_status
 TestParallel::TestParallel#test_separate
のいずれか、または両方で、テストが停止状態となり次に進まなくなります。
スレッドのデッドロックが発生しているような感じです。

ところで、こういう場合の上手いデバッグ方法って何があるでしょうか?




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

In This Thread

Prev Next