Errno :: ETIMEDOUT: Тайм-аут соединения - соединение (2) - PullRequest
0 голосов
/ 21 февраля 2012

На производстве я иногда получаю следующую ошибку:

Errno::ETIMEDOUT: Connection timed out - connect(2)

Кажется, что это происходит только тогда, когда я генерирую PDF, используя драгоценный камень креветки, который содержит изображение, которое было загружено paperclip / aws-sdk в s3. Вероятно, это происходит только пару раз в неделю для действия, которое используется сотни раз в день (без проблем), но в результате оно приводит к ошибке 500.

След:

/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/net/http.rb:560:in
`initialize'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/net/http.rb:560:in
`open'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/net/http.rb:560:in
`connect'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/timeout.rb:53:in
`timeout'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/timeout.rb:101:in
`timeout'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/net/http.rb:560:in
`connect'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/net/http.rb:553:in
`do_start'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/net/http.rb:542:in
`start'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:242:in
`open_http'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:616:in
`buffer_open'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:164:in
`open_loop'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:162:in
`catch'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:162:in
`open_loop'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:132:in
`open_uri'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:518:in
`open'
/opt/ruby-enterprise-1.8.7-2011.03/lib/ruby/1.8/open-uri.rb:30:in
`open'
....rb:57:in `render_image_to_pdf'

Строка 57:

pdf.image open(image.expiring_url(30.minutes, :full)), :width => 300, :position => 20

Настройка:

Rails 3.0.10
Ruby 1.8.7EE
Prawn  0.11.1
AWS-SDK 1.3.3
Paperclip 2.5.2

Что я могу сделать, чтобы предотвратить эту ошибку?

Ответы [ 2 ]

8 голосов
/ 21 февраля 2012

Один из вариантов - перехватить исключение и повторить попытку:

begin
  pdf.image open(image.expiring_url(30.minutes, :full)), :width => 300, :position => 20
rescue Errno::ETIMEDOUT
  # try one more time, or use retry with a counter to attempt a limited number of times
  pdf.image open(image.expiring_url(30.minutes, :full)), :width => 300, :position => 20
end

Возможно, вы также захотите поставить некоторую диагностику (либо запись в журнал или генерацию Airbrake), которая уведомляет вас, чтобы вы могли увидеть, есть ли какая-то схема сбоев.

2 голосов
/ 27 сентября 2012

Я получаю ту же ошибку в Amazon EC2 при использовании aws-sdk для порождения новых экземпляров сервера.Вот что я знаю:

  1. У меня есть функция (sleep_ while_not_running), которая проверяет instance.status:

    def sleep_ while_not_running (instance) print "Ожидает в системе:"
    $ stdout.flush while instance.status! =: Выполняется печать "."$ stdout.flush sleep 1 end ставит «возобновление».end

  2. После того, как возвращается sleep_ while_not_running, я предполагаю, что мы должны иметь возможность подключиться (следующим образом):

    Net::SSH.start(instance.ip_address,'root',:key_data=>[key_pair.private_key]) do |ssh|
    sleep_while_not_running(instance)
    puts "testing SSH connectivity."
    puts ssh.exec("uname -a")
    puts " "
    
  3. Что происходит, этота же ошибка тайм-аута, которую вы описали.Исследуя вручную, я обнаружил, что -

    a.Если я подожду, пока «Проверка состояния» (в консоли управления) покажет, что новый экземпляр имеет «Пройдено 2/2 проверки», то я могу просто вручную выполнить SSH, используя ту же пару ключей, что используется сценарием.

    б.sleep_ while_not_running проверяет instance.status (который говорит «работает» задолго до того, как сервер полностью запекся.

    c. Я не могу найти вызов в aws-sdk для проверки «проверок состояния», которые я проверял бы в консоли управления, но я подозреваю, что именно здесь существует решение.

PS Я понимаю, что это не «ответ», но это может помочь определить решение.

...