RubyのNet::HTTPでハマる

前回の記事でmod_rewriteのRewriteMapを使い、なんちゃってフェイルオーバーを作ってみましたが、どうもたまにヘルスチェックをおこなうrubyのスクリプトが落ちるわけです・・・。
エラーはこんな感じ。

/usr/lib/ruby/1.8/timeout.rb:54:in `open': execution expired (Timeout::Error)
from /usr/lib/ruby/1.8/net/http.rb:560:in `connect'
from /usr/lib/ruby/1.8/timeout.rb:56:in `timeout'
from /usr/lib/ruby/1.8/timeout.rb:76:in `timeout'
from /usr/lib/ruby/1.8/net/http.rb:560:in `connect'
from /usr/lib/ruby/1.8/net/http.rb:553:in `do_start'
from /usr/lib/ruby/1.8/net/http.rb:542:in `start'
from /usr/local/etc/shells/healthcheck.rb:30

rescueで捕捉しているのにどうしてだろう?と思っていたのですが、下記のような記事を発見。どうやら今のやり方では、Timeout::Errorの例外は捕捉してくれないようです。
Net::HTTPの例外補足方法 – OVERT MEMO

さっそく以下のように修正。

      begin
http = Net::HTTP.new(hostname, port ? port : 80)
http.open_timeout = HTTP_TIMEOUT
http.read_timeout = HTTP_TIMEOUT
http.start {|p| response = p.head(path ? path : '/') }
rescue Exception # ここを修正
#
end

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です