canvas-jobs 0.9.5 → 0.9.6
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/bin/canvas_job +4 -0
- data/lib/delayed/backend/active_record.rb +10 -1
- data/lib/delayed/backend/redis/includes/jobs_common.lua +1 -1
- data/lib/delayed/backend/redis/job.rb +23 -24
- data/lib/delayed/performable_method.rb +1 -1
- data/lib/delayed/pool.rb +8 -2
- data/lib/delayed/version.rb +1 -1
- data/lib/delayed/worker.rb +1 -1
- data/spec/active_record_job_spec.rb +12 -2
- data/spec/gemfiles/32.gemfile.lock +1 -1
- data/spec/gemfiles/40.gemfile.lock +1 -1
- data/spec/gemfiles/41.gemfile.lock +1 -1
- data/spec/gemfiles/42.gemfile.lock +1 -1
- data/spec/shared/shared_backend.rb +8 -0
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 06b0d47df9e4e61f3ecb4036f429c02acc0d6cd0
|
4
|
+
data.tar.gz: 81246d65f48fbeac3bd230f0917cf02d0ca702b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 995da9b8ba15ab581a67f26b25931ed1faeda4f6a839aaa07a010ab6e7fddd07a1c6fc0f920d39899d3c70990a7208c17e7fb05fdcada38389aa814086d024e1
|
7
|
+
data.tar.gz: 2f809d07cbaf801726610fdb2712807fc8eb762966ec1de580354005ab46d26a0f721821ff25aa6f866bb95fb126be296849b0f856984c2c2b062ecea94ee4c0
|
data/bin/canvas_job
ADDED
@@ -190,7 +190,7 @@ module Delayed
|
|
190
190
|
jobs = jobs.sort_by { rand }
|
191
191
|
end
|
192
192
|
job = jobs.detect do |job|
|
193
|
-
job.lock_exclusively
|
193
|
+
job.send(:lock_exclusively!, worker_name)
|
194
194
|
end
|
195
195
|
return job if job
|
196
196
|
end
|
@@ -259,7 +259,16 @@ module Delayed
|
|
259
259
|
def mark_as_locked!(time, worker)
|
260
260
|
self.locked_at = time
|
261
261
|
self.locked_by = worker
|
262
|
+
# We cheated ActiveRecord::Dirty with the update_all calls above, so
|
263
|
+
# we'll fix things up here.
|
264
|
+
if respond_to?(:changes_applied)
|
265
|
+
changes_applied
|
266
|
+
else
|
267
|
+
changed_attributes['locked_at'] = time
|
268
|
+
changed_attributes['locked_by'] = worker
|
269
|
+
end
|
262
270
|
end
|
271
|
+
protected :lock_exclusively!, :mark_as_locked!
|
263
272
|
|
264
273
|
def create_and_lock!(worker)
|
265
274
|
raise "job already exists" unless new_record?
|
@@ -140,7 +140,7 @@ local find_available = function(queue, limit, offset, min_priority, max_priority
|
|
140
140
|
end
|
141
141
|
|
142
142
|
if not max_priority or max_priority == '' then
|
143
|
-
max_priority = "
|
143
|
+
max_priority = "(" .. Keys.waiting_strand_job_priority()
|
144
144
|
else
|
145
145
|
max_priority = "(" .. (max_priority + 1)
|
146
146
|
end
|
@@ -87,31 +87,16 @@ class Job
|
|
87
87
|
raise("Delayed::MAX_PRIORITY must be less than #{WAITING_STRAND_JOB_PRIORITY}")
|
88
88
|
end
|
89
89
|
|
90
|
-
COLUMNS = [
|
91
|
-
:id,
|
92
|
-
:priority,
|
93
|
-
:attempts,
|
94
|
-
:handler,
|
95
|
-
:last_error,
|
96
|
-
:queue,
|
97
|
-
:run_at,
|
98
|
-
:locked_at,
|
99
|
-
:failed_at,
|
100
|
-
:locked_by,
|
101
|
-
:created_at,
|
102
|
-
:updated_at,
|
103
|
-
:tag,
|
104
|
-
:max_attempts,
|
105
|
-
:strand,
|
106
|
-
:source,
|
107
|
-
]
|
90
|
+
COLUMNS = []
|
108
91
|
|
109
92
|
# We store time attributes in redis as floats so we don't have to do
|
110
93
|
# timestamp parsing in lua.
|
111
|
-
TIMESTAMP_COLUMNS =
|
112
|
-
INTEGER_COLUMNS =
|
94
|
+
TIMESTAMP_COLUMNS = []
|
95
|
+
INTEGER_COLUMNS = []
|
113
96
|
|
114
97
|
def self.column(name, type)
|
98
|
+
COLUMNS << name
|
99
|
+
|
115
100
|
if type == :timestamp
|
116
101
|
TIMESTAMP_COLUMNS << name
|
117
102
|
elsif type == :integer
|
@@ -129,9 +114,22 @@ class Job
|
|
129
114
|
EOS
|
130
115
|
end
|
131
116
|
|
132
|
-
|
133
|
-
|
134
|
-
|
117
|
+
column(:id, :string)
|
118
|
+
column(:priority, :integer)
|
119
|
+
column(:attempts, :integer)
|
120
|
+
column(:handler, :string)
|
121
|
+
column(:last_error, :string)
|
122
|
+
column(:queue, :string)
|
123
|
+
column(:run_at, :timestamp)
|
124
|
+
column(:locked_at, :timestamp)
|
125
|
+
column(:failed_at, :timestamp)
|
126
|
+
column(:locked_by, :string)
|
127
|
+
column(:created_at, :timestamp)
|
128
|
+
column(:updated_at, :timestamp)
|
129
|
+
column(:tag, :string)
|
130
|
+
column(:max_attempts, :integer)
|
131
|
+
column(:strand, :string)
|
132
|
+
column(:source, :string)
|
135
133
|
|
136
134
|
def initialize(attrs = {})
|
137
135
|
attrs.each { |k, v| self.send("#{k}=", v) }
|
@@ -259,7 +257,7 @@ class Job
|
|
259
257
|
when 'current'
|
260
258
|
query ||= Delayed::Settings.queue
|
261
259
|
check_queue(query)
|
262
|
-
self.find(functions.find_available(query, limit, offset,
|
260
|
+
self.find(functions.find_available(query, limit, offset, 0, "+inf", db_time_now))
|
263
261
|
when 'future'
|
264
262
|
query ||= Delayed::Settings.queue
|
265
263
|
check_queue(query)
|
@@ -309,6 +307,7 @@ class Job
|
|
309
307
|
# TODO: mark the job as failed one attempt
|
310
308
|
job.unlock! if job.locked_by == worker_name
|
311
309
|
end
|
310
|
+
nil
|
312
311
|
end
|
313
312
|
|
314
313
|
# returns a list of hashes { :tag => tag_name, :count => current_count }
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Delayed
|
2
2
|
class PerformableMethod < Struct.new(:object, :method, :args)
|
3
3
|
def initialize(object, method, args = [])
|
4
|
-
raise NoMethodError, "undefined method `#{method}' for #{object.inspect}" unless object.respond_to?(method)
|
4
|
+
raise NoMethodError, "undefined method `#{method}' for #{object.inspect}" unless object.respond_to?(method, true)
|
5
5
|
|
6
6
|
self.object = object
|
7
7
|
self.args = args
|
data/lib/delayed/pool.rb
CHANGED
@@ -215,10 +215,16 @@ class Pool
|
|
215
215
|
|
216
216
|
def tail_rails_log
|
217
217
|
return if !@options[:tail_logs]
|
218
|
-
|
218
|
+
if Rails.logger.respond_to?(:log_path)
|
219
|
+
log_path = Rails.logger.log_path
|
220
|
+
elsif Rails.logger.instance_variable_get('@logdev').try(:instance_variable_get, '@dev').try(:path)
|
221
|
+
log_path = Rails.logger.instance_variable_get('@logdev').instance_variable_get('@dev').path
|
222
|
+
else
|
223
|
+
return
|
224
|
+
end
|
219
225
|
Rails.logger.auto_flushing = true if Rails.logger.respond_to?(:auto_flushing=)
|
220
226
|
Thread.new do
|
221
|
-
f = File.open(
|
227
|
+
f = File.open(log_path, 'r')
|
222
228
|
f.seek(0, IO::SEEK_END)
|
223
229
|
loop do
|
224
230
|
content = f.read
|
data/lib/delayed/version.rb
CHANGED
data/lib/delayed/worker.rb
CHANGED
@@ -82,7 +82,7 @@ class Worker
|
|
82
82
|
say "Stopping worker", :info
|
83
83
|
rescue => e
|
84
84
|
Rails.logger.fatal("Child process died: #{e.inspect}") rescue nil
|
85
|
-
self.class.
|
85
|
+
self.class.lifecycle.run_callbacks(:exceptional_exit, self, e) { }
|
86
86
|
ensure
|
87
87
|
Delayed::Job.clear_locks!(name)
|
88
88
|
end
|
@@ -32,12 +32,12 @@ describe 'Delayed::Backed::ActiveRecord::Job' do
|
|
32
32
|
|
33
33
|
it "should not allow a second worker to get exclusive access if already successfully processed by worker1" do
|
34
34
|
@job.destroy
|
35
|
-
@job_copy_for_worker_2.lock_exclusively
|
35
|
+
@job_copy_for_worker_2.send(:lock_exclusively!, 'worker2').should == false
|
36
36
|
end
|
37
37
|
|
38
38
|
it "should not allow a second worker to get exclusive access if failed to be processed by worker1 and run_at time is now in future (due to backing off behaviour)" do
|
39
39
|
@job.update_attributes(:attempts => 1, :run_at => 1.day.from_now)
|
40
|
-
@job_copy_for_worker_2.lock_exclusively
|
40
|
+
@job_copy_for_worker_2.send(:lock_exclusively!, 'worker2').should == false
|
41
41
|
end
|
42
42
|
|
43
43
|
it "should select the next job at random if enabled" do
|
@@ -57,4 +57,14 @@ describe 'Delayed::Backed::ActiveRecord::Job' do
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
end
|
60
|
+
|
61
|
+
it "should unlock a successfully locked job and persist the job's unlocked state" do
|
62
|
+
job = Delayed::Job.create :payload_object => SimpleJob.new
|
63
|
+
job.send(:lock_exclusively!, 'worker1').should == true
|
64
|
+
job.unlock
|
65
|
+
job.save!
|
66
|
+
job.reload
|
67
|
+
job.locked_by.should == nil
|
68
|
+
job.locked_at.should == nil
|
69
|
+
end
|
60
70
|
end
|
@@ -270,6 +270,14 @@ shared_examples_for 'a backend' do
|
|
270
270
|
Delayed::Job.get_and_lock_next_available('w3').should == nil
|
271
271
|
end
|
272
272
|
|
273
|
+
it "should not find next jobs when given no priority" do
|
274
|
+
jobs = [create_job(:strand => 'strand1'), create_job(:strand => 'strand1')]
|
275
|
+
first = Delayed::Job.get_and_lock_next_available('w1', Delayed::Settings.queue, nil, nil)
|
276
|
+
second = Delayed::Job.get_and_lock_next_available('w2', Delayed::Settings.queue, nil, nil)
|
277
|
+
expect(first).to eq jobs.first
|
278
|
+
expect(second).to eq nil
|
279
|
+
end
|
280
|
+
|
273
281
|
context 'singleton' do
|
274
282
|
it "should create if there's no jobs on the strand" do
|
275
283
|
@job = create_job(:singleton => 'myjobs')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: canvas-jobs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tobias Luetke
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-10-
|
12
|
+
date: 2014-10-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: after_transaction_commit
|
@@ -210,10 +210,12 @@ dependencies:
|
|
210
210
|
description:
|
211
211
|
email:
|
212
212
|
- brianp@instructure.com
|
213
|
-
executables:
|
213
|
+
executables:
|
214
|
+
- canvas_job
|
214
215
|
extensions: []
|
215
216
|
extra_rdoc_files: []
|
216
217
|
files:
|
218
|
+
- bin/canvas_job
|
217
219
|
- db/migrate/20101216224513_create_delayed_jobs.rb
|
218
220
|
- db/migrate/20110208031356_add_delayed_jobs_tag.rb
|
219
221
|
- db/migrate/20110426161613_add_delayed_jobs_max_attempts.rb
|
@@ -298,7 +300,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
298
300
|
version: '0'
|
299
301
|
requirements: []
|
300
302
|
rubyforge_project:
|
301
|
-
rubygems_version: 2.4.
|
303
|
+
rubygems_version: 2.4.2
|
302
304
|
signing_key:
|
303
305
|
specification_version: 4
|
304
306
|
summary: Instructure-maintained fork of delayed_job
|
@@ -323,4 +325,3 @@ test_files:
|
|
323
325
|
- spec/shared/worker.rb
|
324
326
|
- spec/shared_jobs_specs.rb
|
325
327
|
- spec/spec_helper.rb
|
326
|
-
has_rdoc:
|