forked from rails/solid_queue
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsolid_queue.rb
More file actions
85 lines (71 loc) · 1.97 KB
/
Copy pathsolid_queue.rb
File metadata and controls
85 lines (71 loc) · 1.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
require "puma/plugin"
Puma::Plugin.create do
attr_reader :puma_pid, :solid_queue_pid, :log_writer, :solid_queue_supervisor
def start(launcher)
@log_writer = launcher.log_writer
@puma_pid = $$
in_background do
monitor_solid_queue
end
if Gem::Version.new(Puma::Const::VERSION) < Gem::Version.new("7")
launcher.events.on_booted do
@solid_queue_pid = fork do
Thread.new { monitor_puma }
SolidQueue::Supervisor.start
end
end
launcher.events.on_stopped { stop_solid_queue }
launcher.events.on_restart { stop_solid_queue }
else
launcher.events.after_booted do
@solid_queue_pid = fork do
Thread.new { monitor_puma }
SolidQueue::Supervisor.start
end
end
launcher.events.after_stopped { stop_solid_queue }
launcher.events.before_restart { stop_solid_queue }
end
end
private
def stop_solid_queue
Process.waitpid(solid_queue_pid, Process::WNOHANG)
log "Stopping Solid Queue..."
Process.kill(:INT, solid_queue_pid) if solid_queue_pid
Process.wait(solid_queue_pid)
rescue Errno::ECHILD, Errno::ESRCH
end
def monitor_puma
monitor(:puma_dead?, "Detected Puma has gone away, stopping Solid Queue...")
end
def monitor_solid_queue
monitor(:solid_queue_dead?, "Detected Solid Queue has gone away, stopping Puma...")
end
def monitor(process_dead, message)
loop do
if send(process_dead)
log message
Process.kill(:INT, $$)
break
end
sleep 2
end
end
def solid_queue_dead?
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
def log(...)
log_writer.log(...)
end
end