inst-jobs 3.0.10 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/db/migrate/20220328152900_add_failed_jobs_indicies.rb +12 -0
- data/lib/delayed/backend/active_record.rb +4 -0
- data/lib/delayed/backend/base.rb +8 -2
- data/lib/delayed/lifecycle.rb +1 -0
- data/lib/delayed/server.rb +1 -1
- data/lib/delayed/settings.rb +2 -0
- data/lib/delayed/version.rb +1 -1
- data/lib/delayed/worker.rb +3 -3
- data/spec/active_record_job_spec.rb +9 -0
- data/spec/delayed/worker_spec.rb +4 -3
- data/spec/shared/shared_backend.rb +17 -1
- data/spec/spec_helper.rb +3 -3
- metadata +24 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 37ca25ff97580c47a56d0d40a1ab2f78c62a2f47629d0c2e5ba6c8e5c4ace0bd
|
4
|
+
data.tar.gz: 16d4a060bfc0c23f84360d305e35adb5482d0d96f50b50c1a45a8a0b02739c90
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f981418c6f0493c84114777193674559f8a0a15006547600bc00cc44eaaff08232c7695f801a3b84c2919167c68c7fb7d91562aa1d4d47d9f98d28a1362b0e3
|
7
|
+
data.tar.gz: 4b31d64c30f9208c54b32796d6ad99f22f9beb3f405a8b4585398306d03b15063d3fde88fce2d063f4f76949da1e350bf4607b8bcf6709a4a20ff686f5c87b6d
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class AddFailedJobsIndicies < ActiveRecord::Migration[5.2]
|
4
|
+
disable_ddl_transaction!
|
5
|
+
|
6
|
+
def change
|
7
|
+
add_index :failed_jobs, :failed_at, algorithm: :concurrently
|
8
|
+
add_index :failed_jobs, :strand, where: "strand IS NOT NULL", algorithm: :concurrently
|
9
|
+
add_index :failed_jobs, :singleton, where: "singleton IS NOT NULL", algorithm: :concurrently
|
10
|
+
add_index :failed_jobs, :tag, algorithm: :concurrently
|
11
|
+
end
|
12
|
+
end
|
@@ -579,6 +579,10 @@ module Delayed
|
|
579
579
|
class Failed < Job
|
580
580
|
include Delayed::Backend::Base
|
581
581
|
self.table_name = :failed_jobs
|
582
|
+
|
583
|
+
def self.cleanup_old_jobs(before_date, batch_size: 10_000)
|
584
|
+
where("failed_at < ?", before_date).in_batches(of: batch_size).delete_all
|
585
|
+
end
|
582
586
|
end
|
583
587
|
end
|
584
588
|
end
|
data/lib/delayed/backend/base.rb
CHANGED
@@ -86,8 +86,12 @@ module Delayed
|
|
86
86
|
kwargs.merge!(n_strand_options(full_strand_name, num_strands))
|
87
87
|
end
|
88
88
|
|
89
|
+
job = nil
|
90
|
+
|
89
91
|
if singleton
|
90
|
-
|
92
|
+
Delayed::Worker.lifecycle.run_callbacks(:create, kwargs) do
|
93
|
+
job = create(**kwargs)
|
94
|
+
end
|
91
95
|
elsif batches && strand.nil? && run_at.nil?
|
92
96
|
batch_enqueue_args = kwargs.slice(*self.batch_enqueue_args)
|
93
97
|
batches[batch_enqueue_args] << kwargs
|
@@ -95,7 +99,9 @@ module Delayed
|
|
95
99
|
else
|
96
100
|
raise ArgumentError, "on_conflict can only be provided with singleton" if kwargs[:on_conflict]
|
97
101
|
|
98
|
-
|
102
|
+
Delayed::Worker.lifecycle.run_callbacks(:create, kwargs) do
|
103
|
+
job = create(**kwargs)
|
104
|
+
end
|
99
105
|
end
|
100
106
|
|
101
107
|
JobTracking.job_created(job)
|
data/lib/delayed/lifecycle.rb
CHANGED
data/lib/delayed/server.rb
CHANGED
@@ -16,7 +16,7 @@ module Delayed
|
|
16
16
|
# Rails will take care of establishing the DB connection for us if there is
|
17
17
|
# an application present
|
18
18
|
if using_active_record? && !ActiveRecord::Base.connected?
|
19
|
-
ActiveRecord::Base.establish_connection(ENV
|
19
|
+
ActiveRecord::Base.establish_connection(ENV.fetch("DATABASE_URL", nil))
|
20
20
|
end
|
21
21
|
|
22
22
|
@allow_update = args.length.positive? && args[0][:update]
|
data/lib/delayed/settings.rb
CHANGED
@@ -33,6 +33,7 @@ module Delayed
|
|
33
33
|
|
34
34
|
SETTINGS_WITH_ARGS = %i[
|
35
35
|
job_detailed_log_format
|
36
|
+
job_short_log_format
|
36
37
|
num_strands
|
37
38
|
].freeze
|
38
39
|
|
@@ -137,6 +138,7 @@ module Delayed
|
|
137
138
|
self.job_detailed_log_format = lambda { |job|
|
138
139
|
job.to_json(include_root: false, only: %w[tag strand singleton priority attempts created_at max_attempts source])
|
139
140
|
}
|
141
|
+
self.job_short_log_format = ->(_job) { "" }
|
140
142
|
|
141
143
|
# Send workers KILL after QUIT if they haven't exited within the
|
142
144
|
# slow_exit_timeout
|
data/lib/delayed/version.rb
CHANGED
data/lib/delayed/worker.rb
CHANGED
@@ -220,7 +220,7 @@ module Delayed
|
|
220
220
|
end
|
221
221
|
job.destroy
|
222
222
|
end
|
223
|
-
logger.info("Completed #{log_job(job)} #{format('%.0fms', (runtime * 1000))}")
|
223
|
+
logger.info("Completed #{log_job(job, :short)} #{format('%.0fms', (runtime * 1000))}")
|
224
224
|
end
|
225
225
|
rescue ::Delayed::RetriableError => e
|
226
226
|
can_retry = job.attempts + 1 < job.inferred_max_attempts
|
@@ -269,14 +269,14 @@ module Delayed
|
|
269
269
|
when :long
|
270
270
|
"#{job.full_name} #{Settings.job_detailed_log_format.call(job)}"
|
271
271
|
else
|
272
|
-
job.full_name
|
272
|
+
"#{job.full_name} #{Settings.job_short_log_format.call(job)}".strip
|
273
273
|
end
|
274
274
|
end
|
275
275
|
|
276
276
|
# set up the session context information, so that it gets logged with the job log lines
|
277
277
|
# also set up a unique tmpdir, which will get removed at the end of the job.
|
278
278
|
def configure_for_job(job)
|
279
|
-
previous_tmpdir = ENV
|
279
|
+
previous_tmpdir = ENV.fetch("TMPDIR", nil)
|
280
280
|
|
281
281
|
self.class.running_job(job) do
|
282
282
|
dir = Dir.mktmpdir("job-#{job.id}-#{name.gsub(/[^\w.]/, '.')}-")
|
@@ -100,6 +100,15 @@ describe "Delayed::Backed::ActiveRecord::Job" do
|
|
100
100
|
failed_count = Delayed::Job::Failed.count
|
101
101
|
expect(Delayed::Job.bulk_update("destroy", flavor: "failed", query: @query)).to eq(failed_count)
|
102
102
|
end
|
103
|
+
|
104
|
+
it "deletes all failed jobs before a given date" do
|
105
|
+
Delayed::Job::Failed.first.update!(failed_at: 3.hours.ago)
|
106
|
+
Delayed::Job::Failed.last.update!(failed_at: 1.hour.ago)
|
107
|
+
|
108
|
+
expect(Delayed::Job::Failed.count).to eq 2
|
109
|
+
Delayed::Job::Failed.cleanup_old_jobs(2.hours.ago)
|
110
|
+
expect(Delayed::Job::Failed.count).to eq 1
|
111
|
+
end
|
103
112
|
end
|
104
113
|
end
|
105
114
|
|
data/spec/delayed/worker_spec.rb
CHANGED
@@ -85,13 +85,14 @@ describe Delayed::Worker do
|
|
85
85
|
end
|
86
86
|
|
87
87
|
it "logging format can be changed with settings" do
|
88
|
-
Delayed::Settings.job_detailed_log_format = ->(job) { "override format #{job.strand}" }
|
88
|
+
Delayed::Settings.job_detailed_log_format = ->(job) { "override format detailed #{job.strand}" }
|
89
|
+
Delayed::Settings.job_short_log_format = ->(_job) { "override format short" }
|
89
90
|
payload = double(perform: nil)
|
90
91
|
job = Delayed::Job.new(payload_object: payload, priority: 25, strand: "test_jobs")
|
91
92
|
short_log_format = subject.log_job(job, :short)
|
92
|
-
expect(short_log_format).to eq("RSpec::Mocks::Double")
|
93
|
+
expect(short_log_format).to eq("RSpec::Mocks::Double override format short")
|
93
94
|
long_format = subject.log_job(job, :long)
|
94
|
-
expect(long_format).to eq("RSpec::Mocks::Double override format test_jobs")
|
95
|
+
expect(long_format).to eq("RSpec::Mocks::Double override format detailed test_jobs")
|
95
96
|
end
|
96
97
|
end
|
97
98
|
|
@@ -35,6 +35,22 @@ shared_examples_for "a backend" do
|
|
35
35
|
expect(Delayed::Job.jobs_count(:current)).to eq(1)
|
36
36
|
end
|
37
37
|
|
38
|
+
it "triggers the lifecycle event around the create" do
|
39
|
+
called = false
|
40
|
+
called_args = nil
|
41
|
+
|
42
|
+
Delayed::Worker.lifecycle.after(:create) do |args|
|
43
|
+
called = true
|
44
|
+
called_args = args
|
45
|
+
end
|
46
|
+
|
47
|
+
job = SimpleJob.new
|
48
|
+
Delayed::Job.enqueue(job)
|
49
|
+
|
50
|
+
expect(called).to be_truthy
|
51
|
+
expect(called_args[:payload_object]).to eq job
|
52
|
+
end
|
53
|
+
|
38
54
|
it "is able to set priority when enqueuing items" do
|
39
55
|
@job = Delayed::Job.enqueue SimpleJob.new, priority: 5
|
40
56
|
expect(@job.priority).to eq(5)
|
@@ -389,7 +405,7 @@ shared_examples_for "a backend" do
|
|
389
405
|
expect(job1.reload.handler).to include("ErrorJob")
|
390
406
|
end
|
391
407
|
|
392
|
-
context "next_in_strand management - deadlocks and race conditions", non_transactional: true do
|
408
|
+
context "next_in_strand management - deadlocks and race conditions", non_transactional: true, slow: true do
|
393
409
|
# The following unit tests are fairly slow and non-deterministic. It may be
|
394
410
|
# easier to make them fail quicker and more consistently by adding a random
|
395
411
|
# sleep into the appropriate trigger(s).
|
data/spec/spec_helper.rb
CHANGED
@@ -47,14 +47,14 @@ RSpec::Core::ExampleGroup.include(NoYamlDump)
|
|
47
47
|
|
48
48
|
ENV["TEST_ENV_NUMBER"] ||= "1"
|
49
49
|
ENV["TEST_DB_HOST"] ||= "localhost"
|
50
|
-
ENV["TEST_DB_DATABASE"] ||= "inst-jobs-test-#{ENV
|
50
|
+
ENV["TEST_DB_DATABASE"] ||= "inst-jobs-test-#{ENV.fetch('TEST_ENV_NUMBER', nil)}"
|
51
51
|
|
52
52
|
connection_config = {
|
53
53
|
adapter: :postgresql,
|
54
54
|
host: ENV["TEST_DB_HOST"].presence,
|
55
55
|
encoding: "utf8",
|
56
|
-
username: ENV
|
57
|
-
database: ENV
|
56
|
+
username: ENV.fetch("TEST_DB_USERNAME", nil),
|
57
|
+
database: ENV.fetch("TEST_DB_DATABASE", nil),
|
58
58
|
min_messages: "notice",
|
59
59
|
# Ensure the pool is big enough the deadlock tests don't get starved for connections by rails instead
|
60
60
|
pool: 20
|
metadata
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: inst-jobs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cody Cutrer
|
8
8
|
- Ethan Vizitei
|
9
9
|
- Jacob Burroughs
|
10
|
-
autorequire:
|
10
|
+
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2022-
|
13
|
+
date: 2022-05-09 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|
@@ -410,7 +410,7 @@ dependencies:
|
|
410
410
|
- - ">="
|
411
411
|
- !ruby/object:Gem::Version
|
412
412
|
version: '0'
|
413
|
-
description:
|
413
|
+
description:
|
414
414
|
email:
|
415
415
|
- cody@instructure.com
|
416
416
|
- evizitei@instructure.com
|
@@ -459,6 +459,7 @@ files:
|
|
459
459
|
- db/migrate/20220128084800_update_insert_trigger_for_singleton_unique_constraint_change.rb
|
460
460
|
- db/migrate/20220128084900_update_delete_trigger_for_singleton_unique_constraint_change.rb
|
461
461
|
- db/migrate/20220203063200_remove_old_singleton_index.rb
|
462
|
+
- db/migrate/20220328152900_add_failed_jobs_indicies.rb
|
462
463
|
- exe/inst_jobs
|
463
464
|
- lib/delayed/backend/active_record.rb
|
464
465
|
- lib/delayed/backend/base.rb
|
@@ -526,7 +527,7 @@ homepage: https://github.com/instructure/inst-jobs
|
|
526
527
|
licenses: []
|
527
528
|
metadata:
|
528
529
|
rubygems_mfa_required: 'true'
|
529
|
-
post_install_message:
|
530
|
+
post_install_message:
|
530
531
|
rdoc_options: []
|
531
532
|
require_paths:
|
532
533
|
- lib
|
@@ -541,32 +542,32 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
541
542
|
- !ruby/object:Gem::Version
|
542
543
|
version: '0'
|
543
544
|
requirements: []
|
544
|
-
rubygems_version: 3.1.
|
545
|
-
signing_key:
|
545
|
+
rubygems_version: 3.1.6
|
546
|
+
signing_key:
|
546
547
|
specification_version: 4
|
547
548
|
summary: Instructure-maintained fork of delayed_job
|
548
549
|
test_files:
|
549
|
-
- spec/
|
550
|
-
- spec/spec_helper.rb
|
551
|
-
- spec/shared_jobs_specs.rb
|
552
|
-
- spec/shared/performable_method.rb
|
553
|
-
- spec/shared/testing.rb
|
554
|
-
- spec/shared/delayed_batch.rb
|
555
|
-
- spec/shared/worker.rb
|
556
|
-
- spec/shared/delayed_method.rb
|
557
|
-
- spec/shared/shared_backend.rb
|
558
|
-
- spec/migrate/20140924140513_add_story_table.rb
|
559
|
-
- spec/delayed/server_spec.rb
|
550
|
+
- spec/active_record_job_spec.rb
|
560
551
|
- spec/delayed/cli_spec.rb
|
561
552
|
- spec/delayed/daemon_spec.rb
|
562
|
-
- spec/delayed/worker_spec.rb
|
563
|
-
- spec/delayed/periodic_spec.rb
|
564
553
|
- spec/delayed/message_sending_spec.rb
|
554
|
+
- spec/delayed/periodic_spec.rb
|
555
|
+
- spec/delayed/server_spec.rb
|
565
556
|
- spec/delayed/settings_spec.rb
|
566
557
|
- spec/delayed/work_queue/in_process_spec.rb
|
567
|
-
- spec/delayed/work_queue/parent_process_spec.rb
|
568
558
|
- spec/delayed/work_queue/parent_process/client_spec.rb
|
569
559
|
- spec/delayed/work_queue/parent_process/server_spec.rb
|
570
|
-
- spec/delayed/
|
560
|
+
- spec/delayed/work_queue/parent_process_spec.rb
|
571
561
|
- spec/delayed/worker/consul_health_check_spec.rb
|
572
|
-
- spec/
|
562
|
+
- spec/delayed/worker/health_check_spec.rb
|
563
|
+
- spec/delayed/worker_spec.rb
|
564
|
+
- spec/migrate/20140924140513_add_story_table.rb
|
565
|
+
- spec/sample_jobs.rb
|
566
|
+
- spec/shared/delayed_batch.rb
|
567
|
+
- spec/shared/delayed_method.rb
|
568
|
+
- spec/shared/performable_method.rb
|
569
|
+
- spec/shared/shared_backend.rb
|
570
|
+
- spec/shared/testing.rb
|
571
|
+
- spec/shared/worker.rb
|
572
|
+
- spec/shared_jobs_specs.rb
|
573
|
+
- spec/spec_helper.rb
|