フタなしカンヅメ

徒然なるままに @happytar0

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