2011年6月25日

[ruby-list:48191] Net::FTPの挙動について

はじめまして、高倉と申します。
お世話になっております。

Net::FTPの挙動に関してお客様の環境で問題が発生し、色々調査
しております。問題の対処法について、ご質問させてください。

まず、問題の内容をお知らせします。

【環境】
ハードウェア: DL360G5
OS: Red Hat Enterprise Linux 5(64bit)
Ruby: 1.8.7-p334
OSのTCP周りの設定:
デフォルトのまま。
(tcp_keepalive_intvl=75, tcp_keepalive_probes=9,
tcp_keepalive_time=7200)

Net::FTPからWindowsのIISと思われるFTPサーバ(サーバ側環境の
詳細はまだ分かりません)にActiveモードで接続しております。

Net::FTPからファイルをput中にサーバ側で何らかのエラーが
発生しサーバ側からcloseされたのですが、Net::FTP側は
その後put中の処理が停止したままタイムアウトになりません。
(問題発生から6時間経過しても停止したままになっています)

この処理は排他を掛けていますので、お客様側で問題が発覚しても
お客様が出来る操作で、問題からの復帰が出来ないという問題が
あります。

問題は2つあります。
一つはサーバ側での何らかのエラーであり、根本原因はこちらに
あると思いますが、もう一つの復帰できない問題にも対応する
必要があります。

後者の問題に対して、put処理にタイムアウトを設定しタイムアウト
発生後に復帰処理を行うように考えています。

とりあえずtimeout(sec) {|i|}を利用して対処しますが、根本的な
解決ではないと考えています。

timeoutはブロック内の処理停止に対して働くのであって、パケット
送受信の停止に働くものではありません。
サイズが一定のファイルを送る場合は、問題にはなりませんが、
大小さまざまなファイルを送る事を考えると、タイムアウト値の
適切な設定が出来なくなります。大きなファイルに合わせると
無駄に長すぎるタイムアウト値になりますし、小さなファイルに
合わせると大きなファイルを正常に処理しているのにタイムアウトが
発生する事が考えられます。


前置きが長くなりましたが、ここからご質問です。

Net::FTPのput系の処理に適切なタイムアウトを設定することは
可能でしょうか?

また、ftp.rbのソースを読んでいた際に疑問が出てきましたので、
あわせて、ご質問させてください。

サーバで何らかのエラーが発生した際、サーバ側から処理を中断
するためにそれを知らせるレスポンスコード(451)をコマンド用
接続を通して返すと思いますが、そのレスポンスを処理しています
でしょうか?


私はRubyの経験が浅く、FTPの処理がftp.rbで完結しているのか
よく分かりませんでした。
Cの世界での経験上、selectを使って複数の接続(コマンド用、
データ用)を適切に処理するのが定石だと思っていましたが、
そのような処理がなかったので疑問点として浮上しました。


ご助力いただけますと幸いです。
よろしくお願いいたします。
---
高倉


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




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