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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 80d0bc1d05ae57467d66361e81fa51a5b45e3fa391250005c59229554757ec08
4
- data.tar.gz: 32d3df9f6085199fa1e9586330c6ba255f898602eb546ea94f49de52b628e7df
3
+ metadata.gz: 37ca25ff97580c47a56d0d40a1ab2f78c62a2f47629d0c2e5ba6c8e5c4ace0bd
4
+ data.tar.gz: 16d4a060bfc0c23f84360d305e35adb5482d0d96f50b50c1a45a8a0b02739c90
5
5
  SHA512:
6
- metadata.gz: 3befc529f42b4ebcba81aacea9bb4c4401a9daa06708c545572b6d6485db85b3d650b9d12baec0dadad9c7387b30ec5e051493b2992a0f6cd41ced9bcfca2485
7
- data.tar.gz: 3a3629c08198e0e17455468fd670f4acdd05b28d76b4fbe88516f50692852b6edaf4ed29b6fc26babdfbcca669c9502e88c37616a24cbed5e82611664a3262de
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
@@ -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
- job = create(**kwargs)
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
- job = create(**kwargs)
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)
@@ -5,6 +5,7 @@ module Delayed
5
5
 
6
6
  class Lifecycle
7
7
  EVENTS = {
8
+ create: [:args],
8
9
  error: %i[worker job exception],
9
10
  exceptional_exit: %i[worker exception],
10
11
  execute: [:worker],
@@ -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["DATABASE_URL"])
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]
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Delayed
4
- VERSION = "3.0.10"
4
+ VERSION = "3.1.0"
5
5
  end
@@ -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["TMPDIR"]
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
 
@@ -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['TEST_ENV_NUMBER']}"
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["TEST_DB_USERNAME"],
57
- database: ENV["TEST_DB_DATABASE"],
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.10
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-03-21 00:00:00.000000000 Z
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.4
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/sample_jobs.rb
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/worker/health_check_spec.rb
560
+ - spec/delayed/work_queue/parent_process_spec.rb
571
561
  - spec/delayed/worker/consul_health_check_spec.rb
572
- - spec/active_record_job_spec.rb
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