Rack middleware deadlock

Posted by Joel on Stack Overflow See other posts from Stack Overflow or by Joel
Published on 2010-03-24T03:37:58Z Indexed on 2010/03/24 3:43 UTC
Read the original article Hit count: 301

Filed under:
|

I include this simple Rack Middleware in a Rails application:

class Hello

  def initialize(app)
    @app = app
  end

  def call(env)
    [200, {"Content-Type" => "text/html"}, "Hello"]
  end

end

Plug it in inside environment.rb:

...
Dir.glob("#{RAILS_ROOT}/lib/rack_middleware/*.rb").each do |file|
  require file
end
Rails::Initializer.run do |config|
  config.middleware.use Hello
...

I'm using Rails 2.3.5, Webrick 1.3.1, ruby 1.8.7

When the application is started in production mode, everything works as expected - every request is intercepted by the Hello middleware, and "Hello" is returned. However, when run in development mode, the very first request works returning "Hello", but the next request hangs.

Interrupting webrick while it is in the hung state yields this:

^C[2010-03-24 14:31:39] INFO  going to shutdown ...
deadlock 0xb6efbbc0: sleep:-  - /usr/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/reloader.rb:31
deadlock 0xb7d1b1b0: sleep:J(0xb6efbbc0) (main) - /usr/lib/ruby/1.8/webrick/server.rb:113
Exiting
/usr/lib/ruby/1.8/webrick/server.rb:113:in `join': Thread(0xb7d1b1b0): deadlock (fatal)
    from /usr/lib/ruby/1.8/webrick/server.rb:113:in `start'
    from /usr/lib/ruby/1.8/webrick/server.rb:113:in `each'
    from /usr/lib/ruby/1.8/webrick/server.rb:113:in `start'
    from /usr/lib/ruby/1.8/webrick/server.rb:23:in `start'
    from /usr/lib/ruby/1.8/webrick/server.rb:82:in `start'
    from /usr/lib/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/handler/webrick.rb:14:in `run'
    from /usr/lib/ruby/gems/1.8/gems/rails-2.3.5/lib/commands/server.rb:111
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
    from script/server:3

Something to do with the class reloader in development mode. There is also mention of deadlock in the exception.

Any ideas what might be causing this? Any recommendations as to the best approach to debug this?

© Stack Overflow or respective owner

Related posts about ruby-on-rails

Related posts about rack