2006年7月11日

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

みんつです.

# 普段アーカイブを見ているばっかりで...すみません.

最近,ヘンな事象に遭遇しました.Net::telnet にてサーバに
コマンド実行させているんですが,普通は何の問題もなく使えて
いますし,相手サーバに異常があった場合でも通信断,Timeout
に反応しています.


ところが,サーバが二重化され,(というか無理矢理なアドレス
切替という...そもそもこういう設計ってのはどうだかなーと
は思うのですが),切り替え時に実行していた telnet#cmd() の
処理で「まれに」おかしなことが起きます.

切替元サーバは telnet コネクションが継続してるとみなして,
データを送って来ているのですが,telnet クライアントはアド
レスが変わった切替先のサーバに応答をしています.

切替元 [データ] --> Net::telnet --> [ACK] 切替先
<-- [RST]
    [ 再送 ] --> --> [ACK]
<-- [RST]
...

当然こんなシーケンスをリトライし続けているわけです.通信断
もしてませんし,TCP TIMEOUT までは 0 byte read が繰り返され
るのかしら.と思っていたのですが,

この時,Net::telnet() 内 IO::select() にてデッドロックする
現象に悩まされています.telnet#cmd() がタイムアウトを検知
しないばかりか,timeout ブロックで括ってもタイムアウト検知
しません.

現象から見る限り,このようなシーケンスでは(システムコール
の)select() を最終的に「blocking select()」で呼び出してし
まう場合があるのではないかと思っているのですが,

ソースをざっと読んだだカンジ,別に問題なさそうな気がするです...

linux 環境,1.8.4,Timeout 値 60 秒にて使用しております.

もし,お心当たりの情報があれば助かりますです.

# 私が ruby の thread 機構を理解しきれていないだけかも試練 (-_-;

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


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




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