backburner-allq 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.travis.yml +29 -0
- data/CHANGELOG.md +133 -0
- data/CONTRIBUTING.md +37 -0
- data/Gemfile +4 -0
- data/HOOKS.md +99 -0
- data/LICENSE +22 -0
- data/README.md +658 -0
- data/Rakefile +17 -0
- data/TODO +4 -0
- data/backburner-allq.gemspec +26 -0
- data/bin/backburner +7 -0
- data/circle.yml +3 -0
- data/deploy.sh +3 -0
- data/examples/custom.rb +25 -0
- data/examples/demo.rb +60 -0
- data/examples/god.rb +46 -0
- data/examples/hooked.rb +87 -0
- data/examples/retried.rb +31 -0
- data/examples/simple.rb +43 -0
- data/examples/stress.rb +31 -0
- data/lib/backburner.rb +75 -0
- data/lib/backburner/allq_wrapper.rb +317 -0
- data/lib/backburner/async_proxy.rb +25 -0
- data/lib/backburner/cli.rb +53 -0
- data/lib/backburner/configuration.rb +48 -0
- data/lib/backburner/connection.rb +157 -0
- data/lib/backburner/helpers.rb +193 -0
- data/lib/backburner/hooks.rb +53 -0
- data/lib/backburner/job.rb +118 -0
- data/lib/backburner/logger.rb +53 -0
- data/lib/backburner/performable.rb +95 -0
- data/lib/backburner/queue.rb +145 -0
- data/lib/backburner/tasks.rb +54 -0
- data/lib/backburner/version.rb +3 -0
- data/lib/backburner/worker.rb +221 -0
- data/lib/backburner/workers/forking.rb +52 -0
- data/lib/backburner/workers/simple.rb +29 -0
- data/lib/backburner/workers/threading.rb +163 -0
- data/lib/backburner/workers/threads_on_fork.rb +263 -0
- data/test/async_proxy_test.rb +36 -0
- data/test/back_burner_test.rb +88 -0
- data/test/connection_test.rb +179 -0
- data/test/fixtures/hooked.rb +122 -0
- data/test/fixtures/test_fork_jobs.rb +72 -0
- data/test/fixtures/test_forking_jobs.rb +56 -0
- data/test/fixtures/test_jobs.rb +87 -0
- data/test/fixtures/test_queue_settings.rb +14 -0
- data/test/helpers/templogger.rb +22 -0
- data/test/helpers_test.rb +278 -0
- data/test/hooks_test.rb +112 -0
- data/test/job_test.rb +185 -0
- data/test/logger_test.rb +44 -0
- data/test/performable_test.rb +88 -0
- data/test/queue_test.rb +69 -0
- data/test/test_helper.rb +128 -0
- data/test/worker_test.rb +157 -0
- data/test/workers/forking_worker_test.rb +181 -0
- data/test/workers/simple_worker_test.rb +350 -0
- data/test/workers/threading_worker_test.rb +104 -0
- data/test/workers/threads_on_fork_worker_test.rb +484 -0
- metadata +217 -0
data/test/test_helper.rb
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'tempfile'
|
3
|
+
require 'minitest/autorun'
|
4
|
+
begin
|
5
|
+
require 'mocha/setup'
|
6
|
+
rescue LoadError
|
7
|
+
require 'mocha'
|
8
|
+
end
|
9
|
+
$LOAD_PATH.unshift File.expand_path("lib")
|
10
|
+
require 'backburner'
|
11
|
+
require File.expand_path('../helpers/templogger', __FILE__)
|
12
|
+
|
13
|
+
# Configure Backburner
|
14
|
+
Backburner.configure do |config|
|
15
|
+
config.beanstalk_url = "beanstalk://127.0.0.1"
|
16
|
+
config.tube_namespace = "demo.test"
|
17
|
+
end
|
18
|
+
|
19
|
+
## Kernel Extensions
|
20
|
+
require 'stringio'
|
21
|
+
|
22
|
+
module Kernel
|
23
|
+
# Redirect standard out, standard error and the buffered logger for sprinkle to StringIO
|
24
|
+
# capture_stdout { any_commands; you_want } => "all output from the commands"
|
25
|
+
def capture_stdout
|
26
|
+
if ENV['DEBUG'] # Skip if debug mode
|
27
|
+
yield
|
28
|
+
return ""
|
29
|
+
end
|
30
|
+
|
31
|
+
out = StringIO.new
|
32
|
+
$stdout = out
|
33
|
+
$stderr = out
|
34
|
+
yield
|
35
|
+
return out.string
|
36
|
+
ensure
|
37
|
+
$stdout = STDOUT
|
38
|
+
$stderr = STDERR
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class User
|
43
|
+
attr_accessor :id, :name
|
44
|
+
|
45
|
+
def initialize(id, name)
|
46
|
+
@id, @name = id, name
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class MiniTest::Spec
|
51
|
+
class << self
|
52
|
+
alias :should :it
|
53
|
+
alias :context :describe
|
54
|
+
end
|
55
|
+
alias :assert_no_match :refute_match
|
56
|
+
alias :assert_not_nil :refute_nil
|
57
|
+
alias :assert_not_equal :refute_equal
|
58
|
+
|
59
|
+
# assert_same_elements([:a, :b, :c], [:c, :a, :b]) => passes
|
60
|
+
def assert_same_elements(a1, a2, msg = nil)
|
61
|
+
[:select, :inject, :size].each do |m|
|
62
|
+
[a1, a2].each {|a| assert_respond_to(a, m, "Are you sure that #{a.inspect} is an array? It doesn't respond to #{m}.") }
|
63
|
+
end
|
64
|
+
|
65
|
+
assert a1h = a1.inject({}) { |h,e| h[e] ||= a1.select { |i| i == e }.size; h }
|
66
|
+
assert a2h = a2.inject({}) { |h,e| h[e] ||= a2.select { |i| i == e }.size; h }
|
67
|
+
|
68
|
+
assert_equal(a1h, a2h, msg)
|
69
|
+
end
|
70
|
+
|
71
|
+
# assert_contains(['a', '1'], /\d/) => passes
|
72
|
+
# assert_contains(['a', '1'], 'a') => passes
|
73
|
+
# assert_contains(['a', '1'], /not there/) => fails
|
74
|
+
def assert_contains(collection, x, extra_msg = "")
|
75
|
+
collection = [collection] unless collection.is_a?(Array)
|
76
|
+
msg = "#{x.inspect} not found in #{collection.to_a.inspect} #{extra_msg}"
|
77
|
+
case x
|
78
|
+
when Regexp
|
79
|
+
assert(collection.detect { |e| e =~ x }, msg)
|
80
|
+
else
|
81
|
+
assert(collection.include?(x), msg)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# silenced(5) { ... }
|
86
|
+
def silenced(time=3, &block)
|
87
|
+
Timeout::timeout(time) { capture_stdout(&block) }
|
88
|
+
end
|
89
|
+
|
90
|
+
def beanstalk_connection
|
91
|
+
Backburner::Connection.new(Backburner.configuration.beanstalk_url)
|
92
|
+
end
|
93
|
+
|
94
|
+
# pop_one_job(tube_name)
|
95
|
+
def pop_one_job(tube_name=Backburner.configuration.primary_queue)
|
96
|
+
tube_name = [Backburner.configuration.tube_namespace, tube_name].join(".")
|
97
|
+
connection = beanstalk_connection
|
98
|
+
connection.tubes.watch!(tube_name)
|
99
|
+
silenced(3) { @res = connection.tubes.reserve }
|
100
|
+
yield @res, Backburner.configuration.job_parser_proc.call(@res.body)
|
101
|
+
ensure
|
102
|
+
connection.close if connection
|
103
|
+
end
|
104
|
+
|
105
|
+
# clear_jobs!('foo')
|
106
|
+
def clear_jobs!(*tube_names)
|
107
|
+
connection = beanstalk_connection
|
108
|
+
tube_names.each do |tube_name|
|
109
|
+
expanded_name = [Backburner.configuration.tube_namespace, tube_name].join(".")
|
110
|
+
connection.tubes.find(expanded_name).clear
|
111
|
+
end
|
112
|
+
ensure
|
113
|
+
connection.close if connection
|
114
|
+
end
|
115
|
+
|
116
|
+
# Simulates a broken connection for any Beaneater::Connection. Will
|
117
|
+
# simulate a restored connection after `reconnects_after`. This is expected
|
118
|
+
# to be used when ensuring a Beaneater connection is open, therefore
|
119
|
+
def simulate_disconnect(connection, reconnects_after = 2)
|
120
|
+
connection.beanstalk.connection.connection.expects(:closed? => true)
|
121
|
+
returns = Array.new(reconnects_after - 1, stub('TCPSocket'))
|
122
|
+
returns.each do |socket|
|
123
|
+
result = (socket != returns.last)
|
124
|
+
socket.stubs(:closed? => result)
|
125
|
+
end
|
126
|
+
TCPSocket.expects(:new).times(returns.size).returns(*returns)
|
127
|
+
end
|
128
|
+
end # MiniTest::Spec
|
data/test/worker_test.rb
ADDED
@@ -0,0 +1,157 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
require File.expand_path('../fixtures/test_jobs', __FILE__)
|
3
|
+
require File.expand_path('../fixtures/hooked', __FILE__)
|
4
|
+
|
5
|
+
describe "Backburner::Worker module" do
|
6
|
+
before do
|
7
|
+
Backburner.default_queues.clear
|
8
|
+
clear_jobs!(Backburner.configuration.primary_queue, "test-plain", "test.bar", "bar.baz.foo")
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "for enqueue class method" do
|
12
|
+
it "should support enqueuing plain job" do
|
13
|
+
Backburner::Worker.enqueue TestPlainJob, [7, 9], :ttr => 100, :pri => 2000
|
14
|
+
pop_one_job("test-plain") do |job, body|
|
15
|
+
assert_equal "TestPlainJob", body["class"]
|
16
|
+
assert_equal [7, 9], body["args"]
|
17
|
+
assert_equal 100, job.ttr
|
18
|
+
assert_equal 2000, job.pri
|
19
|
+
end
|
20
|
+
end # plain
|
21
|
+
|
22
|
+
it "should support enqueuing job with class queue priority" do
|
23
|
+
Backburner::Worker.enqueue TestJob, [3, 4], :ttr => 100
|
24
|
+
pop_one_job do |job, body|
|
25
|
+
assert_equal "TestJob", body["class"]
|
26
|
+
assert_equal [3, 4], body["args"]
|
27
|
+
assert_equal 100, job.ttr
|
28
|
+
assert_equal 100, job.pri
|
29
|
+
end
|
30
|
+
end # queue priority
|
31
|
+
|
32
|
+
it "should support enqueuing job with specified named priority" do
|
33
|
+
Backburner::Worker.enqueue TestJob, [3, 4], :ttr => 100, :pri => 'high'
|
34
|
+
pop_one_job do |job, body|
|
35
|
+
assert_equal "TestJob", body["class"]
|
36
|
+
assert_equal [3, 4], body["args"]
|
37
|
+
assert_equal 100, job.ttr
|
38
|
+
assert_equal 0, job.pri
|
39
|
+
end
|
40
|
+
end # queue named priority
|
41
|
+
|
42
|
+
it "should support enqueuing job with class queue respond_timeout" do
|
43
|
+
Backburner::Worker.enqueue TestJob, [3, 4]
|
44
|
+
pop_one_job do |job, body|
|
45
|
+
assert_equal "TestJob", body["class"]
|
46
|
+
assert_equal [3, 4], body["args"]
|
47
|
+
assert_equal 300, job.ttr
|
48
|
+
assert_equal 100, job.pri
|
49
|
+
end
|
50
|
+
end # queue respond_timeout
|
51
|
+
|
52
|
+
it "should support enqueuing job with custom queue" do
|
53
|
+
Backburner::Worker.enqueue TestJob, [6, 7], :queue => "test.bar", :pri => 5000
|
54
|
+
pop_one_job("test.bar") do |job, body|
|
55
|
+
assert_equal "TestJob", body["class"]
|
56
|
+
assert_equal [6, 7], body["args"]
|
57
|
+
assert_equal 0, job.delay
|
58
|
+
assert_equal 5000, job.pri
|
59
|
+
assert_equal 300, job.ttr
|
60
|
+
end
|
61
|
+
end # custom
|
62
|
+
|
63
|
+
it "should support async job" do
|
64
|
+
TestAsyncJob.async(:ttr => 100, :queue => "bar.baz.foo").foo(10, 5)
|
65
|
+
pop_one_job("bar.baz.foo") do |job, body|
|
66
|
+
assert_equal "TestAsyncJob", body["class"]
|
67
|
+
assert_equal [nil, "foo", 10, 5], body["args"]
|
68
|
+
assert_equal 100, job.ttr
|
69
|
+
assert_equal Backburner.configuration.default_priority, job.pri
|
70
|
+
end
|
71
|
+
end # async
|
72
|
+
|
73
|
+
it "should support enqueueing job with lambda queue" do
|
74
|
+
expected_queue_name = TestLambdaQueueJob.calculated_queue_name
|
75
|
+
Backburner::Worker.enqueue TestLambdaQueueJob, [6, 7], :queue => lambda { |klass| klass.calculated_queue_name }
|
76
|
+
pop_one_job(expected_queue_name) do |job, body|
|
77
|
+
assert_equal "TestLambdaQueueJob", body["class"]
|
78
|
+
assert_equal [6, 7], body["args"]
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end # enqueue
|
82
|
+
|
83
|
+
describe "for start class method" do
|
84
|
+
it "should initialize and start the worker instance" do
|
85
|
+
ech = stub
|
86
|
+
Backburner::Worker.expects(:new).with("foo").returns(ech)
|
87
|
+
ech.expects(:start)
|
88
|
+
Backburner::Worker.start("foo")
|
89
|
+
end
|
90
|
+
end # start
|
91
|
+
|
92
|
+
describe "for tube_names accessor" do
|
93
|
+
before do
|
94
|
+
Backburner.default_queues << "baz"
|
95
|
+
Backburner.default_queues << "bam"
|
96
|
+
end
|
97
|
+
|
98
|
+
it "supports retrieving tubes" do
|
99
|
+
worker = Backburner::Worker.new(["foo", "bar"])
|
100
|
+
assert_equal ["foo", "bar"], worker.tube_names
|
101
|
+
end
|
102
|
+
|
103
|
+
it "supports single tube array arg" do
|
104
|
+
worker = Backburner::Worker.new([["foo", "bar"]])
|
105
|
+
assert_equal ["foo", "bar"], worker.tube_names
|
106
|
+
end
|
107
|
+
|
108
|
+
it "supports empty nil array arg with default values" do
|
109
|
+
worker = Backburner::Worker.new([nil])
|
110
|
+
assert_equal ['baz', 'bam'], worker.tube_names
|
111
|
+
end
|
112
|
+
|
113
|
+
it "supports single tube arg" do
|
114
|
+
worker = Backburner::Worker.new("foo")
|
115
|
+
assert_equal ["foo"], worker.tube_names
|
116
|
+
end
|
117
|
+
|
118
|
+
it "supports empty array arg with default values" do
|
119
|
+
worker = Backburner::Worker.new([])
|
120
|
+
assert_equal ['baz', 'bam'], worker.tube_names
|
121
|
+
end
|
122
|
+
|
123
|
+
it "supports nil arg with default values" do
|
124
|
+
worker = Backburner::Worker.new(nil)
|
125
|
+
assert_equal ['baz', 'bam'], worker.tube_names
|
126
|
+
end
|
127
|
+
end # tube_names
|
128
|
+
|
129
|
+
describe "for custom serialization" do
|
130
|
+
before do
|
131
|
+
Backburner.configure do |config|
|
132
|
+
@old_parser = config.job_parser_proc
|
133
|
+
@old_serializer = config.job_serializer_proc
|
134
|
+
config.job_parser_proc = lambda { |body| Marshal.load(body) }
|
135
|
+
config.job_serializer_proc = lambda { |body| Marshal.dump(body) }
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
after do
|
140
|
+
clear_jobs!('test-plain')
|
141
|
+
Backburner.configure do |config|
|
142
|
+
config.job_parser_proc = @old_parser
|
143
|
+
config.job_serializer_proc = @old_serializer
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
it "should support enqueuing a job" do
|
148
|
+
Backburner::Worker.enqueue TestPlainJob, [7, 9], :ttr => 100, :pri => 2000
|
149
|
+
pop_one_job("test-plain") do |job, body|
|
150
|
+
assert_equal "TestPlainJob", body[:class]
|
151
|
+
assert_equal [7, 9], body[:args]
|
152
|
+
assert_equal 100, job.ttr
|
153
|
+
assert_equal 2000, job.pri
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end # custom serialization
|
157
|
+
end # Backburner::Worker
|
@@ -0,0 +1,181 @@
|
|
1
|
+
require File.expand_path('../../test_helper', __FILE__)
|
2
|
+
require File.expand_path('../../fixtures/test_forking_jobs', __FILE__)
|
3
|
+
|
4
|
+
describe "Backburner::Workers::Forking module" do
|
5
|
+
|
6
|
+
before do
|
7
|
+
Backburner.default_queues.clear
|
8
|
+
@worker_class = Backburner::Workers::Forking
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "for prepare method" do
|
12
|
+
it "should make tube names array always unique to avoid duplication" do
|
13
|
+
worker = @worker_class.new(["foo", "demo.test.foo"])
|
14
|
+
capture_stdout { worker.prepare }
|
15
|
+
assert_equal ["demo.test.foo"], worker.tube_names
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should watch specified tubes" do
|
19
|
+
worker = @worker_class.new(["foo", "bar"])
|
20
|
+
out = capture_stdout { worker.prepare }
|
21
|
+
assert_equal ["demo.test.foo", "demo.test.bar"], worker.tube_names
|
22
|
+
assert_same_elements ["demo.test.foo", "demo.test.bar"], worker.connection.tubes.watched.map(&:name)
|
23
|
+
assert_match(/demo\.test\.foo/, out)
|
24
|
+
end # multiple
|
25
|
+
|
26
|
+
it "should watch single tube" do
|
27
|
+
worker = @worker_class.new("foo")
|
28
|
+
out = capture_stdout { worker.prepare }
|
29
|
+
assert_equal ["demo.test.foo"], worker.tube_names
|
30
|
+
assert_same_elements ["demo.test.foo"], worker.connection.tubes.watched.map(&:name)
|
31
|
+
assert_match(/demo\.test\.foo/, out)
|
32
|
+
end # single
|
33
|
+
|
34
|
+
it "should respect default_queues settings" do
|
35
|
+
Backburner.default_queues.concat(["foo", "bar"])
|
36
|
+
worker = @worker_class.new
|
37
|
+
out = capture_stdout { worker.prepare }
|
38
|
+
assert_equal ["demo.test.foo", "demo.test.bar"], worker.tube_names
|
39
|
+
assert_same_elements ["demo.test.foo", "demo.test.bar"], worker.connection.tubes.watched.map(&:name)
|
40
|
+
assert_match(/demo\.test\.foo/, out)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should assign based on all tubes" do
|
44
|
+
@worker_class.any_instance.expects(:all_existing_queues).once.returns("bar")
|
45
|
+
worker = @worker_class.new
|
46
|
+
out = capture_stdout { worker.prepare }
|
47
|
+
assert_equal ["demo.test.bar"], worker.tube_names
|
48
|
+
assert_same_elements ["demo.test.bar"], worker.connection.tubes.watched.map(&:name)
|
49
|
+
assert_match(/demo\.test\.bar/, out)
|
50
|
+
end # all assign
|
51
|
+
|
52
|
+
it "should properly retrieve all tubes" do
|
53
|
+
worker = @worker_class.new
|
54
|
+
out = capture_stdout { worker.prepare }
|
55
|
+
assert_contains worker.tube_names, "demo.test.backburner-jobs"
|
56
|
+
assert_contains worker.connection.tubes.watched.map(&:name), "demo.test.backburner-jobs"
|
57
|
+
assert_match(/demo\.test\.backburner-jobs/, out)
|
58
|
+
end # all read
|
59
|
+
end # prepare
|
60
|
+
|
61
|
+
describe "for fork_one_job method" do
|
62
|
+
|
63
|
+
it "should fork, work job, and exit" do
|
64
|
+
clear_jobs!("bar.foo")
|
65
|
+
@worker_class.enqueue TestJobForking, [1, 2], :queue => "bar.foo"
|
66
|
+
|
67
|
+
fake_pid = 45
|
68
|
+
Process.expects(:fork).returns(fake_pid).yields
|
69
|
+
@worker_class.any_instance.expects(:work_one_job)
|
70
|
+
@worker_class.any_instance.expects(:coolest_exit)
|
71
|
+
Process.expects(:wait).with(fake_pid)
|
72
|
+
|
73
|
+
silenced(2) do
|
74
|
+
worker = @worker_class.new('bar.foo')
|
75
|
+
worker.prepare
|
76
|
+
worker.fork_one_job
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end # fork_one_job
|
81
|
+
|
82
|
+
describe "practical tests" do
|
83
|
+
|
84
|
+
before do
|
85
|
+
@templogger = Templogger.new('/tmp')
|
86
|
+
Backburner.configure { |config| config.logger = @templogger.logger }
|
87
|
+
$worker_test_count = 0
|
88
|
+
$worker_success = false
|
89
|
+
$worker_raise = false
|
90
|
+
clear_jobs!('response')
|
91
|
+
clear_jobs!('bar.foo.1', 'bar.foo.2', 'bar.foo.3', 'bar.foo.4', 'bar.foo.5')
|
92
|
+
silenced do
|
93
|
+
@response_worker = @worker_class.new('response')
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
after do
|
98
|
+
@templogger.close
|
99
|
+
Backburner.configuration.logger = nil
|
100
|
+
clear_jobs!('response')
|
101
|
+
clear_jobs!('bar.foo.1', 'bar.foo.2', 'bar.foo.3', 'bar.foo.4', 'bar.foo.5')
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
it "should work an enqueued job" do
|
106
|
+
@worker = @worker_class.new('bar.foo.1')
|
107
|
+
@worker_class.enqueue TestJobForking, [1, 2], :queue => "bar.foo.1"
|
108
|
+
@worker.prepare
|
109
|
+
silenced(2) do
|
110
|
+
@worker.fork_one_job
|
111
|
+
@templogger.wait_for_match(/Completed TestJobFork/m)
|
112
|
+
@response_worker.prepare
|
113
|
+
@response_worker.work_one_job
|
114
|
+
end
|
115
|
+
assert_equal 3, $worker_test_count
|
116
|
+
end # enqueue
|
117
|
+
|
118
|
+
it "should work for an async job" do
|
119
|
+
@worker = @worker_class.new('bar.foo.2')
|
120
|
+
TestAsyncJobForking.async(:queue => 'bar.foo.2').foo(3, 5)
|
121
|
+
@worker.prepare
|
122
|
+
silenced(4) do
|
123
|
+
@worker.fork_one_job
|
124
|
+
@templogger.wait_for_match(/Completed TestAsyncJobFork/m)
|
125
|
+
@response_worker.prepare
|
126
|
+
@response_worker.work_one_job
|
127
|
+
end
|
128
|
+
assert_equal 15, $worker_test_count
|
129
|
+
end # async
|
130
|
+
|
131
|
+
it "should fail quietly if there's an argument error" do
|
132
|
+
Backburner.configure { |config| config.max_job_retries = 0 }
|
133
|
+
@worker = @worker_class.new('bar.foo.3')
|
134
|
+
@worker_class.enqueue TestJobForking, ["bam", "foo", "bar"], :queue => "bar.foo.3"
|
135
|
+
@worker.prepare
|
136
|
+
silenced(5) do
|
137
|
+
@worker.fork_one_job
|
138
|
+
@templogger.wait_for_match(/Finished TestJobFork.*attempt 1 of 1/m)
|
139
|
+
end
|
140
|
+
assert_match(/Exception ArgumentError/, @templogger.body)
|
141
|
+
assert_equal 0, $worker_test_count
|
142
|
+
end # fail, argument
|
143
|
+
|
144
|
+
it "should support retrying jobs and burying" do
|
145
|
+
Backburner.configure { |config| config.max_job_retries = 1; config.retry_delay = 0 }
|
146
|
+
@worker = @worker_class.new('bar.foo.4')
|
147
|
+
@worker_class.enqueue TestRetryJobForking, ["bam", "foo"], :queue => 'bar.foo.4'
|
148
|
+
@worker.prepare
|
149
|
+
silenced(4) do
|
150
|
+
2.times do
|
151
|
+
$worker_test_count += 1
|
152
|
+
@worker.fork_one_job
|
153
|
+
end
|
154
|
+
@templogger.wait_for_match(/Finished TestRetryJobFork.*attempt 2 of 2/m)
|
155
|
+
@response_worker.prepare
|
156
|
+
2.times { @response_worker.work_one_job }
|
157
|
+
end
|
158
|
+
assert_equal 4, $worker_test_count
|
159
|
+
assert_equal false, $worker_success
|
160
|
+
end # retry, bury
|
161
|
+
|
162
|
+
it "should support retrying jobs and succeeds" do
|
163
|
+
Backburner.configure { |config| config.max_job_retries = 2; config.retry_delay = 0 }
|
164
|
+
@worker = @worker_class.new('bar.foo.5')
|
165
|
+
@worker_class.enqueue TestRetryJobForking, ["bam", "foo"], :queue => 'bar.foo.5'
|
166
|
+
@worker.prepare
|
167
|
+
silenced(4) do
|
168
|
+
3.times do
|
169
|
+
$worker_test_count += 1
|
170
|
+
@worker.fork_one_job
|
171
|
+
end
|
172
|
+
@templogger.wait_for_match(/Completed TestRetryJobFork/m)
|
173
|
+
@response_worker.prepare
|
174
|
+
3.times { @response_worker.work_one_job }
|
175
|
+
end
|
176
|
+
assert_equal 6, $worker_test_count
|
177
|
+
assert_equal true, $worker_success
|
178
|
+
end # retrying, succeeds
|
179
|
+
|
180
|
+
end # practical tests
|
181
|
+
end
|