mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Fix query cache for multiple connections
Currently the query cache is only aware of one handler so once we added multiple databases switching on the handler we broke query cache for those reading connections. While #34054 is the proper fix, that fix is not straight forward and I want to make sure that the query cache isn't just broken for all other connections not in the main handler.
This commit is contained in:
parent
023a840f5f
commit
aec635dc2f
2 changed files with 27 additions and 4 deletions
|
@ -26,15 +26,22 @@ module ActiveRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.run
|
def self.run
|
||||||
ActiveRecord::Base.connection_handler.connection_pool_list.
|
pools = []
|
||||||
reject { |p| p.query_cache_enabled }.each { |p| p.enable_query_cache! }
|
|
||||||
|
ActiveRecord::Base.connection_handlers.each do |key, handler|
|
||||||
|
pools << handler.connection_pool_list.reject { |p| p.query_cache_enabled }.each { |p| p.enable_query_cache! }
|
||||||
|
end
|
||||||
|
|
||||||
|
pools.flatten
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.complete(pools)
|
def self.complete(pools)
|
||||||
pools.each { |pool| pool.disable_query_cache! }
|
pools.each { |pool| pool.disable_query_cache! }
|
||||||
|
|
||||||
ActiveRecord::Base.connection_handler.connection_pool_list.each do |pool|
|
ActiveRecord::Base.connection_handlers.each do |_, handler|
|
||||||
pool.release_connection if pool.active_connection? && !pool.connection.transaction_open?
|
handler.connection_pool_list.each do |pool|
|
||||||
|
pool.release_connection if pool.active_connection? && !pool.connection.transaction_open?
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -55,6 +55,22 @@ class QueryCacheTest < ActiveRecord::TestCase
|
||||||
assert_cache :off
|
assert_cache :off
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_query_cache_is_applied_to_connections_in_all_handlers
|
||||||
|
ActiveRecord::Base.connected_to(role: :reading) do
|
||||||
|
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations["arunit"])
|
||||||
|
end
|
||||||
|
|
||||||
|
mw = middleware { |env|
|
||||||
|
ro_conn = ActiveRecord::Base.connection_handlers[:reading].connection_pool_list.first.connection
|
||||||
|
assert_predicate ActiveRecord::Base.connection, :query_cache_enabled
|
||||||
|
assert_predicate ro_conn, :query_cache_enabled
|
||||||
|
}
|
||||||
|
|
||||||
|
mw.call({})
|
||||||
|
ensure
|
||||||
|
ActiveRecord::Base.connection_handlers = { writing: ActiveRecord::Base.default_connection_handler }
|
||||||
|
end
|
||||||
|
|
||||||
def test_query_cache_across_threads
|
def test_query_cache_across_threads
|
||||||
with_temporary_connection_pool do
|
with_temporary_connection_pool do
|
||||||
begin
|
begin
|
||||||
|
|
Loading…
Reference in a new issue