Issue #8810 has been reported by ngoto (Naohisa G.).
Bug #8810: SolarisでGDBM.open内で処理がブロックしたらTimeout.timeout が効かない
Author: ngoto (Naohisa G.)
Status: Open
Priority: Normal
Assignee:
Category: ext
Target version:
ruby -v: -
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN
GDBM.open内で処理がブロックした場合にTimeout.timeoutが効きません。
再現方法は、Solarisにて、以下のようにGDBMをオープンしたままにして、
$ ruby -r gdbm -e ‘db = GDBM.open(“/var/tmp/tmpdb”); gets’
同一マシンで別のシェルで
$ ruby -r gdbm -r timeout -e ‘Timeout.timeout(5) { db =
GDBM.open(“/var/tmp/tmpdb”) }’
を実行しても、タイムアウトすることなく後者のGDBM.openがブロックし続けて終わりません。
Solarisだけでなく、Linux上にて、以下のように無理やりflockを使わないようconfigureしてmakeしたlibgdbm.soを使用した場合でも同様に再現しました。
$ wget ftp://ftp.gnu.org/gnu/gdbm/gdbm-1.10.tar.gz
$ tar xvf gdbm-1.10.tar.gz
$ cd gdbm-1.10
$ ./configure --prefix=/home/xxxxx/gdbm ac_cv_func_flock=no
$ make
$ make install
$ LD_PRELOAD=/home/xxxxx/gdbm/lib/libgdbm.so ruby -r gdbm -e ‘db =
GDBM.open(“/var/tmp/tmpdb”); gets’
(別のシェルにて)
$ LD_PRELOAD=/home/xxxxx/gdbm/lib/libgdbm.so ruby -r gdbm -r timeout -e
‘Timeout.timeout(5) { db = GDBM.open(“/var/tmp/tmpdb”) }’