2013-06-19 11 views
5

Mam konfigurację, w której zadanie cron okresowo pobiera plik mp3 z usługi zewnętrznej (Twilio), a następnie używa Paperclip, aby przesłać plik do Amazon S3. Proces jest obsługiwany w tle przez Resque.Intermittant EOFError podczas pobierania pliku za pomocą ruby ​​OpenURI

Oto kod, który obsługuje pobieranie z Twilio i późniejsze przywiązanie do spinacza:

# 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 

zawiedzie to z 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' 

Powyższe jest najczęstszą błąd, ale ja również napotkał to:

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' 

Problem polega na przerywaniu mrówka i właśnie zaczęły pojawiać się w środowisku produkcyjnym heroku ostatnio bez żadnych zmian w odpowiednim kodzie. Aplikacja jest obecnie na ruby 1.9.3-p429 na heroku. Problem występuje również lokalnie, ale nieco rzadziej. Próbowałem tych samych i niższych wersji ruby ​​(od 1.9.3-p194).

Czy ktoś napotkał podobny problem? Wyszukiwanie błędu w Internecie ujawniło podobne błędy, ale w bardzo różnych kontekstach.

+1

Czy to możliwe, że witryna źródłowa pliku zablokowała Twój kod? "Errno :: ECONNRESET" oznacza, że ​​zamknęło połączenie. Myślę, że błąd EOF wskazywałby na podobny problem, w którym plik został obcięty przed otrzymaniem wszystkich oczekiwanych treści. –

+0

Dzięki za komentarz. Strona, o której mowa, to Twilio. Plik cc właściciela witryny wygasł niedawno, ale wkrótce został zaktualizowany. W każdym razie, dlaczego więc błąd byłby sporadyczny i nie zawsze tak jest? –

+1

Może to być przerywane z wielu powodów. Bez wewnętrznych informacji o swoich systemach i procesach wszystko, co powiedzieli, jest czystą spekulacją. W naszej sieci mamy rzeczy, które nazywamy "biologicznymi", które czasami nie potrafią konsekwentnie wprowadzać poleceń, nie stosując reguł do wszystkich urządzeń. –

Odpowiedz

0

Są to przejściowe błędy sieciowe, których należy się spodziewać w kodzie i ponowić operację (zwykle po krótkim śnie). Internet nie jest wiarygodny!

Powinieneś zalogować się ponownie, a jeśli zauważysz kolec lub nietypowy wzór, możesz chcieć nawiązać kontakt z dostawcami usług (heroku, twilio, itp.), Ponieważ może się zdarzyć, że coś na ich końcu dostarczy wgląd.

Nie można jednak bezpośrednio rozwiązać problemu z kodem (jeśli tak się nie zmieniło).

Powiązane problemy