http.getで無限待ち

以前の記事とほぼ同内容なんだけど,またはまってしまった.覚えられるまで何度でも書く. 24時間稼働させているrubyのプログラムが全く出力を吐かなくなった.process自体は落ちずに生き残っているらしい.straceで確認するとppollで止まっている.

% strace -p 5968
Process 5968 attached
ppoll([{fd=8, events=POLLIN}], 1, NULL, NULL, 

ppollの第2引数がNULLになっているのが良くない.これはTimeout時間をしているものでNULLならばTimeoutなしの無限待ちになる. RubyのHTTPのget,postでdefaultでTimeoutが設定されていないのが大本.以下のように明示的に指定する.

  url = URI.parse URL
  http = Net::HTTP.new(url.host,url.port)
  http.use_ssl = true if (443==url.port)
  http.open_timeout = 300
  http.read_timeout = 300
  http.ssl_timeout  = 300
  http.verify_mode = OpenSSL::SSL::VERIFY_PEER
  http.verify_depth = 5
  resp = http.get(url.path)