Skip to content

Commit f6d980f

Browse files
committed
Simplify termination handling for forked supervisor
No need to raise exceptions and rescue them, we can just check if a stop has been requested and terminate accordingly.
1 parent c7caf01 commit f6d980f

File tree

4 files changed

+26
-32
lines changed

4 files changed

+26
-32
lines changed

lib/solid_queue/processes/runnable.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ module Runnable
77
attr_writer :mode
88

99
def start
10-
@stopping = false
10+
@stopped = false
1111

1212
SolidQueue.instrument(:start_process, process: self) do
1313
run_callbacks(:boot) { boot }
@@ -21,7 +21,7 @@ def start
2121
end
2222

2323
def stop
24-
@stopping = true
24+
@stopped = true
2525
@thread&.join
2626
end
2727

@@ -40,15 +40,15 @@ def boot
4040
end
4141

4242
def shutting_down?
43-
stopping? || supervisor_went_away? || finished?
43+
stopped? || supervisor_went_away? || finished?
4444
end
4545

4646
def run
4747
raise NotImplementedError
4848
end
4949

50-
def stopping?
51-
@stopping
50+
def stopped?
51+
@stopped
5252
end
5353

5454
def finished?

lib/solid_queue/supervisor.rb

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@ module SolidQueue
44
class Supervisor < Processes::Base
55
include Maintenance
66

7-
class GracefulTerminationRequested < Interrupt; end
8-
class ImmediateTerminationRequested < Interrupt; end
9-
107
class << self
118
def start(mode: :fork, load_configuration_from: nil)
129
SolidQueue.supervisor = true
@@ -26,26 +23,35 @@ def start
2623
start_processes
2724
launch_maintenance_task
2825

29-
supervise
30-
rescue GracefulTerminationRequested
31-
terminate_gracefully
32-
rescue ImmediateTerminationRequested
33-
terminate_immediately
26+
loop do
27+
break if stopped?
28+
29+
supervise
30+
end
3431
ensure
3532
run_callbacks(:shutdown) { shutdown }
3633
end
3734

35+
def stop
36+
@stopped = true
37+
end
38+
3839
private
3940
attr_reader :configuration
4041

4142
def boot
43+
@stopped = false
4244
sync_std_streams
4345
end
4446

4547
def start_processes
4648
configuration.processes.each { |configured_process| start_process(configured_process) }
4749
end
4850

51+
def stopped?
52+
@stopped
53+
end
54+
4955
def supervise
5056
raise NotImplementedError
5157
end
@@ -54,12 +60,6 @@ def start_process(configured_process)
5460
raise NotImplementedError
5561
end
5662

57-
def terminate_gracefully
58-
end
59-
60-
def terminate_immediately
61-
end
62-
6363
def shutdown
6464
stop_maintenance_task
6565
end

lib/solid_queue/supervisor/fork_supervisor.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ def kind
1717
attr_reader :forks
1818

1919
def supervise
20-
loop do
21-
procline "supervising #{forks.keys.join(", ")}"
20+
procline "supervising #{forks.keys.join(", ")}"
21+
process_signal_queue
2222

23-
process_signal_queue
23+
unless stopped?
2424
reap_and_replace_terminated_forks
2525
interruptible_sleep(1.second)
2626
end

lib/solid_queue/supervisor/signals.rb

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,22 +37,16 @@ def process_signal_queue
3737
def handle_signal(signal)
3838
case signal
3939
when :TERM, :INT
40-
request_graceful_termination
40+
stop
41+
terminate_gracefully
4142
when :QUIT
42-
request_immediate_termination
43+
stop
44+
terminate_immediately
4345
else
4446
SolidQueue.instrument :unhandled_signal_error, signal: signal
4547
end
4648
end
4749

48-
def request_graceful_termination
49-
raise GracefulTerminationRequested
50-
end
51-
52-
def request_immediate_termination
53-
raise ImmediateTerminationRequested
54-
end
55-
5650
def signal_processes(pids, signal)
5751
pids.each do |pid|
5852
signal_process pid, signal

0 commit comments

Comments
 (0)