diff --git a/lib/puma/plugin/solid_queue.rb b/lib/puma/plugin/solid_queue.rb index e0aa60a1..5c1d938a 100644 --- a/lib/puma/plugin/solid_queue.rb +++ b/lib/puma/plugin/solid_queue.rb @@ -7,15 +7,15 @@ def start(launcher) @log_writer = launcher.log_writer @puma_pid = $$ + in_background do + monitor_solid_queue + end + launcher.events.on_booted do @solid_queue_pid = fork do Thread.new { monitor_puma } SolidQueue::Supervisor.start(mode: :all) end - - in_background do - monitor_solid_queue - end end launcher.events.on_stopped { stop_solid_queue } @@ -51,12 +51,18 @@ def monitor(process_dead, message) end def solid_queue_dead? - Process.waitpid(solid_queue_pid, Process::WNOHANG) + if solid_queue_started? + Process.waitpid(solid_queue_pid, Process::WNOHANG) + end false rescue Errno::ECHILD, Errno::ESRCH true end + def solid_queue_started? + solid_queue_pid.present? + end + def puma_dead? Process.ppid != puma_pid end diff --git a/test/integration/puma/plugin_test.rb b/test/integration/puma/plugin_test.rb index 99a1f627..c808c316 100644 --- a/test/integration/puma/plugin_test.rb +++ b/test/integration/puma/plugin_test.rb @@ -26,7 +26,8 @@ class PumaPluginTest < ActiveSupport::TestCase end teardown do - terminate_process(@pid, signal: :INT) + terminate_process(@pid, signal: :INT) if process_exists?(@pid) + wait_for_registered_processes 0, timeout: 1.second JobResult.delete_all @@ -49,4 +50,13 @@ class PumaPluginTest < ActiveSupport::TestCase wait_for_jobs_to_finish_for(2.seconds) assert_equal 1, JobResult.where(queue_name: :background, status: "completed", value: :puma_plugin).count end + + test "stop puma when solid queue's supervisor dies" do + supervisor = find_processes_registered_as("Supervisor").first + + signal_process(supervisor.pid, :KILL) + wait_for_process_termination_with_timeout(@pid) + + assert_not process_exists?(@pid) + end end