From e366ecabffe2c524abbab729b9b6af0d722fd902 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dorian=20Mari=C3=A9?= Date: Fri, 8 Mar 2024 08:43:42 +0100 Subject: [PATCH 1/2] Support nil logger and ActiveSupport::Logger not Logger FIxes #168 --- lib/solid_queue/processes/poller.rb | 2 +- test/integration/processes_poller.rb | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 test/integration/processes_poller.rb diff --git a/lib/solid_queue/processes/poller.rb b/lib/solid_queue/processes/poller.rb index aa772807..a974f20a 100644 --- a/lib/solid_queue/processes/poller.rb +++ b/lib/solid_queue/processes/poller.rb @@ -10,7 +10,7 @@ module Poller private def with_polling_volume - if SolidQueue.silence_polling? + if SolidQueue.silence_polling? && ActiveRecord::Base.logger ActiveRecord::Base.logger.silence { yield } else yield diff --git a/test/integration/processes_poller.rb b/test/integration/processes_poller.rb new file mode 100644 index 00000000..ca040ba6 --- /dev/null +++ b/test/integration/processes_poller.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +require "test_helper" + +class ProcessPollerTest < ActiveSupport::TestCase + def test_active_record_logger_nil + previous_logger = ActiveRecord::Base.logger + ActiveRecord::Base.logger = nil + pid = fork { SolidQueue::Supervisor.start } + sleep 1 + ensure + ActiveRecord::Base.logger = previous_logger + terminate_process(pid) if pid && process_exists?(pid) + end + + def test_active_record_logger_active_support_logger_dev_null + previous_logger = ActiveRecord::Base.logger + ActiveRecord::Base.logger = ActiveSupport::Logger.new("/dev/null") + pid = fork { SolidQueue::Supervisor.start } + sleep 1 + ensure + ActiveRecord::Base.logger = previous_logger + terminate_process(pid) if pid && process_exists?(pid) + end +end From be616da41a36341adb875073b98f741f47089e6e Mon Sep 17 00:00:00 2001 From: Rosa Gutierrez Date: Tue, 25 Jun 2024 22:49:02 +0200 Subject: [PATCH 2/2] Write tests for nil Active Record logger when silencing polling queries Add those as part of the tests for workers and dispatchers. --- test/integration/processes_poller.rb | 25 ------------- test/unit/dispatcher_test.rb | 52 +++++++++++++++++++--------- test/unit/worker_test.rb | 52 +++++++++++++++++++--------- 3 files changed, 72 insertions(+), 57 deletions(-) delete mode 100644 test/integration/processes_poller.rb diff --git a/test/integration/processes_poller.rb b/test/integration/processes_poller.rb deleted file mode 100644 index ca040ba6..00000000 --- a/test/integration/processes_poller.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class ProcessPollerTest < ActiveSupport::TestCase - def test_active_record_logger_nil - previous_logger = ActiveRecord::Base.logger - ActiveRecord::Base.logger = nil - pid = fork { SolidQueue::Supervisor.start } - sleep 1 - ensure - ActiveRecord::Base.logger = previous_logger - terminate_process(pid) if pid && process_exists?(pid) - end - - def test_active_record_logger_active_support_logger_dev_null - previous_logger = ActiveRecord::Base.logger - ActiveRecord::Base.logger = ActiveSupport::Logger.new("/dev/null") - pid = fork { SolidQueue::Supervisor.start } - sleep 1 - ensure - ActiveRecord::Base.logger = previous_logger - terminate_process(pid) if pid && process_exists?(pid) - end -end diff --git a/test/unit/dispatcher_test.rb b/test/unit/dispatcher_test.rb index 52ebfa7a..9d3f6cca 100644 --- a/test/unit/dispatcher_test.rb +++ b/test/unit/dispatcher_test.rb @@ -25,30 +25,35 @@ class DispatcherTest < ActiveSupport::TestCase test "polling queries are logged" do log = StringIO.new - old_logger, ActiveRecord::Base.logger = ActiveRecord::Base.logger, ActiveSupport::Logger.new(log) - old_silence_polling, SolidQueue.silence_polling = SolidQueue.silence_polling, false - - @dispatcher.start - sleep 0.5 + with_active_record_logger(ActiveSupport::Logger.new(log)) do + with_polling(silence: false) do + @dispatcher.start + sleep 0.2 + end + end assert_match /SELECT .* FROM .solid_queue_scheduled_executions. WHERE/, log.string - ensure - ActiveRecord::Base.logger = old_logger - SolidQueue.silence_polling = old_silence_polling end test "polling queries can be silenced" do log = StringIO.new - old_logger, ActiveRecord::Base.logger = ActiveRecord::Base.logger, ActiveSupport::Logger.new(log) - old_silence_polling, SolidQueue.silence_polling = SolidQueue.silence_polling, true - - @dispatcher.start - sleep 0.5 + with_active_record_logger(ActiveSupport::Logger.new(log)) do + with_polling(silence: true) do + @dispatcher.start + sleep 0.2 + end + end assert_no_match /SELECT .* FROM .solid_queue_scheduled_executions. WHERE/, log.string - ensure - ActiveRecord::Base.logger = old_logger - SolidQueue.silence_polling = old_silence_polling + end + + test "silencing polling queries when there's no Active Record logger" do + with_active_record_logger(nil) do + with_polling(silence: true) do + @dispatcher.start + sleep 0.2 + end + end end test "run more than one instance of the dispatcher" do @@ -69,4 +74,19 @@ class DispatcherTest < ActiveSupport::TestCase another_dispatcher.stop end + + private + def with_polling(silence:) + old_silence_polling, SolidQueue.silence_polling = SolidQueue.silence_polling, silence + yield + ensure + SolidQueue.silence_polling = old_silence_polling + end + + def with_active_record_logger(logger) + old_logger, ActiveRecord::Base.logger = ActiveRecord::Base.logger, logger + yield + ensure + ActiveRecord::Base.logger = old_logger + end end diff --git a/test/unit/worker_test.rb b/test/unit/worker_test.rb index 514eb8cd..16e40a64 100644 --- a/test/unit/worker_test.rb +++ b/test/unit/worker_test.rb @@ -64,30 +64,35 @@ class WorkerTest < ActiveSupport::TestCase test "polling queries are logged" do log = StringIO.new - old_logger, ActiveRecord::Base.logger = ActiveRecord::Base.logger, ActiveSupport::Logger.new(log) - old_silence_polling, SolidQueue.silence_polling = SolidQueue.silence_polling, false - - @worker.start - sleep 0.2 + with_active_record_logger(ActiveSupport::Logger.new(log)) do + with_polling(silence: false) do + @worker.start + sleep 0.2 + end + end assert_match /SELECT .* FROM .solid_queue_ready_executions. WHERE .solid_queue_ready_executions...queue_name./, log.string - ensure - ActiveRecord::Base.logger = old_logger - SolidQueue.silence_polling = old_silence_polling end test "polling queries can be silenced" do log = StringIO.new - old_logger, ActiveRecord::Base.logger = ActiveRecord::Base.logger, ActiveSupport::Logger.new(log) - old_silence_polling, SolidQueue.silence_polling = SolidQueue.silence_polling, true - - @worker.start - sleep 0.2 + with_active_record_logger(ActiveSupport::Logger.new(log)) do + with_polling(silence: true) do + @worker.start + sleep 0.2 + end + end assert_no_match /SELECT .* FROM .solid_queue_ready_executions. WHERE .solid_queue_ready_executions...queue_name./, log.string - ensure - ActiveRecord::Base.logger = old_logger - SolidQueue.silence_polling = old_silence_polling + end + + test "silencing polling queries when there's no Active Record logger" do + with_active_record_logger(nil) do + with_polling(silence: true) do + @worker.start + sleep 0.2 + end + end end test "run inline" do @@ -100,4 +105,19 @@ class WorkerTest < ActiveSupport::TestCase assert_equal 5, JobResult.where(queue_name: :background, status: "completed", value: :immediate).count end + + private + def with_polling(silence:) + old_silence_polling, SolidQueue.silence_polling = SolidQueue.silence_polling, silence + yield + ensure + SolidQueue.silence_polling = old_silence_polling + end + + def with_active_record_logger(logger) + old_logger, ActiveRecord::Base.logger = ActiveRecord::Base.logger, logger + yield + ensure + ActiveRecord::Base.logger = old_logger + end end