«前の日記(2010-01-06) 最新 次の日記(2010-01-10)» 編集

会長@腹部日記


2010-01-08 [長年日記]

_ Mongrelの排他制御を解除し、並列実行を可能にするパッチ

Rails2.2.2以降でサポートされた、threadsafeに関するMongrelのパッチです。 さばこうとするHTTPリクエストの分、マルチスレッドで動作します。

Mongrel's bundled Rails handler always uses a mutex around dispatching.

Now that Rails is thread safe and all, mongrel should respect

ActionController::Base.allow_concurrency flag.

[Mongrel rails handler should use allow_concurrencyより引用]

patchコマンドで適用した後、production.rb の中で以下のコメントを外します。

 # config.threadsafe!
 #↓とる
 config.threadsafe!

中身を覗いてみる

config.threadsafe!内部で、ActionController::Base.allow_concurrency = trueとしているため、@guard.synchronize が迂回されます。

 -            @guard.synchronize {
 -              @active_request_path = request.params[Mongrel::Const::PATH_INFO] 
 -              Dispatcher.dispatch(cgi, ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS, response.body)
 -              @active_request_path = nil
 -            }
 -
 +            if ActionController::Base.allow_concurrency
 +              _dispatch_unlocked(cgi, request, response)
 +            else
 +              @guard.synchronize { _dispatch_unlocked(cgi, request, response) }
 +            end
 
 +      private
 +
 +      def _dispatch_unlocked(cgi, request, response)
 +        @active_request_path = request.params[Mongrel::Const::PATH_INFO] 
 +        Dispatcher.dispatch(cgi, ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS, response.body)
 +        @active_request_path = nil
 +      end

JRuby環境でも動作しました

試した環境は以下のとおりです。

 # jruby --version
 jruby 1.4.0 (ruby 1.8.7 patchlevel 174) (2009-11-02 69fbfa3) (Java HotSpot(TM) Client VM 1.6.0_17) [i386-java]
 # jruby -S gem list                                                                                                          
 
 *** LOCAL GEMS ***
 (略)
 mongrel (1.1.5)

_ きょうのつぶやき : 85回