celluloid/reel

Keep-Alive holds actors indefinitely. Needs a timeout.

digitalextremist opened this issue · 2 comments

Now that there is the TaskFiber.backtrace option provided by @kenichi, I've been able to pinpoint where Reel is holding open actors in pools of request handlers. It's here:

<gem path>/celluloid/lib/celluloid/io.rb:55:in `select'
<gem path>/celluloid/lib/celluloid/io.rb:55:in `wait_readable'
<gem path>/celluloid/lib/celluloid/io/stream.rb:30:in `wait_readable'
<gem path>/celluloid/lib/celluloid/io/stream.rb:43:in `sysread'
<gem path>/celluloid/lib/celluloid/io/stream.rb:41:in `sysread'
<gem path>/celluloid/lib/celluloid/io/stream.rb:392:in `synchronize'
<gem path>/celluloid/lib/celluloid/io/stream.rb:391:in `synchronize'
<gem path>/celluloid/lib/celluloid/io/stream.rb:39:in `sysread'
<gem path>/celluloid/lib/celluloid/io/stream.rb:129:in `readpartial'
<gem path>/reel/lib/reel/request/parser.rb:53:in `readpartial'
<gem path>/reel/lib/reel/request/parser.rb:47:in `current_request'
<gem path>/reel/lib/reel/connection.rb:57:in `request'
<gem path>/reel/lib/reel/connection.rb:78:in `each_request'

This is likely an issue with Celluloid::IO streams, but it is most felt in Reel I believe.

There needs to be the ability to provide a timeout so it eventually lets go of the socket, and releases actors handling requests back to their pool.

See this thread for discussion of timeouts:

https://groups.google.com/forum/#!topic/celluloid-ruby/u35U3yUhTw0

tl;dr: all the prerequisites are there (and have been there for awhile), but getting everything wired up correctly has been an ongoing struggle

Thanks for the reference @tarcieri. I will move over to this after celluloid/celluloid#406 if it's not resolved by the time I finish that. It's critical path for me, so it'll be no problem to come in on it and help land this.