From c37d47e30897762145835e66ae752cce924af01d Mon Sep 17 00:00:00 2001 From: Matthew Draper Date: Tue, 30 Sep 2014 01:32:42 +0930 Subject: 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. --- actionpack/lib/action_dispatch.rb | 1 + actionpack/lib/action_dispatch/middleware/load_interlock.rb | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 actionpack/lib/action_dispatch/middleware/load_interlock.rb (limited to 'actionpack/lib') diff --git a/actionpack/lib/action_dispatch.rb b/actionpack/lib/action_dispatch.rb index dcd3ee0644..f6336c8c7a 100644 --- a/actionpack/lib/action_dispatch.rb +++ b/actionpack/lib/action_dispatch.rb @@ -52,6 +52,7 @@ module ActionDispatch autoload :DebugExceptions autoload :ExceptionWrapper autoload :Flash + autoload :LoadInterlock autoload :ParamsParser autoload :PublicExceptions autoload :Reloader diff --git a/actionpack/lib/action_dispatch/middleware/load_interlock.rb b/actionpack/lib/action_dispatch/middleware/load_interlock.rb new file mode 100644 index 0000000000..cbe8d750fe --- /dev/null +++ b/actionpack/lib/action_dispatch/middleware/load_interlock.rb @@ -0,0 +1,12 @@ +require 'active_support/dependencies' +require 'rack/lock' + +module ActionDispatch + class LoadInterlock < ::Rack::Lock + FLAG = 'activesupport.dependency_race'.freeze + + def initialize(app, mutex = ::ActiveSupport::Dependencies.interlock) + super + end + end +end -- cgit v1.2.3 From 48a735aff7032afaf5534613b10c635acead042a Mon Sep 17 00:00:00 2001 From: Matthew Draper Date: Tue, 7 Apr 2015 05:51:43 +0930 Subject: Fix the Interlock middleware We can't actually lean on Rack::Lock's implementation, so we'll just copy it instead. It's simple enough that that's not too troubling. --- .../lib/action_dispatch/middleware/load_interlock.rb | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'actionpack/lib') diff --git a/actionpack/lib/action_dispatch/middleware/load_interlock.rb b/actionpack/lib/action_dispatch/middleware/load_interlock.rb index cbe8d750fe..07f498319c 100644 --- a/actionpack/lib/action_dispatch/middleware/load_interlock.rb +++ b/actionpack/lib/action_dispatch/middleware/load_interlock.rb @@ -1,12 +1,21 @@ require 'active_support/dependencies' -require 'rack/lock' +require 'rack/body_proxy' module ActionDispatch - class LoadInterlock < ::Rack::Lock - FLAG = 'activesupport.dependency_race'.freeze + class LoadInterlock + def initialize(app) + @app = app + end - def initialize(app, mutex = ::ActiveSupport::Dependencies.interlock) - super + def call(env) + interlock = ActiveSupport::Dependencies.interlock + interlock.start_running + response = @app.call(env) + body = Rack::BodyProxy.new(response[2]) { interlock.done_running } + response[2] = body + response + ensure + interlock.done_running unless body end end end -- cgit v1.2.3