diff --git a/app/models/solid_queue/record.rb b/app/models/solid_queue/record.rb index d73e41b2..d88b833c 100644 --- a/app/models/solid_queue/record.rb +++ b/app/models/solid_queue/record.rb @@ -6,6 +6,11 @@ class Record < ActiveRecord::Base connects_to(**SolidQueue.connects_to) if SolidQueue.connects_to + def self.clear_all_connections! + self.connection_handler.clear_all_connections!(:writing) + self.connection_handler.clear_all_connections!(:reading) + end + def self.non_blocking_lock if SolidQueue.use_skip_locked lock(Arel.sql("FOR UPDATE SKIP LOCKED")) diff --git a/lib/solid_queue.rb b/lib/solid_queue.rb index 02b88d05..fb90e946 100644 --- a/lib/solid_queue.rb +++ b/lib/solid_queue.rb @@ -20,6 +20,8 @@ module SolidQueue extend self + ForkSafety # add fork safety hooks + DEFAULT_LOGGER = ActiveSupport::Logger.new($stdout) mattr_accessor :logger, default: DEFAULT_LOGGER diff --git a/lib/solid_queue/fork_safety.rb b/lib/solid_queue/fork_safety.rb new file mode 100644 index 00000000..2c6abd53 --- /dev/null +++ b/lib/solid_queue/fork_safety.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module SolidQueue + module ForkSafety + def _fork + Record.clear_all_connections! + + pid = super + + pid + end + end +end + +Process.singleton_class.prepend(SolidQueue::ForkSafety) diff --git a/test/integration/processes_lifecycle_test.rb b/test/integration/processes_lifecycle_test.rb index ebb1100c..69086761 100644 --- a/test/integration/processes_lifecycle_test.rb +++ b/test/integration/processes_lifecycle_test.rb @@ -127,7 +127,7 @@ class ProcessesLifecycleTest < ActiveSupport::TestCase signal_process(@pid, :TERM, wait: 0.5) - sleep(SolidQueue.shutdown_timeout + 0.5.second) + sleep(SolidQueue.shutdown_timeout + 0.1.second) assert_completed_job_results("no pause") assert_job_status(no_pause, :finished)