2006年7月11日

[ruby-list:42565] Re: IO::select() の dead lock ?

みんつです.

ありがとうございます.

まつもとさん wrote:
> めったに起きない現象だそうですから、原因の特定は難しいかもし
> れませんが。

以下のシーケンスに陥れば,確実に再現しているのですが,試験環境
で作り出すのに苦労してますです.

> | 切替元サーバは telnet コネクションが継続してるとみなして,
> | データを送って来ているのですが,telnet クライアントはアド
> | レスが変わった切替先のサーバに応答をしています.
> |
> | 切替元 [データ] --> Net::telnet --> [ACK] 切替先
> | <-- [RST]
> |     [ 再送 ] --> --> [ACK]
> | <-- [RST]
> うーむ。これはこれで難儀な...。

ええ,サーバを切替えるのならプロセス終了処理くらいやれよ,
っつうか.なんでこんな後処理をクライアント側で面倒見なきゃ
いけないのか.ぷんぷん. (-_-;

ともあれ,デッドロックはいかにもまづいので.

> Net::telnet()内IO::selectというのはtelnet.rb何行目に登場する
> IO::selectでしょうか。telnet.rbには3ヶ所selectが登場するので
> すが、ふたつはwaitforメソッド、もうひとつはwriteメソッドです。

waitfor() 内,549 行の方です.550 行の方でも起きるのかもし
れませんけれど.

> また、net/telnet自身はスレッドを使っていませんが、クライアン
> トプログラムはスレッドを利用しているのでしょうか。その辺も関
> 係があるかもしれません。

クライアントでは(timeout で括った時は別にして)スレッドを
使っていません.

IO::select() でスレッド動作可能にするためにスレッドの切替え
動作をしていますよね.ある条件下では,その動作の果てに
ブロッキング select() を呼び出してしまうことがあるのではない
かと,ソースとにらめっこしているのですけれど.

# とりあえず今は syscall で alarm() 呼んで逃げてます (^^;

--
みんつ - minz@xxxxx - みぎまつひろし


投稿者 xml-rpc : 2006年7月11日 02:22
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/41475
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。