In article <DA512D22-5C1D-11D9-A492-000D9350318C / mva.biglobe.ne.jp>,
  Masatoshi SEKI <m_seki / mva.biglobe.ne.jp> writes:

> ソケットを閉じるのは子プロセスの方なのですが、「死んでよ」とRMIでお願いして
> 死んでもらってます。子プロセスは「死んでよ」の返事を書いてから死ななくては
> ならないので、返事を書く寸前にスレッド生成して1秒後に自殺をはじめます。
>
> それで、子プロセスが終了しきる前に同じポート番号で新しいプロセスを起動して
> しまうとこのような現象になります。
>
> ですからsleepを止めると確実に起こせるのだと思います。

なるほど。

とすると、EADDRINUSE がほぼ確実に起きる環境では 0.2 秒の間に自殺が終わ
らないのかもしれませんね。

というわけで試しに sleep 2.2 にしてみると、やはり問題が起こらなくなり
ました。

結局の所、sleep で適当な時間だけ待って「閉じたはず」というやりかたが間
違っていると思います。これは race condition で、マシンが遅い場合にはテ
ストに失敗するわけですし。

やはり、プロセスの終了は wait で待つべきだというのが教訓でしょうか。

もちろん、この件に関してはテストの内容自体に本質的な race condition が
あるので、テストごと削除するのが適切だというのは変わりませんが。
-- 
[田中 哲][たなか あきら][Tanaka Akira]