diff options
author | Matthew Draper <matthew@trebex.net> | 2014-09-30 01:32:42 +0930 |
---|---|---|
committer | Matthew Draper <matthew@trebex.net> | 2015-07-09 02:23:23 +0930 |
commit | c37d47e30897762145835e66ae752cce924af01d (patch) | |
tree | 1b615adf6030b9d77557c88a51497c432a2c58a8 /railties/lib/rails/application | |
parent | c2b5aa041b04e65475dd3ebb9f33a68b26e25895 (diff) | |
download | rails-c37d47e30897762145835e66ae752cce924af01d.tar.gz rails-c37d47e30897762145835e66ae752cce924af01d.tar.bz2 rails-c37d47e30897762145835e66ae752cce924af01d.zip |
Soften the lock requirements when eager_load is disabled
We don't need to fully disable concurrent requests: just ensure that
loads are performed in isolation.
Diffstat (limited to 'railties/lib/rails/application')
-rw-r--r-- | railties/lib/rails/application/default_middleware_stack.rb | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/railties/lib/rails/application/default_middleware_stack.rb b/railties/lib/rails/application/default_middleware_stack.rb index 6f9ccec137..14ea073039 100644 --- a/railties/lib/rails/application/default_middleware_stack.rb +++ b/railties/lib/rails/application/default_middleware_stack.rb @@ -26,7 +26,35 @@ module Rails middleware.use ::Rack::Cache, rack_cache end - middleware.use ::Rack::Lock unless allow_concurrency? + if config.allow_concurrency == false + # User has explicitly opted out of concurrent request + # handling: presumably their code is not threadsafe + + middleware.use ::Rack::Lock + + elsif config.allow_concurrency + # Do nothing, even if we know this is dangerous + + else + # Default concurrency setting + + if config.cache_classes && config.eager_load + # No lock required + + elsif config.cache_classes + # The load interlock is required, but not a full request + # lock + + middleware.use ::ActionDispatch::LoadInterlock + + else + # If we're reloading on each request, they all need to be + # run in isolation + + middleware.use ::Rack::Lock + end + end + middleware.use ::Rack::Runtime middleware.use ::Rack::MethodOverride unless config.api_only middleware.use ::ActionDispatch::RequestId @@ -65,14 +93,6 @@ module Rails config.reload_classes_only_on_change != true || app.reloaders.map(&:updated?).any? end - def allow_concurrency? - if config.allow_concurrency.nil? - config.cache_classes && config.eager_load - else - config.allow_concurrency - end - end - def load_rack_cache rack_cache = config.action_dispatch.rack_cache return unless rack_cache |