read_fully does not retry on `IO::EAGAINWaitReadable` (new in Ruby 2.1+) #456

Closed
mrchucho opened this Issue Jan 16, 2017 · 0 comments

Projects

None yet

1 participant

@mrchucho

Hi, we keep seeing the following exception in our logs:

E, [2017-01-16T12:08:06.934348 #15759] ERROR -- : Resource temporarily unavailable - read would block (IO::EAGAINWaitReadable)
<internal:prelude>:76:in `__read_nonblock'
<internal:prelude>:76:in `read_nonblock'
/var/www/apps/platform-api-etl/shared/bundle/ruby/2.3.0/bundler/gems/bunny-8f0fc31cfab6/lib/bunny/cruby/socket.rb:42:in `block in read_fully'
/var/www/apps/platform-api-etl/shared/bundle/ruby/2.3.0/bundler/gems/bunny-8f0fc31cfab6/lib/bunny/cruby/socket.rb:41:in `loop'
/var/www/apps/platform-api-etl/shared/bundle/ruby/2.3.0/bundler/gems/bunny-8f0fc31cfab6/lib/bunny/cruby/socket.rb:41:in `read_fully'
/var/www/apps/platform-api-etl/shared/bundle/ruby/2.3.0/bundler/gems/bunny-8f0fc31cfab6/lib/bunny/transport.rb:214:in `read_fully'
/var/www/apps/platform-api-etl/shared/bundle/ruby/2.3.0/bundler/gems/bunny-8f0fc31cfab6/lib/bunny/transport.rb:236:in `read_next_frame'
/var/www/apps/platform-api-etl/shared/bundle/ruby/2.3.0/bundler/gems/bunny-8f0fc31cfab6/lib/bunny/reader_loop.rb:68:in `run_once'
/var/www/apps/platform-api-etl/shared/bundle/ruby/2.3.0/bundler/gems/bunny-8f0fc31cfab6/lib/bunny/reader_loop.rb:35:in `block in run_loop'
/var/www/apps/platform-api-etl/shared/bundle/ruby/2.3.0/bundler/gems/bunny-8f0fc31cfab6/lib/bunny/reader_loop.rb:32:in `loop'
/var/www/apps/platform-api-etl/shared/bundle/ruby/2.3.0/bundler/gems/bunny-8f0fc31cfab6/lib/bunny/reader_loop.rb:32:in `run_loop'

Based on this post I assumed that I just needed to add IO::EAGAINWaitReadable to the list of READ_RETRY_EXCEPTION_CLASSES. I tried that in a fork of this gem, but it had no effect.

We are running Ruby 2.3.

$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]

Is this expected behavior or does it indicate a problem?

@michaelklishin michaelklishin added a commit that closed this issue Jan 16, 2017
@michaelklishin michaelklishin Retry on new Ruby 2.1+ variations of EAGAIN, EWOULDBLOCK
Of course, they have no documentation but the idea is
probably the same as with the classic versions.

Fixes #456.
a73b51b
@michaelklishin michaelklishin added a commit that referenced this issue Jan 16, 2017
@michaelklishin michaelklishin Retry on new Ruby 2.1+ variations of EAGAIN, EWOULDBLOCK
Of course, they have no documentation but the idea is
probably the same as with the classic versions.

Fixes #456.
75d9dd7
@michaelklishin michaelklishin changed the title from IO::EAGAINWaitReadable to ready_full does not retry on `IO::EAGAINWaitReadable` (new in Ruby 2.1+) Jan 16, 2017
@michaelklishin michaelklishin changed the title from ready_full does not retry on `IO::EAGAINWaitReadable` (new in Ruby 2.1+) to read_fully does not retry on `IO::EAGAINWaitReadable` (new in Ruby 2.1+) Jan 16, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment