backburner-allq 1.0.16 → 1.0.21
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 +4 -4
- data/Gemfile +3 -1
- data/deploy.sh +1 -1
- data/lib/backburner/allq_wrapper.rb +3 -2
- data/lib/backburner/configuration.rb +2 -2
- data/lib/backburner/connection.rb +4 -0
- data/lib/backburner/job.rb +7 -6
- data/lib/backburner/version.rb +1 -1
- data/lib/backburner/worker.rb +48 -32
- data/lib/backburner/workers/forking.rb +1 -1
- data/lib/backburner/workers/simple.rb +1 -1
- data/lib/backburner/workers/threading.rb +3 -3
- data/lib/backburner/workers/threads_on_fork.rb +10 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 73c6bedb8b0e7244398f9b2c6fa59cd279cee9918f68f0f6774949930c76e37f
|
4
|
+
data.tar.gz: 9cf6c1693730748fef4e28c6125e250ff5088eb3ccf842037944a8ad438d8b72
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b3cbad666007e5bbdc55373d94bdb584ec7828461d5640388987d45bdc830f025883e9c7ba4798f3dec743eb174e2560742bd30231a1fc431b57f77627f54383
|
7
|
+
data.tar.gz: 41c1b8dc3ae52fe00de3e6af96fc9967f9ef39057e0f7eb97ef9bbe91cb9bae5404f61a51a8bf86d1b6a7edc3e67db6e0219beaad85a48310229fd3927436fdd
|
data/Gemfile
CHANGED
data/deploy.sh
CHANGED
@@ -81,6 +81,7 @@ module Backburner
|
|
81
81
|
end
|
82
82
|
|
83
83
|
class AllQWrapper
|
84
|
+
DEFAULT_TIMEOUT = 17800
|
84
85
|
def initialize(url = 'localhost:8090')
|
85
86
|
allq_conf = Allq::Configuration.new do |config|
|
86
87
|
config.host = url
|
@@ -182,7 +183,7 @@ module Backburner
|
|
182
183
|
def build_new_job(body, options)
|
183
184
|
adjusted_priority = map_priority(options[:pri] || 5)
|
184
185
|
|
185
|
-
ttl = options[:ttl] ||
|
186
|
+
ttl = options[:ttl] || options[:ttr] || DEFAULT_TIMEOUT
|
186
187
|
tube_name = options[:tube_name] || 'default'
|
187
188
|
delay = options[:delay] || 0
|
188
189
|
parent_id = options[:parent_id]
|
@@ -199,7 +200,7 @@ module Backburner
|
|
199
200
|
|
200
201
|
def build_new_parent_job(body, options)
|
201
202
|
adjusted_priority = map_priority(options[:pri] || 5)
|
202
|
-
ttl = options[:ttl] ||
|
203
|
+
ttl = options[:ttl] || options[:ttr] || DEFAULT_TIMEOUT
|
203
204
|
tube_name = options[:tube_name] || 'default'
|
204
205
|
delay = options[:delay] || 0
|
205
206
|
parent_id = options[:parent_id]
|
@@ -22,12 +22,12 @@ module Backburner
|
|
22
22
|
|
23
23
|
def initialize
|
24
24
|
@allq_url = "allq://127.0.0.1:8091"
|
25
|
-
@tube_namespace = "
|
25
|
+
@tube_namespace = "backburner"
|
26
26
|
@namespace_separator = "."
|
27
27
|
@default_priority = 5
|
28
28
|
@respond_timeout = 120
|
29
29
|
@on_error = nil
|
30
|
-
@max_job_retries =
|
30
|
+
@max_job_retries = 1
|
31
31
|
@retry_delay = 5
|
32
32
|
@retry_delay_proc = lambda { |min_retry_delay, num_retries| min_retry_delay + (num_retries ** 3) }
|
33
33
|
@default_queues = []
|
@@ -38,6 +38,10 @@ module Backburner
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
+
def tubes
|
42
|
+
@allq_wrapper.tube_names if @allq_wrapper
|
43
|
+
end
|
44
|
+
|
41
45
|
# Attempt to reconnect to allq. Note: the connection will not be watching
|
42
46
|
# or using the tubes it was before it was reconnected (as it's actually a
|
43
47
|
# completely new connection)
|
data/lib/backburner/job.rb
CHANGED
@@ -25,9 +25,10 @@ module Backburner
|
|
25
25
|
@body = task.body.is_a?(Hash) ? task.body : Backburner.configuration.job_parser_proc.call(task.body)
|
26
26
|
@name = body["class"] || body[:class]
|
27
27
|
@args = body["args"] || body[:args]
|
28
|
+
@ttr = body["ttr"] || body[:ttr]
|
28
29
|
rescue => ex # Job was not valid format
|
29
|
-
self.bury
|
30
|
-
raise JobFormatInvalid, "Job body could not be parsed: #{ex.inspect}"
|
30
|
+
# self.bury
|
31
|
+
# raise JobFormatInvalid, "Job body could not be parsed: #{ex.inspect}"
|
31
32
|
end
|
32
33
|
|
33
34
|
# Sets the delegator object to the underlying beaneater job
|
@@ -42,13 +43,13 @@ module Backburner
|
|
42
43
|
# @example
|
43
44
|
# @task.process
|
44
45
|
#
|
45
|
-
def process
|
46
|
+
def process
|
46
47
|
# Invoke before hook and stop if false
|
47
48
|
res = @hooks.invoke_hook_events(job_name, :before_perform, *args)
|
48
49
|
return false unless res
|
49
50
|
# Execute the job
|
50
51
|
@hooks.around_hook_events(job_name, :around_perform, *args) do
|
51
|
-
job_class.perform(*args)
|
52
|
+
timeout_job_after(@ttr > 1 ? @ttr - 1 : @ttr) { job_class.perform(*args) }
|
52
53
|
end
|
53
54
|
task.delete
|
54
55
|
# Invoke after perform hook
|
@@ -60,12 +61,12 @@ module Backburner
|
|
60
61
|
|
61
62
|
def bury
|
62
63
|
@hooks.invoke_hook_events(job_name, :on_bury, *args)
|
63
|
-
task.bury
|
64
|
+
@task.bury
|
64
65
|
end
|
65
66
|
|
66
67
|
def retry(count, delay)
|
67
68
|
@hooks.invoke_hook_events(job_name, :on_retry, count, delay, *args)
|
68
|
-
task.release(delay: delay)
|
69
|
+
@task.release(delay: delay)
|
69
70
|
end
|
70
71
|
|
71
72
|
# Returns the class for the job handler
|
data/lib/backburner/version.rb
CHANGED
data/lib/backburner/worker.rb
CHANGED
@@ -31,7 +31,7 @@ module Backburner
|
|
31
31
|
|
32
32
|
return nil unless res # stop if hook is false
|
33
33
|
|
34
|
-
data = { :class => job_class.name, :args => args }
|
34
|
+
data = { :class => job_class.name, :args => args, :ttr => ttr }
|
35
35
|
queue = opts[:queue] && (Proc === opts[:queue] ? opts[:queue].call(job_class) : opts[:queue])
|
36
36
|
|
37
37
|
begin
|
@@ -126,43 +126,57 @@ module Backburner
|
|
126
126
|
# @example
|
127
127
|
# @worker.work_one_job
|
128
128
|
# @raise [Beaneater::NotConnected] If beanstalk fails to connect multiple times.
|
129
|
-
def work_one_job(conn = connection)
|
129
|
+
def work_one_job(conn = connection, tube_name = nil)
|
130
|
+
if tube_name.nil?
|
131
|
+
self.log_error "Sampling tube, this is bad practice for Allq"
|
132
|
+
tube_name = @tube_names.sample
|
133
|
+
end
|
134
|
+
|
130
135
|
begin
|
131
|
-
job = reserve_job(conn)
|
136
|
+
job = reserve_job(conn, tube_name)
|
132
137
|
rescue Exception => e
|
138
|
+
self.log_error "Sleeping"
|
139
|
+
self.log_error "Exception: #{e.full_message}"
|
133
140
|
sleep(rand*3)
|
134
141
|
return
|
135
142
|
end
|
136
143
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
144
|
+
if job && job.body
|
145
|
+
begin
|
146
|
+
self.log_job_begin(job.name, job.args)
|
147
|
+
job.process
|
148
|
+
self.log_job_end(job.name)
|
149
|
+
rescue Backburner::Job::JobFormatInvalid => e
|
150
|
+
self.log_error self.exception_message(e)
|
151
|
+
rescue => e # Error occurred processing job
|
152
|
+
self.log_error self.exception_message(e) unless e.is_a?(Backburner::Job::RetryJob)
|
153
|
+
|
154
|
+
unless job
|
155
|
+
self.log_error "Error occurred before we were able to assign a job. Giving up without retrying!"
|
156
|
+
return
|
157
|
+
end
|
158
|
+
|
159
|
+
# NB: There's a slight chance here that the connection to allq has
|
160
|
+
# gone down between the time we reserved / processed the job and here.
|
161
|
+
num_retries = job.releases
|
162
|
+
max_job_retries = resolve_max_job_retries(job.job_class)
|
163
|
+
retry_status = "failed: attempt #{num_retries+1} of #{max_job_retries+1}"
|
164
|
+
retry_delay = resolve_retry_delay(job.job_class)
|
165
|
+
delay = resolve_retry_delay_proc(job.job_class).call(retry_delay, num_retries) rescue retry_delay
|
166
|
+
|
167
|
+
if num_retries + 1 > max_job_retries
|
168
|
+
job.bury
|
169
|
+
else
|
170
|
+
job.release(delay)
|
171
|
+
end
|
172
|
+
self.log_job_end(job.name, "#{retry_status}, retrying in #{delay}s") if job_started_at
|
173
|
+
|
174
|
+
handle_error(e, job.name, job.args, job)
|
175
|
+
end
|
160
176
|
else
|
161
|
-
|
177
|
+
sleep(rand*3)
|
162
178
|
end
|
163
|
-
|
164
|
-
|
165
|
-
handle_error(e, job.name, job.args, job)
|
179
|
+
job
|
166
180
|
end
|
167
181
|
|
168
182
|
|
@@ -174,8 +188,10 @@ module Backburner
|
|
174
188
|
end
|
175
189
|
|
176
190
|
# Reserve a job from the watched queues
|
177
|
-
def reserve_job(conn, reserve_timeout = Backburner.configuration.reserve_timeout)
|
178
|
-
|
191
|
+
def reserve_job(conn, tube_name, reserve_timeout = Backburner.configuration.reserve_timeout)
|
192
|
+
job = conn.get(tube_name)
|
193
|
+
return nil if job.nil? || job.body == nil?
|
194
|
+
Backburner::Job.new(job)
|
179
195
|
end
|
180
196
|
|
181
197
|
# Returns a list of all tubes known within the system
|
@@ -11,7 +11,7 @@ module Backburner
|
|
11
11
|
def prepare
|
12
12
|
self.tube_names.map! { |name| expand_tube_name(name) }.uniq!
|
13
13
|
log_info "Working #{tube_names.size} queues: [ #{tube_names.join(', ')} ]"
|
14
|
-
self.connection.tubes.watch!(*self.tube_names)
|
14
|
+
# self.connection.tubes.watch!(*self.tube_names)
|
15
15
|
end
|
16
16
|
|
17
17
|
# Starts processing new jobs indefinitely.
|
@@ -11,7 +11,7 @@ module Backburner
|
|
11
11
|
def prepare
|
12
12
|
self.tube_names.map! { |name| expand_tube_name(name) }.uniq!
|
13
13
|
log_info "Working #{tube_names.size} queues: [ #{tube_names.join(', ')} ]"
|
14
|
-
self.connection.tubes.watch!(*self.tube_names)
|
14
|
+
# self.connection.tubes.watch!(*self.tube_names)
|
15
15
|
end
|
16
16
|
|
17
17
|
# Starts processing new jobs indefinitely.
|
@@ -49,8 +49,8 @@ module Backburner
|
|
49
49
|
@thread_pools.each do |tube_name, pool|
|
50
50
|
pool.max_length.times do
|
51
51
|
# Create a new connection and set it up to listen on this tube name
|
52
|
-
connection = new_connection.tap{ |conn| conn.tubes.watch!(tube_name) }
|
53
|
-
connection.on_reconnect = lambda { |conn| conn.tubes.watch!(tube_name) }
|
52
|
+
# connection = new_connection.tap{ |conn| conn.tubes.watch!(tube_name) }
|
53
|
+
# connection.on_reconnect = lambda { |conn| conn.tubes.watch!(tube_name) }
|
54
54
|
|
55
55
|
# Make it work jobs using its own connection per thread
|
56
56
|
pool.post(connection) do |memo_connection|
|
@@ -58,7 +58,7 @@ module Backburner
|
|
58
58
|
loop do
|
59
59
|
begin
|
60
60
|
break if @in_shutdown
|
61
|
-
work_one_job(memo_connection)
|
61
|
+
work_one_job(memo_connection, tube_name)
|
62
62
|
rescue => e
|
63
63
|
log_error("Exception caught in thread pool loop. Continuing. -> #{e.message}\nBacktrace: #{e.backtrace}")
|
64
64
|
end
|
@@ -181,6 +181,8 @@ module Backburner
|
|
181
181
|
|
182
182
|
@runs = 0
|
183
183
|
|
184
|
+
puts "Threads number = #{@threads_number}"
|
185
|
+
|
184
186
|
if @threads_number == 1
|
185
187
|
watch_tube(name)
|
186
188
|
run_while_can
|
@@ -205,14 +207,21 @@ module Backburner
|
|
205
207
|
|
206
208
|
# Run work_one_job while we can
|
207
209
|
def run_while_can(conn = connection)
|
210
|
+
puts "Run while can"
|
208
211
|
while @garbage_after.nil? or @garbage_after > @runs
|
209
212
|
@runs += 1 # FIXME: Likely race condition
|
210
|
-
work_one_job(conn)
|
213
|
+
ran_job = work_one_job(conn, @watched_tube_name)
|
214
|
+
# Wait a second if we didn't find a job
|
215
|
+
unless ran_job
|
216
|
+
puts "sleeping"
|
217
|
+
sleep(rand() * 3)
|
218
|
+
end
|
211
219
|
end
|
212
220
|
end
|
213
221
|
|
214
222
|
# Shortcut for watching a tube on our beanstalk connection
|
215
223
|
def watch_tube(name, conn = connection)
|
224
|
+
@watched_tube_name = name
|
216
225
|
# No op for allq
|
217
226
|
end
|
218
227
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: backburner-allq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.21
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Malcolm
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-02-
|
11
|
+
date: 2021-02-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: allq_rest
|