2013-06-19 26 views
5

Tôi có một thiết lập trong đó một công việc định kỳ tải xuống một tệp mp3 từ một dịch vụ bên ngoài (Twilio) và sau đó sử dụng Paperclip để tải tệp lên Amazon S3. Quá trình này được xử lý trong nền bởi Resque.EOFError ngắt quãng khi tải tập tin qua ruby ​​OpenURI

Đây là đoạn mã để xử lý các tải về từ Twilio và tập tin đính kèm sau để Kẹp giấy:

# 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 

này không thành công với EOFError s:

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' 

Trên đây là lỗi phổ biến nhất, nhưng tôi cũng đã gặp phải điều này:

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' 

Sự cố là intermitt kiến và chỉ mới bắt đầu xảy ra trong môi trường sản xuất của heroku gần đây mà không có bất kỳ thay đổi nào trong mã có liên quan. Ứng dụng hiện đang ở trên ruby 1.9.3-p429 trên heroku. Vấn đề xảy ra tại địa phương là tốt, nhưng phần nào ít thường xuyên hơn. Tôi đã thử các phiên bản ruby ​​giống nhau và thấp hơn (thấp như 1.9.3-p194).

Có ai gặp phải vấn đề tương tự không? Tìm kiếm lỗi trực tuyến đã bật lên các lỗi tương tự, nhưng trong các ngữ cảnh rất khác nhau.

+1

Có thể trang web nguồn của tệp đã cấm mã của bạn không? "Errno :: ECONNRESET" có nghĩa là họ đã đóng kết nối. Tôi nghĩ rằng một lỗi EOF sẽ trỏ đến một vấn đề tương tự, nơi mà các tập tin đã được cắt ngắn trước khi bạn nhận được tất cả các nội dung dự kiến. –

+0

Cảm ơn nhận xét. Trang web được đề cập là Twilio. CC của chủ sở hữu trang web trên tệp đã hết hạn gần đây nhưng anh ấy đã cập nhật ngay sau đó. Trong mọi trường hợp, tại sao sau đó lỗi sẽ được liên tục và không phải luôn luôn như vậy? –

+1

Nó có thể bị gián đoạn vì một số lý do. Nếu không có thông tin bên trong về các hệ thống và quy trình của họ thì bất cứ điều gì nói là đầu cơ thuần túy. Chúng tôi có những thứ mà chúng tôi gọi là "sinh học" trên mạng của chúng tôi, những người đôi khi không nhập lệnh một cách nhất quán, không áp dụng các quy tắc cho tất cả các thiết bị. –

Trả lời

0

Đây là các lỗi mạng tạm thời mà bạn nên mong đợi trong mã của mình và thử lại thao tác (thường sau khi ngủ ngắn). Internet không đáng tin cậy!

Bạn nên đăng nhập lại, và nếu bạn nhận thấy một mẫu cành hoặc hoa văn bất thường, bạn có thể muốn dùng nó với nhà cung cấp dịch vụ (heroku, twilio, v.v.) vì có thể có thứ gì đó mà họ có thể cung cấp.

Không có gì trực tiếp bạn có thể thực hiện để khắc phục sự cố từ mã của mình (nếu thực sự không thay đổi).

Các vấn đề liên quan