2013-06-19 3 views
5

Download habe ich ein Setup, wo ein Cron-Job in regelmäßigen Abständen lädt eine MP3-Datei von einem externen Dienst (Twilio) und verwendet dann Paperclip die Datei auf Amazon S3 zu laden. Der Prozess wird im Hintergrund von Resque abgewickelt.Intermittant EOFError, wenn die Datei über Rubin openURI

Hier ist der Code, der den Download von Twilio und die anschließende Bindung an Papierklammer Griffe:

# 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 

Dieser schlägt mit 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' 

Die oben ist der häufigste Fehler, aber ich auch aufgetreten ist dies:

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' 

Das Problem ist intermitt ant und gerade erst in herokus Produktionsumgebung aufgetreten, ohne dass sich der Code geändert hat. Die App ist derzeit auf ruby 1.9.3-p429 auf Heroku. Das Problem tritt auch lokal auf, jedoch etwas seltener. Ich habe die gleichen und niedrigeren Ruby-Versionen (so niedrig wie 1.9.3-p194) versucht.

Hat jemand über ein ähnliches Problem kommen? Die Suche nach dem Fehler online hat ähnliche Fehler ergeben, aber in sehr unterschiedlichen Kontexten.

+1

Könnte es sein, dass die Quellsite für die Datei Ihren Code gesperrt hat? "Errno :: ECONNRESET" bedeutet, dass sie die Verbindung geschlossen haben. Ich denke, ein EOF-Fehler würde auf ein ähnliches Problem hinweisen, bei dem die Datei gekürzt wurde, bevor Sie den erwarteten Inhalt erhalten haben. –

+0

Danke für den Kommentar. Die fragliche Seite ist Twilio. Die cc-Datei des Websiteinhabers ist kürzlich abgelaufen, aber er hat sie kurz darauf aktualisiert. In jedem Fall, warum würde dann der Fehler intermittierend sein und nicht immer der Fall? –

+1

Es kann aus verschiedenen Gründen intermittierend sein. Ohne Insiderinformationen über ihre Systeme und Prozesse ist alles, was gesagt wird, reine Spekulation. Wir haben Dinge, die wir in unserem Netzwerk als "Biologicals" bezeichnen, die manchmal nicht in der Lage sind, Befehle konsistent einzugeben, indem sie es versäumen, Regeln auf alle Geräte anzuwenden. –

Antwort

0

Diese vorübergehende Netzwerkfehler sind, die Sie in Ihrem Code erwarten sollten, und wiederholen Sie den Vorgang (in der Regel nach kurzem Schlaf). Das Internet ist nicht zuverlässig!

Sie sollten Wiederholungsversuche protokollieren, und wenn Sie eine Spitze oder ein ungewöhnliches Muster bemerken, möchten Sie vielleicht mit Ihren Dienstanbietern (heroku, twilio usw.) etwas unternehmen, da sie etwas an ihrem Ende haben können.

Es gibt nichts direkt können Sie tun, wenn das Problem von Ihrem Code zu beheben (wenn es in der Tat nicht geändert haben).