2013-06-19 1 views
5

cron 작업이 외부 서비스 (Twilio)에서 mp3 파일을 주기적으로 다운로드 한 다음 Paperclip을 사용하여 파일을 Amazon S3에 업로드하는 설치가 있습니다. 이 프로세스는 Resque로 백그라운드에서 처리됩니다. EOFError들과루비를 통해 파일을 다운로드 할 때 간헐적 인 EOFError

# 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 

이 실패 : 여기

는 종이 클립에 Twilio에서 다운로드 이후 첨부 파일을 처리하는 코드입니다 위의

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' 

가장 일반적인 오류는 있지만 또한이 문제가 발생했습니다 :

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의 생산 환경에서 최근에 시작되었습니다. 앱은 현재 heroku에 ruby 1.9.3-p429에 있습니다. 문제는 지역적으로 발생하지만 다소 적게 발생합니다. 나는 같은 루비 버전과 낮은 루비 버전을 시도했다. (낮은 숫자는 1.9.3-p194).

아무도 비슷한 문제가 있습니까? 온라인에서 오류를 검색하면 비슷한 오류가 발생하지만 상황은 매우 다릅니다.

+1

파일의 소스 사이트에서 귀하의 코드를 금지했을 수 있습니까? "Errno :: ECONNRESET"은 연결을 종료했음을 의미합니다. 제 생각에는 EOF 오류가 예상되는 모든 콘텐츠를 받기 전에 파일이 잘린 비슷한 문제를 지적하는 것입니다. –

+0

의견을 주셔서 감사합니다. 해당 사이트는 Twilio입니다. 파일에있는 사이트 소유자의 참조가 최근에 만료되었지만 곧 업데이트되었습니다. 어쨌든 왜 그 오류는 간헐적 인 것이고 언제나 그런 경우는 아니겠습니까? –

+1

여러 가지 이유로 간헐적 일 수 있습니다. 그들의 시스템과 프로세스에 대한 내부 정보가 없다면 순수한 추측이 있습니다. 우리는 우리의 네트워크에서 "생물학적"이라고 부르는 것들을 가지고 있습니다. 때때로 그들은 명령을 일관되게 입력하지 못하고 모든 장치에 규칙을 적용하지 못합니다. –

답변

0

코드에서 예상해야하는 일시적인 네트워킹 오류이며 일반적으로 잠자기 후에 다시 시도합니다. 인터넷이 안정적이지 않습니다!

재시도를 기록해야합니다. 스파이크 또는 비정상적인 패턴을 발견하면 서비스 제공 업체 (heroku, twilio 등)에게 가져 가려고 할 수 있습니다. 맨 끝에 뭔가가있어 통찰력을 얻을 수 있습니다.

코드에서 문제를 직접 해결할 수있는 방법은 없습니다 (실제로 변경되지 않은 경우).

관련 문제