mirror of https://github.com/rails/rails
Merge pull request #6197 from blakesmith/connection_adapters_without_explain_support
Don't run explain on slow queries for database adapters that don't support it
This commit is contained in:
commit
296412ffa6
|
@ -6,11 +6,12 @@ module ActiveRecord
|
|||
base.mattr_accessor :auto_explain_threshold_in_seconds, instance_accessor: false
|
||||
end
|
||||
|
||||
# If auto explain is enabled, this method triggers EXPLAIN logging for the
|
||||
# queries triggered by the block if it takes more than the threshold as a
|
||||
# whole. That is, the threshold is not checked against each individual
|
||||
# query, but against the duration of the entire block. This approach is
|
||||
# convenient for relations.
|
||||
# If the database adapter supports explain and auto explain is enabled,
|
||||
# this method triggers EXPLAIN logging for the queries triggered by the
|
||||
# block if it takes more than the threshold as a whole. That is, the
|
||||
# threshold is not checked against each individual query, but against the
|
||||
# duration of the entire block. This approach is convenient for relations.
|
||||
|
||||
#
|
||||
# The available_queries_for_explain thread variable collects the queries
|
||||
# to be explained. If the value is nil, it means queries are not being
|
||||
|
@ -21,7 +22,7 @@ module ActiveRecord
|
|||
|
||||
threshold = auto_explain_threshold_in_seconds
|
||||
current = Thread.current
|
||||
if threshold && current[:available_queries_for_explain].nil?
|
||||
if connection.supports_explain? && threshold && current[:available_queries_for_explain].nil?
|
||||
begin
|
||||
queries = current[:available_queries_for_explain] = []
|
||||
start = Time.now
|
||||
|
|
|
@ -136,6 +136,13 @@ module ActiveRecord
|
|||
end
|
||||
end
|
||||
|
||||
initializer "active_record.validate_explain_support" do |app|
|
||||
if app.config.active_record[:auto_explain_threshold_in_seconds] &&
|
||||
!ActiveRecord::Base.connection.supports_explain?
|
||||
warn "auto_explain_threshold_in_seconds is set but will be ignored because your adapter does not support this feature. Please unset the configuration to avoid this warning."
|
||||
end
|
||||
end
|
||||
|
||||
# Expose database runtime to controller for logging.
|
||||
initializer "active_record.log_runtime" do |app|
|
||||
require "active_record/railties/controller_runtime"
|
||||
|
|
|
@ -108,6 +108,16 @@ if ActiveRecord::Base.connection.supports_explain?
|
|||
assert_equal expected, base.exec_explain(queries)
|
||||
end
|
||||
|
||||
def test_unsupported_connection_adapter
|
||||
connection.stubs(:supports_explain?).returns(false)
|
||||
|
||||
base.logger.expects(:warn).never
|
||||
|
||||
with_threshold(0) do
|
||||
Car.where(:name => 'honda').to_a
|
||||
end
|
||||
end
|
||||
|
||||
def test_silence_auto_explain
|
||||
base.expects(:collecting_sqls_for_explain).never
|
||||
base.logger.expects(:warn).never
|
||||
|
|
Loading…
Reference in New Issue