mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Clear the correct query cache
This executor currently relies on `ActiveRecord::Base.connection` not changing between `prepare` and `complete`. If something else returns the current ActiveRecord connection to the pool early then this `complete` call will fail to clear the correct query cache and restore the original `query_cache_enabled` status. This has for example been happening in Sidekiq: https://github.com/mperham/sidekiq/pull/3166 We can just keep track of the connection as part of the exector state.
This commit is contained in:
parent
3b50fb6b2f
commit
fa7efca553
2 changed files with 27 additions and 4 deletions
|
@ -28,12 +28,12 @@ module ActiveRecord
|
|||
enabled = connection.query_cache_enabled
|
||||
connection.enable_query_cache!
|
||||
|
||||
enabled
|
||||
[connection, enabled]
|
||||
end
|
||||
|
||||
def self.complete(enabled)
|
||||
ActiveRecord::Base.connection.clear_query_cache
|
||||
ActiveRecord::Base.connection.disable_query_cache! unless enabled
|
||||
def self.complete((connection, enabled))
|
||||
connection.clear_query_cache
|
||||
connection.disable_query_cache! unless enabled
|
||||
|
||||
unless ActiveRecord::Base.connected? && ActiveRecord::Base.connection.transaction_open?
|
||||
ActiveRecord::Base.clear_active_connections!
|
||||
|
|
|
@ -51,6 +51,29 @@ class QueryCacheTest < ActiveRecord::TestCase
|
|||
assert !ActiveRecord::Base.connection.query_cache_enabled, "cache off"
|
||||
end
|
||||
|
||||
def test_exceptional_middleware_cleans_up_correct_cache
|
||||
connection = ActiveRecord::Base.connection
|
||||
called = false
|
||||
|
||||
mw = middleware { |env|
|
||||
Task.find 1
|
||||
Task.find 1
|
||||
assert_equal 1, connection.query_cache.length
|
||||
|
||||
# Checkin connection early
|
||||
ActiveRecord::Base.clear_active_connections!
|
||||
# Make sure ActiveRecord::Base.connection doesn't checkout the same connection
|
||||
ActiveRecord::Base.connection_pool.remove(connection)
|
||||
|
||||
called = true
|
||||
}
|
||||
mw.call({})
|
||||
|
||||
assert called
|
||||
assert_equal 0, connection.query_cache.length
|
||||
assert !connection.query_cache_enabled, "cache off"
|
||||
end
|
||||
|
||||
def test_exceptional_middleware_leaves_enabled_cache_alone
|
||||
ActiveRecord::Base.connection.enable_query_cache!
|
||||
|
||||
|
|
Loading…
Reference in a new issue