diff options
author | Xavier Noria <fxn@hashref.com> | 2012-11-26 07:43:43 -0800 |
---|---|---|
committer | Xavier Noria <fxn@hashref.com> | 2012-11-26 07:43:43 -0800 |
commit | 296412ffa6c52ea30ffcab7ec1e508ac43c9193e (patch) | |
tree | 2f01efdab12b875f29de19faebbd5289ea74d408 | |
parent | 3ec443086b345cd6f2c1974a6d1ee4dd9f8fdb3e (diff) | |
parent | 50e86135287a9e573d6f7afa30550f9b3ab90137 (diff) | |
download | rails-296412ffa6c52ea30ffcab7ec1e508ac43c9193e.tar.gz rails-296412ffa6c52ea30ffcab7ec1e508ac43c9193e.tar.bz2 rails-296412ffa6c52ea30ffcab7ec1e508ac43c9193e.zip |
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
-rw-r--r-- | activerecord/lib/active_record/explain.rb | 13 | ||||
-rw-r--r-- | activerecord/lib/active_record/railtie.rb | 7 | ||||
-rw-r--r-- | activerecord/test/cases/explain_test.rb | 10 |
3 files changed, 24 insertions, 6 deletions
diff --git a/activerecord/lib/active_record/explain.rb b/activerecord/lib/active_record/explain.rb index af772996f1..70683eb731 100644 --- a/activerecord/lib/active_record/explain.rb +++ b/activerecord/lib/active_record/explain.rb @@ -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 diff --git a/activerecord/lib/active_record/railtie.rb b/activerecord/lib/active_record/railtie.rb index 5464ca6066..a73473f59c 100644 --- a/activerecord/lib/active_record/railtie.rb +++ b/activerecord/lib/active_record/railtie.rb @@ -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" diff --git a/activerecord/test/cases/explain_test.rb b/activerecord/test/cases/explain_test.rb index 6dce8ccdd1..a7e5fdf709 100644 --- a/activerecord/test/cases/explain_test.rb +++ b/activerecord/test/cases/explain_test.rb @@ -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 |