inst-jobs 3.0.13 → 3.1.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c1369efb0e72de3f01f922b7f77a95a6c5dd1979aaec11cfd76cdc4507202428
4
- data.tar.gz: 244a543711c3ceab301f4ea0f30bb238e47330921059ec27133a7a2de44389f7
3
+ metadata.gz: 95bdbd537405c6325f378bed05570a3149053ba8a2e290893010c590df72ea9a
4
+ data.tar.gz: 6f0d577f1fba37bb01e3e0a4ec05b600e65ebb77d001e29e38b479f6facde73b
5
5
  SHA512:
6
- metadata.gz: '09ce7c560febe39082502641d62e9309f515d026eb95d840e3645fbb2725d9eb6c70f2b147402a44d462bc5761c8f4727739e87a7f4a6acbed391868ae024d2e'
7
- data.tar.gz: d0332dc2e652adf67b93f61122d535a7e48f20d48e9d66a08d2e5fc75d08c4be1c7e15b4656c7f1bfc4102a389bd23d256b4d43cb88b914e98ce9a0ea67ddd3c
6
+ metadata.gz: 38392cab25180d44f40960ffb15b2dd3241bd739980b9d0962b93020a809497bb1a9022caf7a05f4ba40f4cc3792281f03468946c33a1fc62891dec3b411f7cf
7
+ data.tar.gz: cbea2ab6e762a876994179ac1c9ffd414ea2ec13905931b2cddb087d816664e8b682ecf8f9406726d8f80a0867b8e44bc1331b6e0e73de3415b4ab31090d1ee9
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddRequeuedJobIdToFailedJobs < ActiveRecord::Migration[6.0]
4
+ def change
5
+ add_column :failed_jobs, :requeued_job_id, :integer, limit: 8
6
+ end
7
+ end
@@ -583,6 +583,21 @@ module Delayed
583
583
  def self.cleanup_old_jobs(before_date, batch_size: 10_000)
584
584
  where("failed_at < ?", before_date).in_batches(of: batch_size).delete_all
585
585
  end
586
+
587
+ def requeue!
588
+ attrs = attributes.except("id", "last_error", "locked_at", "failed_at", "locked_by", "original_job_id",
589
+ "requeued_job_id")
590
+ self.class.transaction do
591
+ job = nil
592
+ Delayed::Worker.lifecycle.run_callbacks(:create, attrs.merge("payload_object" => payload_object)) do
593
+ job = Job.create(attrs)
594
+ end
595
+ self.requeued_job_id = job.id
596
+ save!
597
+ JobTracking.job_created(job)
598
+ job
599
+ end
600
+ end
586
601
  end
587
602
  end
588
603
  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],
@@ -76,7 +77,7 @@ module Delayed
76
77
  def execute(*args, &block)
77
78
  @before.each { |c| c.call(*args) }
78
79
  result = @around.call(*args, &block)
79
- @after.each { |c| c.call(*args) }
80
+ @after.each { |c| c.call(*args, result: result) }
80
81
  result
81
82
  end
82
83
 
@@ -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]
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Delayed
4
- VERSION = "3.0.13"
4
+ VERSION = "3.1.2"
5
5
  end
@@ -276,7 +276,7 @@ module Delayed
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.]/, '.')}-")
@@ -300,4 +300,27 @@ describe "Delayed::Backed::ActiveRecord::Job" do
300
300
  allow(Delayed::Job.connection).to receive(:execute).and_call_original
301
301
  end
302
302
  end
303
+
304
+ context "Failed#requeue!" do
305
+ it "requeues a failed job" do
306
+ j = create_job(attempts: 1, max_attempts: 1)
307
+ fj = j.fail!
308
+
309
+ lifecycle_args = nil
310
+ Delayed::Worker.lifecycle.after(:create) do |args|
311
+ lifecycle_args = args
312
+ end
313
+ j2 = fj.requeue!
314
+ expect(lifecycle_args["payload_object"].class).to eq SimpleJob
315
+ expect(fj.reload.requeued_job_id).to eq j2.id
316
+
317
+ orig_atts = j.attributes.except("id", "locked_at", "locked_by")
318
+ new_atts = j2.attributes.except("id", "locked_at", "locked_by")
319
+ expect(orig_atts).to eq(new_atts)
320
+
321
+ # ensure the requeued job actually runs even though `attempts` are maxed out
322
+ # (so it will not be retried after being manually requeued)
323
+ expect { run_job(j2) }.to change(SimpleJob, :runs).by(1)
324
+ end
325
+ end
303
326
  end
@@ -35,6 +35,23 @@ 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
+ created_job = nil
41
+
42
+ Delayed::Worker.lifecycle.after(:create) do |_, result:|
43
+ called = true
44
+ created_job = result
45
+ end
46
+
47
+ job = SimpleJob.new
48
+ Delayed::Job.enqueue(job)
49
+
50
+ expect(called).to be_truthy
51
+ expect(created_job).to be_kind_of Delayed::Job
52
+ expect(created_job.tag).to eq "SimpleJob#perform"
53
+ end
54
+
38
55
  it "is able to set priority when enqueuing items" do
39
56
  @job = Delayed::Job.enqueue SimpleJob.new, priority: 5
40
57
  expect(@job.priority).to eq(5)
@@ -65,7 +82,7 @@ shared_examples_for "a backend" do
65
82
  it "works with jobs in modules" do
66
83
  M::ModuleJob.runs = 0
67
84
  job = Delayed::Job.enqueue M::ModuleJob.new
68
- expect { job.invoke_job }.to change { M::ModuleJob.runs }.from(0).to(1)
85
+ expect { job.invoke_job }.to change(M::ModuleJob, :runs).from(0).to(1)
69
86
  end
70
87
 
71
88
  it "raises an DeserializationError when the job class is totally unknown" do
@@ -347,7 +347,7 @@ shared_examples_for "Delayed::Worker" do
347
347
 
348
348
  it "does not run expired jobs" do
349
349
  Delayed::Job.enqueue SimpleJob.new, expires_at: Delayed::Job.db_time_now - 1.day
350
- expect { @worker.run }.to change(SimpleJob, :runs).by(0)
350
+ expect { @worker.run }.not_to change(SimpleJob, :runs)
351
351
  end
352
352
 
353
353
  it "reports a permanent failure when an expired job is dequeued" do
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,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inst-jobs
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.13
4
+ version: 3.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cody Cutrer
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2022-04-05 00:00:00.000000000 Z
13
+ date: 2022-05-25 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
@@ -460,6 +460,7 @@ files:
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
462
  - db/migrate/20220328152900_add_failed_jobs_indicies.rb
463
+ - db/migrate/20220519204546_add_requeued_job_id_to_failed_jobs.rb
463
464
  - exe/inst_jobs
464
465
  - lib/delayed/backend/active_record.rb
465
466
  - lib/delayed/backend/base.rb