2013-06-19 14 views
5

cronジョブが定期的に外部サービス(Twilio)からmp3ファイルをダウンロードして、Paperclipを使用してファイルをAmazon S3にアップロードする設定があります。このプロセスは、Resqueによってバックグラウンドで処理されます。ここでruby​​でファイルをダウンロードするときの断続的なEOFError OpenURI

はペーパークリップにTwilioとその後の添付ファイルからダウンロードを処理するコードです:

# Perform transfer from Twilio to S3 
def self.perform(group_recording_id = nil) 
    gr = GroupRecording.find(group_recording_id) 
    # ... 
    recording = TwilioClient.account.recordings.get(gr.external_id) 

    if recording.present? 
    # .... 
    gr.audio_file = download_remote_file(gr.twilio_mp3_url) 
    gr.save 
    end 
end 

def download_remote_file(url) 
    io = open(URI.parse(url)) 

    # overrides Paperclip::Upfile#original_filename 
    def io.original_filename 
    base_uri.path.split('/').last 
    end 
    io.original_filename.blank? ? nil : io 
end 

これはEOFError秒で失敗します。

EOFError 
end of file reached 
/usr/local/lib/ruby/1.9.1/openssl/buffering.rb:145:in `sysread_nonblock' 
/usr/local/lib/ruby/1.9.1/openssl/buffering.rb:145:in `read_nonblock' 
/usr/local/lib/ruby/1.9.1/net/protocol.rb:135:in `rbuf_fill' 
/usr/local/lib/ruby/1.9.1/net/protocol.rb:116:in `readuntil' 
/usr/local/lib/ruby/1.9.1/net/protocol.rb:126:in `readline' 
/usr/local/lib/ruby/1.9.1/net/http.rb:2219:in `read_status_line' 
/usr/local/lib/ruby/1.9.1/net/http.rb:2208:in `read_new' 
/usr/local/lib/ruby/1.9.1/net/http.rb:1191:in `transport_request' 
/usr/local/lib/ruby/1.9.1/net/http.rb:1177:in `request' 
/app/vendor/bundle/ruby/1.9.1/gems/rest-client-1.6.7/lib/restclient/net_http_ext.rb:51:in `request' 
/usr/local/lib/ruby/1.9.1/open-uri.rb:312:in `block in open_http' 
/usr/local/lib/ruby/1.9.1/net/http.rb:627:in `start' 
/usr/local/lib/ruby/1.9.1/open-uri.rb:306:in `open_http' 
/usr/local/lib/ruby/1.9.1/open-uri.rb:769:in `buffer_open' 
/usr/local/lib/ruby/1.9.1/open-uri.rb:203:in `block in open_loop' 
/usr/local/lib/ruby/1.9.1/open-uri.rb:201:in `catch' 
/usr/local/lib/ruby/1.9.1/open-uri.rb:201:in `open_loop' 
/usr/local/lib/ruby/1.9.1/open-uri.rb:146:in `open_uri' 
/usr/local/lib/ruby/1.9.1/open-uri.rb:671:in `open' 
/usr/local/lib/ruby/1.9.1/open-uri.rb:33:in `open' 
/app/app/models/group_recording.rb:112:in `download_remote_file' 
/app/app/models/group_recording.rb:85:in `perform' 

上記は、最も一般的なエラーですが、Iこれに遭遇しました:

Errno::ECONNRESET 
Connection reset by peer 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/openssl/buffering.rb:145:in `sysread_nonblock' 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/openssl/buffering.rb:145:in `read_nonblock' 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/net/protocol.rb:135:in `rbuf_fill' 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/net/protocol.rb:86:in `read' 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/net/http.rb:2424:in `read_body_0' 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/net/http.rb:2379:in `read_body' 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/open-uri.rb:321:in `block (2 levels) in open_http' 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/net/http.rb:1194:in `block in transport_request' 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/net/http.rb:2342:in `reading_body' 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/net/http.rb:1193:in `transport_request' 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/net/http.rb:1177:in `request' 
/app/vendor/bundle/ruby/1.9.1/gems/rest-client-1.6.7/lib/restclient/net_http_ext.rb:51:in `request' 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/open-uri.rb:312:in `block in open_http' 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/net/http.rb:627:in `start' 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/open-uri.rb:306:in `open_http' 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/open-uri.rb:769:in `buffer_open' 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/open-uri.rb:203:in `block in open_loop' 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/open-uri.rb:201:in `catch' 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/open-uri.rb:201:in `open_loop' 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/open-uri.rb:146:in `open_uri' 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/open-uri.rb:671:in `open' 
/app/vendor/ruby-1.9.2/lib/ruby/1.9.1/open-uri.rb:33:in `open' 
/app/app/models/group_recording.rb:113:in `download_remote_file' 
/app/app/models/group_recording.rb:86:in `perform' 

問題は間欠です最近、関連するコードを変更することなく、herokuの生産環境で発生し始めました。アプリは現在、英雄のruby 1.9.3-p429にあります。この問題はローカルで発生しますが、多少はそれほど頻繁に発生しません。私は同じと低いルビーバージョン(1.9.3-p194として低い)を試しました。

誰かが同様の問題に遭遇しましたか?オンラインでエラーを検索すると、同様のエラーが発生しましたが、状況は大きく異なります。

+1

ファイルのソースサイトでコードが禁止されている可能性がありますか? 「Errno :: ECONNRESET」は接続を終了したことを意味します。私は、EOFエラーは、すべての予想されるコンテンツを受け取る前にファイルが切り捨てられた同様の問題を指摘すると思います。 –

+0

コメントありがとうございます。問題のサイトはTwilioです。ファイルのサイト所有者のCCは最近期限切れになりましたが、すぐに更新されました。いずれにしても、間違いが断続的に発生するのはなぜですか。必ずしもそうではありませんか? –

+1

これは、いくつかの理由で断続的になる可能性があります。彼らのシステムとプロセスに関する内部情報がなければ、純粋な推測であると言われるものはありません。ネットワーク上に「生物学」と呼ばれるものがあり、コマンドを一貫して入力することができず、すべてのデバイスにルールを適用できません。 –

答えて

0

これは、コードで予想される過渡的なネットワークエラーであり、通常は短いスリープの後に操作を再試行します。インターネットは信頼できません!

スパイクや異常なパターンに気付いた場合は、サービスプロバイダ(heroku、twilioなど)と最後に何かがある可能性があるため、洞察を提供することができます。

実際にコードから問題を解決する方法はありませんが(実際に変更しなかった場合)

関連する問題