Skip to content

Commit b166bad

Browse files
committed
Move Signals module under Supervisor namespace, out of Processes
As it's just for the supervisor.
1 parent 386250a commit b166bad

File tree

3 files changed

+74
-72
lines changed

3 files changed

+74
-72
lines changed

lib/solid_queue/processes/signals.rb

Lines changed: 0 additions & 69 deletions
This file was deleted.

lib/solid_queue/supervisor.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
module SolidQueue
44
class Supervisor < Processes::Base
5-
include Processes::Signals
5+
include Signals
66

77
class << self
88
def start(mode: :fork, load_configuration_from: nil)
@@ -25,9 +25,9 @@ def start
2525
launch_maintenance_task
2626

2727
supervise
28-
rescue Processes::GracefulTerminationRequested
28+
rescue GracefulTerminationRequested
2929
graceful_termination
30-
rescue Processes::ImmediateTerminationRequested
30+
rescue ImmediateTerminationRequested
3131
immediate_termination
3232
ensure
3333
run_callbacks(:shutdown) { shutdown }

lib/solid_queue/supervisor/signals.rb

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# frozen_string_literal: true
2+
3+
module SolidQueue
4+
class Supervisor
5+
class GracefulTerminationRequested < Interrupt; end
6+
class ImmediateTerminationRequested < Interrupt; end
7+
8+
module Signals
9+
extend ActiveSupport::Concern
10+
11+
private
12+
SIGNALS = %i[ QUIT INT TERM ]
13+
14+
def register_signal_handlers
15+
SIGNALS.each do |signal|
16+
trap(signal) do
17+
signal_queue << signal
18+
interrupt
19+
end
20+
end
21+
end
22+
23+
def restore_default_signal_handlers
24+
SIGNALS.each do |signal|
25+
trap(signal, :DEFAULT)
26+
end
27+
end
28+
29+
def process_signal_queue
30+
while signal = signal_queue.shift
31+
handle_signal(signal)
32+
end
33+
end
34+
35+
def handle_signal(signal)
36+
case signal
37+
when :TERM, :INT
38+
request_graceful_termination
39+
when :QUIT
40+
request_immediate_termination
41+
else
42+
SolidQueue.instrument :unhandled_signal_error, signal: signal
43+
end
44+
end
45+
46+
def request_graceful_termination
47+
raise GracefulTerminationRequested
48+
end
49+
50+
def request_immediate_termination
51+
raise ImmediateTerminationRequested
52+
end
53+
54+
def signal_processes(pids, signal)
55+
pids.each do |pid|
56+
signal_process pid, signal
57+
end
58+
end
59+
60+
def signal_process(pid, signal)
61+
::Process.kill signal, pid
62+
rescue Errno::ESRCH
63+
# Ignore, process died before
64+
end
65+
66+
def signal_queue
67+
@signal_queue ||= []
68+
end
69+
end
70+
end
71+
end

0 commit comments

Comments
 (0)