Skip to content

Commit 9a38f5f

Browse files
committed
Extract Timer for Supervisor's timed tasks
1 parent bb44f36 commit 9a38f5f

File tree

5 files changed

+55
-46
lines changed

5 files changed

+55
-46
lines changed

lib/solid_queue/supervisor.rb

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ def start(mode: :fork, load_configuration_from: nil)
99
SolidQueue.supervisor = true
1010
configuration = Configuration.new(load_from: load_configuration_from)
1111

12-
Forks.new(*configuration.processes).start
12+
Forks.new(configuration).start
1313
end
1414
end
1515

16-
def initialize(*configuration)
17-
@configuration = Array(configuration)
16+
def initialize(configuration)
17+
@configuration = configuration
1818
@processes = {}
1919
end
2020

@@ -26,7 +26,7 @@ def start
2626

2727
supervise
2828
rescue GracefulTerminationRequested
29-
graceful_termination
29+
terminate_gracefully
3030
rescue ImmediateTerminationRequested
3131
immediate_termination
3232
ensure
@@ -43,7 +43,7 @@ def boot
4343
end
4444

4545
def start_processes
46-
configuration.each { |configured_process| start_process(configured_process) }
46+
configuration.processes.each { |configured_process| start_process(configured_process) }
4747
end
4848

4949
def supervise
@@ -79,11 +79,11 @@ def shutdown
7979
delete_pidfile
8080
end
8181

82-
def graceful_termination
82+
def terminate_gracefully
8383
SolidQueue.instrument(:graceful_termination, supervisor_pid: ::Process.pid, supervised_processes: processes.keys) do |payload|
8484
term_processes
8585

86-
wait_until(SolidQueue.shutdown_timeout, -> { all_processes_terminated? }) do
86+
Timer.wait_until(SolidQueue.shutdown_timeout, -> { all_processes_terminated? }) do
8787
reap_terminated_processes
8888
end
8989

@@ -103,25 +103,5 @@ def immediate_termination
103103
def delete_pidfile
104104
@pidfile&.delete
105105
end
106-
107-
def wait_until(timeout, condition, &block)
108-
if timeout > 0
109-
deadline = monotonic_time_now + timeout
110-
111-
while monotonic_time_now < deadline && !condition.call
112-
sleep 0.1
113-
block.call
114-
end
115-
else
116-
while !condition.call
117-
sleep 0.5
118-
block.call
119-
end
120-
end
121-
end
122-
123-
def monotonic_time_now
124-
::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
125-
end
126106
end
127107
end

lib/solid_queue/supervisor/maintenance.rb

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,26 @@ module SolidQueue
22
module Supervisor::Maintenance
33
extend ActiveSupport::Concern
44

5-
private
6-
def launch_maintenance_task
7-
@maintenance_task = Concurrent::TimerTask.new(run_now: true, execution_interval: SolidQueue.process_alive_threshold) do
8-
prune_dead_processes
9-
release_orphaned_executions
10-
end
11-
@maintenance_task.execute
12-
end
5+
private
136

14-
def stop_maintenance_task
15-
@maintenance_task&.shutdown
16-
end
7+
def launch_maintenance_task
8+
@maintenance_task = Concurrent::TimerTask.new(run_now: true, execution_interval: SolidQueue.process_alive_threshold) do
9+
prune_dead_processes
10+
release_orphaned_executions
11+
end
12+
@maintenance_task.execute
13+
end
14+
15+
def stop_maintenance_task
16+
@maintenance_task&.shutdown
17+
end
1718

18-
def prune_dead_processes
19-
wrap_in_app_executor { SolidQueue::Process.prune }
20-
end
19+
def prune_dead_processes
20+
wrap_in_app_executor { SolidQueue::Process.prune }
21+
end
2122

22-
def release_orphaned_executions
23-
wrap_in_app_executor { SolidQueue::ClaimedExecution.orphaned.release_all }
24-
end
23+
def release_orphaned_executions
24+
wrap_in_app_executor { SolidQueue::ClaimedExecution.orphaned.release_all }
2525
end
26+
end
2627
end

lib/solid_queue/timer.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# frozen_string_literal: true
2+
3+
module SolidQueue
4+
module Timer
5+
extend self
6+
7+
def wait_until(timeout, condition, &block)
8+
if timeout > 0
9+
deadline = monotonic_time_now + timeout
10+
11+
while monotonic_time_now < deadline && !condition.call
12+
sleep 0.1
13+
block.call
14+
end
15+
else
16+
while !condition.call
17+
sleep 0.5
18+
block.call
19+
end
20+
end
21+
end
22+
23+
private
24+
def monotonic_time_now
25+
::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
26+
end
27+
end
28+
end

test/integration/puma/plugin_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class PumaPluginTest < ActiveSupport::TestCase
5252
end
5353

5454
test "stop puma when solid queue's supervisor dies" do
55-
supervisor = find_processes_registered_as("Supervisor").first
55+
supervisor = find_processes_registered_as("Supervisor(forks)").first
5656

5757
signal_process(supervisor.pid, :KILL)
5858
wait_for_process_termination_with_timeout(@pid)

test/unit/supervisor_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ def assert_registered_dispatcher(supervisor_pid:, **metadata)
140140

141141
def assert_registered_supervisor(pid)
142142
skip_active_record_query_cache do
143-
processes = find_processes_registered_as("Supervisor")
143+
processes = find_processes_registered_as("Supervisor(forks)")
144144
assert_equal 1, processes.count
145145
assert_nil processes.first.supervisor
146146
assert_equal pid, processes.first.pid

0 commit comments

Comments
 (0)