Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,7 @@ def lock_thread=(lock_thread)
# #connection can be called any number of times; the connection is
# held in a cache keyed by a thread.
def connection
@thread_cached_conns[connection_cache_key(@lock_thread || Thread.current)] ||= checkout
@thread_cached_conns[connection_cache_key(current_thread)] ||= checkout
end

# Returns true if there is an open connection being used for the current thread.
Expand All @@ -435,7 +435,7 @@ def connection
# #connection or #with_connection methods. Connections obtained through
# #checkout will not be detected by #active_connection?
def active_connection?
@thread_cached_conns[connection_cache_key(Thread.current)]
@thread_cached_conns[connection_cache_key(current_thread)]
end

# Signal that the thread is finished with the current connection.
Expand Down Expand Up @@ -730,6 +730,10 @@ def connection_cache_key(thread)
thread
end

def current_thread
@lock_thread || Thread.current
end

# Take control of all existing connections so a "group" action such as
# reload/disconnect can be performed safely. It is no longer enough to
# wrap it in +synchronize+ because some pool's actions are allowed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,17 +33,17 @@ def initialize(*)
end

def enable_query_cache!
@query_cache_enabled[connection_cache_key(Thread.current)] = true
@query_cache_enabled[connection_cache_key(current_thread)] = true
connection.enable_query_cache! if active_connection?
end

def disable_query_cache!
@query_cache_enabled.delete connection_cache_key(Thread.current)
@query_cache_enabled.delete connection_cache_key(current_thread)
connection.disable_query_cache! if active_connection?
end

def query_cache_enabled
@query_cache_enabled[connection_cache_key(Thread.current)]
@query_cache_enabled[connection_cache_key(current_thread)]
end
end

Expand Down
17 changes: 17 additions & 0 deletions activerecord/test/cases/query_cache_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -536,6 +536,23 @@ def test_clear_query_cache_is_called_on_all_connections
ActiveRecord::Base.connection_handlers = { writing: ActiveRecord::Base.default_connection_handler }
end

test "query cache is enabled in threads with shared connection" do
ActiveRecord::Base.connection_pool.lock_thread = true

assert_cache :off

thread_a = Thread.new do
middleware { |env|
assert_cache :clean
[200, {}, nil]
}.call({})
end

thread_a.join

ActiveRecord::Base.connection_pool.lock_thread = false
end

private
def with_temporary_connection_pool
old_pool = ActiveRecord::Base.connection_handler.retrieve_connection_pool(ActiveRecord::Base.connection_specification_name)
Expand Down