From: Tanaka Akira Date: 2005-01-02T03:10:33+09:00 Subject: [ruby-dev:25391] Re: test fail: drb/drb.rb:836:in `initialize': Address already in use - bind(2) (Errno::EADDRINUSE) In article , Masatoshi SEKI writes: > ソケットを閉じるのは子プロセスの方なのですが、「死んでよ」とRMIでお願いして > 死んでもらってます。子プロセスは「死んでよ」の返事を書いてから死ななくては > ならないので、返事を書く寸前にスレッド生成して1秒後に自殺をはじめます。 > > それで、子プロセスが終了しきる前に同じポート番号で新しいプロセスを起動して > しまうとこのような現象になります。 > > ですからsleepを止めると確実に起こせるのだと思います。 なるほど。 とすると、EADDRINUSE がほぼ確実に起きる環境では 0.2 秒の間に自殺が終わ らないのかもしれませんね。 というわけで試しに sleep 2.2 にしてみると、やはり問題が起こらなくなり ました。 結局の所、sleep で適当な時間だけ待って「閉じたはず」というやりかたが間 違っていると思います。これは race condition で、マシンが遅い場合にはテ ストに失敗するわけですし。 やはり、プロセスの終了は wait で待つべきだというのが教訓でしょうか。 もちろん、この件に関してはテストの内容自体に本質的な race condition が あるので、テストごと削除するのが適切だというのは変わりませんが。 -- [田中 哲][たなか あきら][Tanaka Akira]