今そこにある make test-all

タイトルはホッテントリメーカーに決めてもらってみました。

仕事関係の開発ツールやプロダクトの 1.9 系移行の検討を少しずつ進めている合間に、trunk のソースツリーで make test-all を流してみてEやFになったものを調べてみようという気になったので現状を残しておきます。

まずは拡張ライブラリでリンクしている外部ライブラリのバグが原因と思われるものが3つ。opensslとgdbmとzlib。それぞれ最新版を取ってきてビルド&インストール(ローカルに)して LD_LIBRARY_PATH を通して直りました。つか会社のサーバ(RHEL4)のパッケージ古いなー。

test/etc/test_etc.rb が重複したユーザやグループのエントリがある環境で失敗するというのがあって、これはテストを修正して報告済み。取り込んでいただけたようです。ありがとうございました。

あと test/io/test_flush.rb がハングしてタイムアウトでエラーになる(ただし稀に動くときもある)というのがあって、今日は勇んでこれを追跡して、どうやら select(2) で descriptor が書き込み可能になるのを待っている時に別のスレッドからその descriptor を close(2) すると select からかえってこなくなるという問題とわかりました。どうも Kernel のほうまで踏み込まないといけないかなーと思って検索してみたら、既に1年前に akr さんが通った道筋だったという。
http://cvs.m17n.org/~akr/diary/2007-12.html#a2007_12_30
でこの挙動はどうやら Linux 固有で、他の多くのUnixはselectからかえってくるらしい(http://search.luky.org/linux-kernel.2003/msg21083.html)。多分 Linux の実装が問題なんだけど、ずっと直ってない。他のLinuxの人のところではめったに発生してないんでしょうか? SMPだからかなぁ。
Ruby非同期IO nonblocking I/O *1自体は使っていないけど、多分これって書き込み中のソケットを別スレッドで IO#close してしまっても同じことが起きる可能性があるような気がするので、うちの既存コードで問題ありかも。アプリケーション側でどうにかすることもできるとは思うけど(書き込み処理してるスレッドに例外を投げて後始末として閉じさせるとか)。まあ踏んでしまったらその時はなんとか回避するしかないか。

次は test/rdoc/test_rdoc_markup_to_html_crossref.rb が 1F になるけど、中でいっぱいassertしているのでまだ追い切れてない。今後これを追うつもり。

それから test/socket/test_addrinfo.rb がインターネットに直接繋がってない環境だと 1F になる。これは www.ruby-lang.org を名前解決しようとしてる為なので、適当な内部のホストとIPアドレスに差し替えるとOKに。これ環境変数とか何かの手段でそういう環境でpassできるようにできないものか。とりあえずしょぼいパッチでも作って明日ruby-devに投げてakrさん(確かAddrInfoの作者)の意向を伺ってみるつもり。

あとは別の Debian だと test/ruby/test_signal が 1F になる。けどこれはマシンが非力すぎてタイムアウトに間にあってないだけかも。これも明日再確認。

他には時々妙な失敗の仕方をするのが minitest/test_mini_test.rb にあって、String#% で整形した文字列に余分な文字が入ってるように見える。でも毎回起きるわけじゃない。なんかメモリ破壊的な感じがしていやだなぁ。単体で実行してあまり再現しないから GC 絡みかもしれないし。これも GC.stress 付きで再確認してみよう。

あと自宅の Mac OS X で実行すると、test_etc.rb が失敗するという問題が発覚。Etc.group で取ったエントリと Etc.getgrgid や Etc.getgrnam で取ったエントリの passwd フィールドが異なるせいで 2F。group に passwd なんてあったんですね。これは多分 getgrnam/getgrgid(3) のせいなので、bsd でも同様なのかな?うーん一応そのうち追求してみる。

目指せ 0F0E。

*1:コメントで指摘頂いて修正