resqued 0.7.0 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/exe/resqued +1 -0
- data/lib/resqued/listener_proxy.rb +1 -0
- data/lib/resqued/master.rb +28 -1
- data/lib/resqued/test_case.rb +84 -0
- data/lib/resqued/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dab65ebe5befd4cb605dc27208740e8c11079ca6
|
4
|
+
data.tar.gz: 73d6a230a3273aaf351e55008a01fe4a0a479944
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8215347e188cbd78fef8561cfaed3ae9e00156de9bb255dd3a2fc90d3b2dbe3dc30870ad44e22a95e73b57f798be7cd169133b07779c93c5a180394b0be242e
|
7
|
+
data.tar.gz: 249de2ac4fb9a5d40c97322b9d8176907bee59748051f22679cd1bba8eff6154256cd4b3b6d330097e3aaf790798185eae503240dc0589a5f5288f20007a95f2
|
data/exe/resqued
CHANGED
data/lib/resqued/master.rb
CHANGED
@@ -19,6 +19,7 @@ module Resqued
|
|
19
19
|
def initialize(options)
|
20
20
|
@config_paths = options.fetch(:config_paths)
|
21
21
|
@pidfile = options.fetch(:master_pidfile) { nil }
|
22
|
+
@status_pipe = options.fetch(:status_pipe) { nil }
|
22
23
|
@listener_backoff = Backoff.new
|
23
24
|
@listeners_created = 0
|
24
25
|
end
|
@@ -112,6 +113,7 @@ module Resqued
|
|
112
113
|
return if @current_listener || @listener_backoff.wait?
|
113
114
|
@current_listener = ListenerProxy.new(:config_paths => @config_paths, :running_workers => all_listeners.map { |l| l.running_workers }.flatten, :listener_id => next_listener_id)
|
114
115
|
@current_listener.run
|
116
|
+
listener_status @current_listener, 'start'
|
115
117
|
@listener_backoff.started
|
116
118
|
listener_pids[@current_listener.pid] = @current_listener
|
117
119
|
write_procline
|
@@ -127,10 +129,16 @@ module Resqued
|
|
127
129
|
end
|
128
130
|
end
|
129
131
|
|
132
|
+
# Listener message: A worker just started working.
|
133
|
+
def worker_started(pid)
|
134
|
+
worker_status(pid, 'start')
|
135
|
+
end
|
136
|
+
|
130
137
|
# Listener message: A worker just stopped working.
|
131
138
|
#
|
132
139
|
# Forwards the message to the other listeners.
|
133
140
|
def worker_finished(pid)
|
141
|
+
worker_status(pid, 'stop')
|
134
142
|
all_listeners.each do |other|
|
135
143
|
other.worker_finished(pid)
|
136
144
|
end
|
@@ -140,6 +148,7 @@ module Resqued
|
|
140
148
|
#
|
141
149
|
# Promotes a booting listener to be the current listener.
|
142
150
|
def listener_running(listener)
|
151
|
+
listener_status(listener, 'ready')
|
143
152
|
if listener == @current_listener
|
144
153
|
kill_listener(:QUIT, @last_good_listener)
|
145
154
|
@last_good_listener = nil
|
@@ -189,7 +198,9 @@ module Resqued
|
|
189
198
|
@listener_backoff.died
|
190
199
|
@current_listener = nil
|
191
200
|
end
|
192
|
-
listener_pids.delete(lpid)
|
201
|
+
dead_listener = listener_pids.delete(lpid)
|
202
|
+
listener_status dead_listener, 'stop'
|
203
|
+
dead_listener.dispose
|
193
204
|
write_procline
|
194
205
|
else
|
195
206
|
return
|
@@ -234,5 +245,21 @@ module Resqued
|
|
234
245
|
def write_procline
|
235
246
|
$0 = "#{procline_version} master [gen #{@listeners_created}] [#{listener_pids.size} running] #{ARGV.join(' ')}"
|
236
247
|
end
|
248
|
+
|
249
|
+
def listener_status(listener, status)
|
250
|
+
if listener && listener.pid
|
251
|
+
status_message('listener', listener.pid, status)
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
def worker_status(pid, status)
|
256
|
+
status_message('worker', pid, status)
|
257
|
+
end
|
258
|
+
|
259
|
+
def status_message(type, pid, status)
|
260
|
+
if @status_pipe
|
261
|
+
@status_pipe.write("#{type},#{pid},#{status}\n")
|
262
|
+
end
|
263
|
+
end
|
237
264
|
end
|
238
265
|
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# This file includes example assertions for your resqued configuration.
|
2
|
+
#
|
3
|
+
# assert_resqued 'config/resqued/environment.rb', 'config/resqued/pool-a.rb'
|
4
|
+
module Resqued
|
5
|
+
module TestCase
|
6
|
+
module ForkToStart
|
7
|
+
# Public: Fork a process that spins up a Resqued::Master process directly.
|
8
|
+
def assert_resqued(*configs)
|
9
|
+
options = configs.last.is_a?(Hash) ? configs.pop : {}
|
10
|
+
check_workers = options.fetch(:expect_workers, false)
|
11
|
+
worker_timeout = options.fetch(:worker_timeout, 5)
|
12
|
+
resqued_bin = options.fetch(:resqued_bin) { `which resqued || bundle exec which resqued`.chomp }
|
13
|
+
status = IO.pipe
|
14
|
+
if pid = fork
|
15
|
+
message = read_status_from_resqued(:pipe => status[0], :pid => pid)
|
16
|
+
if message !~ /^listener,\d+,start$/
|
17
|
+
fail "Expected listener to start, but received #{message.inspect}"
|
18
|
+
end
|
19
|
+
message = read_status_from_resqued(:pipe => status[0], :pid => pid)
|
20
|
+
if message !~ /^listener,\d+,ready$/
|
21
|
+
fail "Expected listener to be ready, but received #{message.inspect}"
|
22
|
+
end
|
23
|
+
if check_workers
|
24
|
+
start = Time.now
|
25
|
+
workers_started = 0
|
26
|
+
loop do
|
27
|
+
elapsed = Time.now - start
|
28
|
+
time_remaining = worker_timeout - elapsed
|
29
|
+
break unless time_remaining > 0
|
30
|
+
if message = read_status_from_resqued(:pipe => status[0], :pid => pid, :timeout => time_remaining)
|
31
|
+
if message =~ /worker,\d+,start/
|
32
|
+
workers_started = workers_started + 1
|
33
|
+
else
|
34
|
+
fail "Expected to see workers starting, instead saw #{message.inspect}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
if workers_started == 0
|
39
|
+
fail "Expected at least one worker to start, but none did"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
else
|
43
|
+
$0 = "resqued master for #{$0}"
|
44
|
+
unless ENV['NOISY_RESQUED_TESTS']
|
45
|
+
devnull = File.open('/dev/null', 'w')
|
46
|
+
$stdout.reopen(devnull)
|
47
|
+
$stderr.reopen(devnull)
|
48
|
+
end
|
49
|
+
begin
|
50
|
+
# This should match how `exe/resqued` starts the master process.
|
51
|
+
require 'resqued'
|
52
|
+
Resqued::START_CTX['$0'] = resqued_bin
|
53
|
+
Resqued::Master.new(:config_paths => configs, :status_pipe => status[1]).run
|
54
|
+
rescue Object => e
|
55
|
+
# oops
|
56
|
+
end
|
57
|
+
exit! # Do not make this look like a failing test.
|
58
|
+
end
|
59
|
+
ensure
|
60
|
+
begin
|
61
|
+
Process.kill :QUIT, pid
|
62
|
+
Process.waitpid2(pid) if pid
|
63
|
+
rescue Errno::ESRCH, Errno::ECHILD
|
64
|
+
# already dead.
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def read_status_from_resqued(options)
|
69
|
+
status = options.fetch(:pipe)
|
70
|
+
pid = options.fetch(:pid)
|
71
|
+
timeout = options[:timeout]
|
72
|
+
loop do
|
73
|
+
if IO.select([status], nil, nil, timeout || 2)
|
74
|
+
return status.readline.chomp
|
75
|
+
elsif dead = Process.waitpid2(pid, Process::WNOHANG)
|
76
|
+
fail "Resqued stopped too soon."
|
77
|
+
elsif timeout
|
78
|
+
return nil
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
data/lib/resqued/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resqued
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Burke
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: kgio
|
@@ -145,6 +145,7 @@ files:
|
|
145
145
|
- lib/resqued/pidfile.rb
|
146
146
|
- lib/resqued/procline_version.rb
|
147
147
|
- lib/resqued/sleepy.rb
|
148
|
+
- lib/resqued/test_case.rb
|
148
149
|
- lib/resqued/version.rb
|
149
150
|
- lib/resqued/worker.rb
|
150
151
|
- lib/resqued.rb
|