inst-jobs 2.3.3 → 2.4.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/db/migrate/20101216224513_create_delayed_jobs.rb +9 -7
  3. data/db/migrate/20110531144916_cleanup_delayed_jobs_indexes.rb +8 -13
  4. data/db/migrate/20110610213249_optimize_delayed_jobs.rb +8 -8
  5. data/db/migrate/20110831210257_add_delayed_jobs_next_in_strand.rb +25 -25
  6. data/db/migrate/20120510004759_delayed_jobs_delete_trigger_lock_for_update.rb +4 -8
  7. data/db/migrate/20120531150712_drop_psql_jobs_pop_fn.rb +1 -3
  8. data/db/migrate/20120607164022_delayed_jobs_use_advisory_locks.rb +11 -15
  9. data/db/migrate/20120607181141_index_jobs_on_locked_by.rb +1 -1
  10. data/db/migrate/20120608191051_add_jobs_run_at_index.rb +2 -2
  11. data/db/migrate/20120927184213_change_delayed_jobs_handler_to_text.rb +1 -1
  12. data/db/migrate/20140505215510_copy_failed_jobs_original_id.rb +2 -3
  13. data/db/migrate/20150807133223_add_max_concurrent_to_jobs.rb +9 -13
  14. data/db/migrate/20151210162949_improve_max_concurrent.rb +4 -8
  15. data/db/migrate/20161206323555_add_back_default_string_limits_jobs.rb +3 -2
  16. data/db/migrate/20181217155351_speed_up_max_concurrent_triggers.rb +13 -17
  17. data/db/migrate/20200330230722_add_id_to_get_delayed_jobs_index.rb +8 -8
  18. data/db/migrate/20200824222232_speed_up_max_concurrent_delete_trigger.rb +72 -77
  19. data/db/migrate/20200825011002_add_strand_order_override.rb +93 -97
  20. data/db/migrate/20210809145804_add_n_strand_index.rb +3 -3
  21. data/db/migrate/20210812210128_add_singleton_column.rb +200 -0
  22. data/exe/inst_jobs +3 -2
  23. data/lib/delayed/backend/active_record.rb +183 -149
  24. data/lib/delayed/backend/base.rb +80 -75
  25. data/lib/delayed/batch.rb +11 -9
  26. data/lib/delayed/cli.rb +98 -84
  27. data/lib/delayed/core_ext/kernel.rb +4 -2
  28. data/lib/delayed/daemon.rb +70 -74
  29. data/lib/delayed/job_tracking.rb +26 -25
  30. data/lib/delayed/lifecycle.rb +27 -24
  31. data/lib/delayed/log_tailer.rb +17 -17
  32. data/lib/delayed/logging.rb +13 -16
  33. data/lib/delayed/message_sending.rb +43 -52
  34. data/lib/delayed/performable_method.rb +6 -8
  35. data/lib/delayed/periodic.rb +66 -65
  36. data/lib/delayed/plugin.rb +2 -4
  37. data/lib/delayed/pool.rb +198 -193
  38. data/lib/delayed/server/helpers.rb +6 -6
  39. data/lib/delayed/server.rb +51 -54
  40. data/lib/delayed/settings.rb +93 -81
  41. data/lib/delayed/testing.rb +21 -22
  42. data/lib/delayed/version.rb +1 -1
  43. data/lib/delayed/work_queue/in_process.rb +21 -18
  44. data/lib/delayed/work_queue/parent_process/client.rb +54 -55
  45. data/lib/delayed/work_queue/parent_process/server.rb +215 -209
  46. data/lib/delayed/work_queue/parent_process.rb +52 -53
  47. data/lib/delayed/worker/consul_health_check.rb +21 -19
  48. data/lib/delayed/worker/health_check.rb +21 -12
  49. data/lib/delayed/worker/null_health_check.rb +3 -1
  50. data/lib/delayed/worker/process_helper.rb +8 -9
  51. data/lib/delayed/worker.rb +271 -265
  52. data/lib/delayed/yaml_extensions.rb +12 -10
  53. data/lib/delayed_job.rb +37 -38
  54. data/lib/inst-jobs.rb +1 -1
  55. data/spec/active_record_job_spec.rb +129 -136
  56. data/spec/delayed/cli_spec.rb +7 -7
  57. data/spec/delayed/daemon_spec.rb +8 -8
  58. data/spec/delayed/message_sending_spec.rb +16 -9
  59. data/spec/delayed/periodic_spec.rb +13 -12
  60. data/spec/delayed/server_spec.rb +38 -38
  61. data/spec/delayed/settings_spec.rb +26 -25
  62. data/spec/delayed/work_queue/in_process_spec.rb +7 -7
  63. data/spec/delayed/work_queue/parent_process/client_spec.rb +15 -11
  64. data/spec/delayed/work_queue/parent_process/server_spec.rb +43 -40
  65. data/spec/delayed/work_queue/parent_process_spec.rb +21 -21
  66. data/spec/delayed/worker/consul_health_check_spec.rb +22 -22
  67. data/spec/delayed/worker/health_check_spec.rb +51 -49
  68. data/spec/delayed/worker_spec.rb +28 -25
  69. data/spec/sample_jobs.rb +45 -15
  70. data/spec/shared/delayed_batch.rb +74 -67
  71. data/spec/shared/delayed_method.rb +143 -102
  72. data/spec/shared/performable_method.rb +39 -38
  73. data/spec/shared/shared_backend.rb +534 -441
  74. data/spec/shared/testing.rb +14 -14
  75. data/spec/shared/worker.rb +155 -147
  76. data/spec/shared_jobs_specs.rb +13 -13
  77. data/spec/spec_helper.rb +43 -40
  78. metadata +81 -59
  79. data/lib/delayed/backend/redis/bulk_update.lua +0 -50
  80. data/lib/delayed/backend/redis/destroy_job.lua +0 -2
  81. data/lib/delayed/backend/redis/enqueue.lua +0 -29
  82. data/lib/delayed/backend/redis/fail_job.lua +0 -5
  83. data/lib/delayed/backend/redis/find_available.lua +0 -3
  84. data/lib/delayed/backend/redis/functions.rb +0 -59
  85. data/lib/delayed/backend/redis/get_and_lock_next_available.lua +0 -17
  86. data/lib/delayed/backend/redis/includes/jobs_common.lua +0 -203
  87. data/lib/delayed/backend/redis/job.rb +0 -528
  88. data/lib/delayed/backend/redis/set_running.lua +0 -5
  89. data/lib/delayed/backend/redis/tickle_strand.lua +0 -2
  90. data/spec/gemfiles/52.gemfile +0 -7
  91. data/spec/gemfiles/60.gemfile +0 -7
  92. data/spec/gemfiles/60.gemfile.lock +0 -246
  93. data/spec/gemfiles/61.gemfile +0 -7
  94. data/spec/redis_job_spec.rb +0 -148
@@ -1,30 +1,31 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
3
+ require "spec_helper"
4
4
 
5
5
  RSpec.describe Delayed::Periodic do
6
- around(:each) do |block|
6
+ around do |block|
7
7
  # make sure we can use ".cron" and
8
8
  # such safely without leaking global state
9
- prev_sched = Delayed::Periodic.scheduled
10
- prev_ovr = Delayed::Periodic.overrides
11
- Delayed::Periodic.scheduled = {}
12
- Delayed::Periodic.overrides = {}
9
+ prev_sched = described_class.scheduled
10
+ prev_ovr = described_class.overrides
11
+ described_class.scheduled = {}
12
+ described_class.overrides = {}
13
13
  block.call
14
14
  ensure
15
- Delayed::Periodic.scheduled = prev_sched
16
- Delayed::Periodic.overrides = prev_ovr
15
+ described_class.scheduled = prev_sched
16
+ described_class.overrides = prev_ovr
17
17
  Delayed::Job.delete_all
18
18
  end
19
19
 
20
20
  describe ".cron" do
21
- let(:job_name){ 'just a test'}
21
+ let(:job_name) { "just a test" }
22
+
22
23
  it "provides a tag by default for periodic jobs" do
23
- Delayed::Periodic.cron job_name, '*/10 * * * *' do
24
+ described_class.cron job_name, "*/10 * * * *" do
24
25
  # no-op
25
26
  end
26
- instance = Delayed::Periodic.scheduled[job_name]
27
- expect(instance).to_not be_nil
27
+ instance = described_class.scheduled[job_name]
28
+ expect(instance).not_to be_nil
28
29
  expect(instance.enqueue_args[:singleton]).to eq("periodic: just a test")
29
30
  end
30
31
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
4
- require 'delayed/server'
3
+ require "spec_helper"
4
+ require "delayed/server"
5
5
 
6
6
  RSpec.describe Delayed::Server, sinatra: true do
7
7
  include Rack::Test::Methods
@@ -24,78 +24,78 @@ RSpec.describe Delayed::Server, sinatra: true do
24
24
  before do
25
25
  3.times do |i|
26
26
  Delayed::Job.create!({
27
- run_at: Time.now,
28
- locked_at: Time.now,
29
- locked_by: "dummy-runner-#{i}:${$$}",
30
- })
27
+ run_at: Time.zone.now,
28
+ locked_at: Time.zone.now,
29
+ locked_by: "dummy-runner-#{i}:${$$}"
30
+ })
31
31
  end
32
- get '/running'
32
+ get "/running"
33
33
  end
34
34
 
35
- it 'must return a json object with the running job data in an array', aggregate_failures: true do
35
+ it "must return a json object with the running job data in an array", aggregate_failures: true do
36
36
  expect(last_response).to be_ok
37
- expect(parsed_body['data']).to be_an Array
38
- expect(parsed_body['data'].size).to eq 3
37
+ expect(parsed_body["data"]).to be_an Array
38
+ expect(parsed_body["data"].size).to eq 3
39
39
  end
40
40
  end
41
41
 
42
42
  describe "get '/jobs'" do
43
- let!(:job_1) { Delayed::Job.enqueue(SimpleJob.new, strand: 'strand-1') }
44
- let!(:job_2) { Delayed::Job.enqueue(SimpleJob.new, strand: 'strand-2') }
45
- let!(:job_3) { Delayed::Job.enqueue(SimpleJob.new, strand: 'strand-3') }
43
+ let!(:job1) { Delayed::Job.enqueue(SimpleJob.new, strand: "strand-1") }
44
+ let!(:job2) { Delayed::Job.enqueue(SimpleJob.new, strand: "strand-2") }
45
+ let!(:job3) { Delayed::Job.enqueue(SimpleJob.new, strand: "strand-3") }
46
46
 
47
- context 'with the flavor param set to id' do
47
+ context "with the flavor param set to id" do
48
48
  before do
49
- get "/jobs?flavor=id&search_term=#{job_2.id}"
49
+ get "/jobs?flavor=id&search_term=#{job2.id}"
50
50
  end
51
51
 
52
- it 'must only return the job with the id specified in the search_term param' do
53
- jobs = parsed_body['data']
54
- job_ids = jobs.map{ |j| j['id'] }
55
- expect(job_ids).to eq [job_2.id]
52
+ it "must only return the job with the id specified in the search_term param" do
53
+ jobs = parsed_body["data"]
54
+ job_ids = jobs.map { |j| j["id"] }
55
+ expect(job_ids).to eq [job2.id]
56
56
  end
57
57
 
58
- it 'must set recordsFiltered in the response to 1' do
59
- expect(parsed_body['recordsFiltered']).to eq 1
58
+ it "must set recordsFiltered in the response to 1" do
59
+ expect(parsed_body["recordsFiltered"]).to eq 1
60
60
  end
61
61
  end
62
62
  end
63
63
 
64
64
  describe "post '/bulk_update'" do
65
- let!(:job_1) { Delayed::Job.enqueue(SimpleJob.new, strand: 'strand-1') }
66
- let!(:job_2) { Delayed::Job.enqueue(SimpleJob.new, strand: 'strand-2') }
67
- let!(:job_3) { Delayed::Job.enqueue(SimpleJob.new, strand: 'strand-3') }
65
+ let!(:job1) { Delayed::Job.enqueue(SimpleJob.new, strand: "strand-1") }
66
+ let!(:job2) { Delayed::Job.enqueue(SimpleJob.new, strand: "strand-2") }
67
+ let!(:job3) { Delayed::Job.enqueue(SimpleJob.new, strand: "strand-3") }
68
68
 
69
- context 'with update enabled' do
69
+ context "with update enabled" do
70
70
  before do
71
71
  @update = true
72
- post "/bulk_update", params=JSON.generate(action: 'destroy', ids: [job_1.id])
72
+ post "/bulk_update", JSON.generate(action: "destroy", ids: [job1.id])
73
73
  end
74
74
 
75
- it 'must remove job_1' do
76
- expect{ Delayed::Job.find(job_1.id) }.to raise_error(ActiveRecord::RecordNotFound)
77
- expect(Delayed::Job.find(job_2.id)).to_not be_nil
78
- expect(Delayed::Job.find(job_3.id)).to_not be_nil
75
+ it "must remove job1" do
76
+ expect { Delayed::Job.find(job1.id) }.to raise_error(ActiveRecord::RecordNotFound)
77
+ expect(Delayed::Job.find(job2.id)).not_to be_nil
78
+ expect(Delayed::Job.find(job3.id)).not_to be_nil
79
79
  end
80
80
 
81
- it 'must return ok' do
81
+ it "must return ok" do
82
82
  expect(last_response.ok?).to be true
83
83
  end
84
84
  end
85
85
 
86
- context 'with update disabled' do
86
+ context "with update disabled" do
87
87
  before do
88
88
  @update = false
89
- post "/bulk_update", params=JSON.generate(action: 'destroy', ids: [job_1.id])
89
+ post "/bulk_update", JSON.generate(action: "destroy", ids: [job1.id])
90
90
  end
91
91
 
92
- it 'must not remove job_1' do
93
- expect(Delayed::Job.find(job_1.id)).to_not be_nil
94
- expect(Delayed::Job.find(job_2.id)).to_not be_nil
95
- expect(Delayed::Job.find(job_3.id)).to_not be_nil
92
+ it "must not remove job1" do
93
+ expect(Delayed::Job.find(job1.id)).not_to be_nil
94
+ expect(Delayed::Job.find(job2.id)).not_to be_nil
95
+ expect(Delayed::Job.find(job3.id)).not_to be_nil
96
96
  end
97
97
 
98
- it 'must return forbidden' do
98
+ it "must return forbidden" do
99
99
  expect(last_response.forbidden?).to be true
100
100
  end
101
101
  end
@@ -1,47 +1,48 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
3
+ require "spec_helper"
4
4
 
5
5
  RSpec.describe Delayed::Settings do
6
- let(:configfile) {<<-YAML
7
- default:
8
- workers:
9
- - queue: myqueue
10
- workers: 2
11
- - queue: secondqueue
12
- max_priority: 7
13
- max_attempts: 1
6
+ let(:configfile) do
7
+ <<~YAML
8
+ default:
9
+ workers:
10
+ - queue: myqueue
11
+ workers: 2
12
+ - queue: secondqueue
13
+ max_priority: 7
14
+ max_attempts: 1
14
15
  YAML
15
- }
16
+ end
16
17
 
17
- describe '.worker_config' do
18
- it 'merges each worker config with the top-level config' do
18
+ describe ".worker_config" do
19
+ it "merges each worker config with the top-level config" do
19
20
  expect(File).to receive(:read).with("fname").and_return(configfile)
20
21
  config = described_class.worker_config("fname")
21
22
  expect(config[:workers]).to eq([
22
- {'queue' => 'myqueue', 'workers' => 2, 'max_attempts' => 1},
23
- {'queue' => 'secondqueue', 'max_priority' => 7, 'max_attempts' => 1},
24
- ])
23
+ { "queue" => "myqueue", "workers" => 2, "max_attempts" => 1 },
24
+ { "queue" => "secondqueue", "max_priority" => 7, "max_attempts" => 1 }
25
+ ])
25
26
  end
26
27
  end
27
28
 
28
- describe '.apply_worker_config!' do
29
- it 'applies global settings from the given config' do
29
+ describe ".apply_worker_config!" do
30
+ it "applies global settings from the given config" do
30
31
  expect(described_class).to receive(:last_ditch_logfile=).with(true)
31
- described_class.apply_worker_config!('last_ditch_logfile' => true)
32
+ described_class.apply_worker_config!("last_ditch_logfile" => true)
32
33
  end
33
34
 
34
- it 'merges in parent_process overrides to default config' do
35
- described_class.apply_worker_config!('parent_process' => { 'foo' => 'bar' })
35
+ it "merges in parent_process overrides to default config" do
36
+ described_class.apply_worker_config!("parent_process" => { "foo" => "bar" })
36
37
 
37
- expect(Delayed::Settings.parent_process).to include('foo' => 'bar')
38
+ expect(described_class.parent_process).to include("foo" => "bar")
38
39
  end
39
40
  end
40
41
 
41
- describe '.parent_process_client_timeout=' do
42
- it 'must update the value in the parent_process settings hash' do
43
- Delayed::Settings.parent_process_client_timeout = 42
44
- expect(Delayed::Settings.parent_process['server_socket_timeout']).to eq 42
42
+ describe ".parent_process_client_timeout=" do
43
+ it "must update the value in the parent_process settings hash" do
44
+ described_class.parent_process_client_timeout = 42
45
+ expect(described_class.parent_process["server_socket_timeout"]).to eq 42
45
46
  end
46
47
  end
47
48
  end
@@ -1,27 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
3
+ require "spec_helper"
4
4
 
5
5
  RSpec.describe Delayed::WorkQueue::InProcess do
6
6
  before :all do
7
7
  Delayed.select_backend(Delayed::Backend::ActiveRecord::Job)
8
8
  end
9
9
 
10
- after :each do
10
+ after do
11
11
  Delayed::Worker.lifecycle.reset!
12
12
  end
13
13
 
14
14
  let(:subject) { described_class.new }
15
- let(:worker_config) { {queue: "test", min_priority: 1, max_priority: 2} }
15
+ let(:worker_config) { { queue: "test", min_priority: 1, max_priority: 2 } }
16
16
  let(:args) { ["worker_name", worker_config] }
17
17
 
18
- it 'triggers the lifecycle event around the pop' do
18
+ it "triggers the lifecycle event around the pop" do
19
19
  called = false
20
20
  Delayed::Worker.lifecycle.around(:work_queue_pop) do |queue, &cb|
21
21
  expect(queue).to eq(subject)
22
- expect(Delayed::Job).to receive(:get_and_lock_next_available).
23
- with("worker_name", "test", 1, 2).
24
- and_return(:job)
22
+ expect(Delayed::Job).to receive(:get_and_lock_next_available)
23
+ .with("worker_name", "test", 1, 2)
24
+ .and_return(:job)
25
25
  called = true
26
26
  cb.call(queue)
27
27
  end
@@ -1,22 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
3
+ require "spec_helper"
4
4
 
5
5
  RSpec.describe Delayed::WorkQueue::ParentProcess::Client do
6
6
  let(:subject) { described_class.new(addrinfo).tap(&:init) }
7
- let(:addrinfo) { double('Addrinfo') }
8
- let(:connection) { double('Socket') }
7
+ let(:addrinfo) { double("Addrinfo") }
8
+ let(:connection) { double("Socket") }
9
9
  let(:job) { Delayed::Job.new(locked_by: "worker_name") }
10
10
  let(:worker_config) { { queue: "queue_name", min_priority: 1, max_priority: 2 } }
11
11
  let(:args) { ["worker_name", worker_config] }
12
12
  let(:job_args) { [["worker_name"], "queue_name", 1, 2] }
13
13
 
14
14
  before :all do
15
- FileUtils.mkdir_p(Delayed::Settings.expand_rails_path('tmp'))
15
+ FileUtils.mkdir_p(Delayed::Settings.expand_rails_path("tmp"))
16
16
  Delayed.select_backend(Delayed::Backend::ActiveRecord::Job)
17
17
  end
18
18
 
19
- it 'marshals the given arguments to the server and returns the response' do
19
+ it "marshals the given arguments to the server and returns the response" do
20
20
  expect(addrinfo).to receive(:connect).once.and_return(connection)
21
21
  expect(connection).to receive(:eof?).and_return(false)
22
22
  expect(IO).to receive(:select).and_return([[connection], nil, nil])
@@ -26,7 +26,7 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Client do
26
26
  expect(response).to eq(job)
27
27
  end
28
28
 
29
- it 'returns nil and then reconnects on socket write error' do
29
+ it "returns nil and then reconnects on socket write error" do
30
30
  expect(addrinfo).to receive(:connect).once.and_return(connection)
31
31
  expect(Marshal).to receive(:dump).and_raise(SystemCallError.new("failure"))
32
32
  expect(IO).to receive(:select).and_return([[connection], nil, nil])
@@ -42,7 +42,7 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Client do
42
42
  expect(response).to eq(job)
43
43
  end
44
44
 
45
- it 'returns nil and then reconnects when the socket indicates eof' do
45
+ it "returns nil and then reconnects when the socket indicates eof" do
46
46
  expect(addrinfo).to receive(:connect).once.and_return(connection)
47
47
  expect(connection).to receive(:eof?).and_return(true)
48
48
  expect(Marshal).to receive(:dump).with(args, connection).ordered
@@ -59,17 +59,19 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Client do
59
59
  expect(response).to eq(job)
60
60
  end
61
61
 
62
- it 'errors if the response is not a locked job' do
62
+ it "errors if the response is not a locked job" do
63
63
  expect(addrinfo).to receive(:connect).once.and_return(connection)
64
64
  expect(Marshal).to receive(:dump).with(args, connection)
65
65
  expect(IO).to receive(:select).and_return([[connection], nil, nil])
66
66
  expect(Marshal).to receive(:load).with(connection).and_return(:not_a_job)
67
67
  expect(connection).to receive(:eof?).and_return(false)
68
68
 
69
- expect { subject.get_and_lock_next_available(*args) }.to raise_error(Delayed::WorkQueue::ParentProcess::ProtocolError)
69
+ expect do
70
+ subject.get_and_lock_next_available(*args)
71
+ end.to raise_error(Delayed::WorkQueue::ParentProcess::ProtocolError)
70
72
  end
71
73
 
72
- it 'errors if the response is a job not locked by this worker' do
74
+ it "errors if the response is a job not locked by this worker" do
73
75
  expect(addrinfo).to receive(:connect).once.and_return(connection)
74
76
  expect(Marshal).to receive(:dump).with(args, connection)
75
77
  job.locked_by = "somebody_else"
@@ -77,6 +79,8 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Client do
77
79
  expect(Marshal).to receive(:load).with(connection).and_return(job)
78
80
  expect(connection).to receive(:eof?).and_return(false)
79
81
 
80
- expect { subject.get_and_lock_next_available(*args) }.to raise_error(Delayed::WorkQueue::ParentProcess::ProtocolError)
82
+ expect do
83
+ subject.get_and_lock_next_available(*args)
84
+ end.to raise_error(Delayed::WorkQueue::ParentProcess::ProtocolError)
81
85
  end
82
86
  end
@@ -1,20 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
3
+ require "spec_helper"
4
4
 
5
- RSpec.describe Delayed::WorkQueue::ParentProcess::Server do
6
- class JobClass
7
- attr_reader :id
5
+ class JobClass
6
+ attr_reader :id
8
7
 
9
- def initialize
10
- @id = rand
11
- end
8
+ def initialize
9
+ @id = rand
10
+ end
12
11
 
13
- def ==(other)
14
- self.id == other.id
15
- end
12
+ def ==(other)
13
+ id == other.id
16
14
  end
15
+ end
17
16
 
17
+ RSpec.describe Delayed::WorkQueue::ParentProcess::Server do
18
18
  let(:parent) { Delayed::WorkQueue::ParentProcess.new }
19
19
  let(:subject) { described_class.new(listen_socket) }
20
20
  let(:listen_socket) { Socket.unix_server_socket(parent.server_address) }
@@ -26,7 +26,7 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Server do
26
26
  before :all do
27
27
  Delayed.select_backend(Delayed::Backend::ActiveRecord::Job)
28
28
  Delayed::Settings.parent_process = {
29
- 'server_address' => '/tmp/inst-jobs-test.sock'
29
+ "server_address" => "/tmp/inst-jobs-test.sock"
30
30
  }
31
31
  end
32
32
 
@@ -34,27 +34,27 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Server do
34
34
  Delayed::Settings.parent_process = {}
35
35
  end
36
36
 
37
- after :each do
38
- File.unlink('/tmp/inst-jobs-test.sock') if File.exist?('/tmp/inst-jobs-test.sock')
37
+ after do
38
+ File.unlink("/tmp/inst-jobs-test.sock") if File.exist?("/tmp/inst-jobs-test.sock")
39
39
  end
40
40
 
41
- it 'accepts new clients' do
42
- client = Socket.unix(subject.listen_socket.local_address.unix_path)
41
+ it "accepts new clients" do
42
+ Socket.unix(subject.listen_socket.local_address.unix_path)
43
43
  expect { subject.run_once }.to change(subject, :connected_clients).by(1)
44
44
  end
45
45
 
46
- it 'queries the queue on client request' do
46
+ it "queries the queue on client request" do
47
47
  client = Socket.unix(subject.listen_socket.local_address.unix_path)
48
48
  subject.run_once
49
49
 
50
- expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return('worker_name' => job)
50
+ expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return("worker_name" => job)
51
51
  Marshal.dump(args, client)
52
52
  subject.run_once
53
53
  expect(client).to be_ready
54
54
  expect(Marshal.load(client)).to eq(job)
55
55
  end
56
56
 
57
- it 'can pop multiple jobs at once' do
57
+ it "can pop multiple jobs at once" do
58
58
  client1 = Socket.unix(subject.listen_socket.local_address.unix_path)
59
59
  subject.run_once
60
60
  client2 = Socket.unix(subject.listen_socket.local_address.unix_path)
@@ -62,8 +62,8 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Server do
62
62
 
63
63
  job1 = JobClass.new
64
64
  job2 = JobClass.new
65
- job_args = [["worker_name1", "worker_name2"], "queue_name", 1, 2, hash_including(prefetch: 3)]
66
- jobs = { 'worker_name1' => job1, 'worker_name2' => job2 }
65
+ job_args = [%w[worker_name1 worker_name2], "queue_name", 1, 2, hash_including(prefetch: 3)]
66
+ jobs = { "worker_name1" => job1, "worker_name2" => job2 }
67
67
 
68
68
  expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return(jobs)
69
69
  Marshal.dump(["worker_name1", worker_config], client1)
@@ -73,27 +73,28 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Server do
73
73
  expect(Marshal.load(client2)).to eq(job2)
74
74
  end
75
75
 
76
- it 'will prefetch and use jobs' do
76
+ it "will prefetch and use jobs" do
77
77
  client = Socket.unix(subject.listen_socket.local_address.unix_path)
78
78
  subject.run_once
79
79
 
80
- allow(subject).to receive(:prefetch_owner).and_return('work_queue:X')
81
- job_args = [["worker_name1"], "queue_name", 1, 2, prefetch: 4, prefetch_owner: 'work_queue:X', forced_latency: 6.0]
82
- job2 = Delayed::Job.new(:tag => 'tag')
83
- job2.create_and_lock!('work_queue:X')
84
- job3 = Delayed::Job.new(:tag => 'tag')
85
- job3.create_and_lock!('work_queue:X')
86
- jobs = { 'worker_name1' => job, 'work_queue:X' => [job2, job3]}
80
+ allow(subject).to receive(:prefetch_owner).and_return("work_queue:X")
81
+ job_args = [["worker_name1"], "queue_name", 1, 2,
82
+ { prefetch: 4, prefetch_owner: "work_queue:X", forced_latency: 6.0 }]
83
+ job2 = Delayed::Job.new(tag: "tag")
84
+ job2.create_and_lock!("work_queue:X")
85
+ job3 = Delayed::Job.new(tag: "tag")
86
+ job3.create_and_lock!("work_queue:X")
87
+ jobs = { "worker_name1" => job, "work_queue:X" => [job2, job3] }
87
88
 
88
89
  expect(Delayed::Job).to receive(:get_and_lock_next_available).once.with(*job_args).and_return(jobs)
89
90
  Marshal.dump(["worker_name1", worker_config], client)
90
91
  subject.run_once
91
- expect(subject).to_not be_all_workers_idle
92
+ expect(subject).not_to be_all_workers_idle
92
93
  expect(Marshal.load(client)).to eq(job)
93
94
 
94
95
  Marshal.dump(["worker_name1", worker_config], client)
95
96
  subject.run_once
96
- expect(subject).to_not be_all_workers_idle
97
+ expect(subject).not_to be_all_workers_idle
97
98
  expect(Marshal.load(client)).to eq(job2)
98
99
  end
99
100
 
@@ -107,7 +108,10 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Server do
107
108
  expect(client).not_to be_ready
108
109
 
109
110
  # next time around, return the result
110
- expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return('worker_name' => job).ordered
111
+ expect(Delayed::Job).to receive(:get_and_lock_next_available)
112
+ .with(*job_args)
113
+ .and_return("worker_name" => job)
114
+ .ordered
111
115
  allow(Delayed::Settings).to receive(:sleep_delay).and_return(0)
112
116
  allow(Delayed::Settings).to receive(:sleep_delay_stagger).and_return(0)
113
117
  subject.run_once
@@ -115,7 +119,7 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Server do
115
119
  expect(Marshal.load(client)).to eq(job)
116
120
  end
117
121
 
118
- it 'drops the client on i/o error' do
122
+ it "drops the client on i/o error" do
119
123
  client = Socket.unix(subject.listen_socket.local_address.unix_path)
120
124
  subject.run_once
121
125
 
@@ -125,7 +129,7 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Server do
125
129
  expect { subject.run_once }.to change(subject, :connected_clients).by(-1)
126
130
  end
127
131
 
128
- it 'drops the client when the client disconnects' do
132
+ it "drops the client when the client disconnects" do
129
133
  client = Socket.unix(subject.listen_socket.local_address.unix_path)
130
134
  subject.run_once
131
135
 
@@ -138,7 +142,7 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Server do
138
142
  expect(subject.instance_variable_get(:@waiting_clients).first.last).to eq []
139
143
  end
140
144
 
141
- it 'drops the client when a write fails' do
145
+ it "drops the client when a write fails" do
142
146
  client = Socket.unix(subject.listen_socket.local_address.unix_path)
143
147
  subject.run_once
144
148
 
@@ -151,7 +155,7 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Server do
151
155
  # don't let the server see the close and process it there; we want to check a failure later
152
156
  expect(subject).to receive(:handle_request).with(server_client_socket)
153
157
 
154
- expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return('worker_name' => job)
158
+ expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return("worker_name" => job)
155
159
  # the job gets unlocked
156
160
  expect(Delayed::Job).to receive(:unlock).with([job])
157
161
  subject.run_once
@@ -161,14 +165,14 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Server do
161
165
  expect(subject.instance_variable_get(:@waiting_clients).first.last).to eq []
162
166
  end
163
167
 
164
- it 'tracks when clients are idle' do
168
+ it "tracks when clients are idle" do
165
169
  expect(subject.all_workers_idle?).to be(true)
166
170
 
167
171
  client = Socket.unix(subject.listen_socket.local_address.unix_path)
168
172
  subject.run_once
169
173
  expect(subject.all_workers_idle?).to be(true)
170
174
 
171
- expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return('worker_name' => job)
175
+ expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return("worker_name" => job)
172
176
  Marshal.dump(args, client)
173
177
  subject.run_once
174
178
  expect(subject.all_workers_idle?).to be(false)
@@ -179,7 +183,7 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Server do
179
183
  expect(subject.all_workers_idle?).to be(true)
180
184
  end
181
185
 
182
- it 'triggers the lifecycle event around the pop' do
186
+ it "triggers the lifecycle event around the pop" do
183
187
  called = false
184
188
  client = Socket.unix(subject.listen_socket.local_address.unix_path)
185
189
  subject.run_once
@@ -187,7 +191,7 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Server do
187
191
  Delayed::Worker.lifecycle.around(:work_queue_pop) do |queue, &cb|
188
192
  expect(subject.all_workers_idle?).to be(true)
189
193
  expect(queue).to eq(subject)
190
- expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return('worker_name' => job)
194
+ expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return("worker_name" => job)
191
195
  called = true
192
196
  res = cb.call(queue)
193
197
  expect(subject.all_workers_idle?).to be(false)
@@ -201,4 +205,3 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Server do
201
205
  expect(called).to eq(true)
202
206
  end
203
207
  end
204
-
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
4
- require 'fileutils'
3
+ require "spec_helper"
4
+ require "fileutils"
5
5
 
6
6
  RSpec.describe Delayed::WorkQueue::ParentProcess do
7
7
  before :all do
8
- FileUtils.mkdir_p(Delayed::Settings.expand_rails_path('tmp'))
8
+ FileUtils.mkdir_p(Delayed::Settings.expand_rails_path("tmp"))
9
9
  Delayed.select_backend(Delayed::Backend::ActiveRecord::Job)
10
10
  Delayed::Settings.parent_process = {
11
- 'server_address' => '/tmp/inst-jobs-test.sock'
11
+ "server_address" => "/tmp/inst-jobs-test.sock"
12
12
  }
13
13
  end
14
14
 
@@ -16,43 +16,43 @@ RSpec.describe Delayed::WorkQueue::ParentProcess do
16
16
  Delayed::Settings.parent_process = {}
17
17
  end
18
18
 
19
- after :each do
20
- File.unlink('/tmp/inst-jobs-test.sock') if File.exist?('/tmp/inst-jobs-test.sock')
19
+ after do
20
+ File.unlink("/tmp/inst-jobs-test.sock") if File.exist?("/tmp/inst-jobs-test.sock")
21
21
  Delayed::Worker.lifecycle.reset!
22
22
  end
23
23
 
24
24
  let(:subject) { described_class.new }
25
25
 
26
- describe '#initalize(config = Settings.parent_process)' do
27
- it 'must expand a relative path to be within the Rails root' do
28
- queue = described_class.new('server_address' => 'tmp/foo.sock')
29
- expect(queue.server_address).to eq Delayed::Settings.expand_rails_path('tmp/foo.sock')
26
+ describe "#initalize(config = Settings.parent_process)" do
27
+ it "must expand a relative path to be within the Rails root" do
28
+ queue = described_class.new("server_address" => "tmp/foo.sock")
29
+ expect(queue.server_address).to eq Delayed::Settings.expand_rails_path("tmp/foo.sock")
30
30
  end
31
31
 
32
- it 'must add a file name when a relative path to a directory is supplied' do
33
- queue = described_class.new('server_address' => 'tmp')
34
- expect(queue.server_address).to eq Delayed::Settings.expand_rails_path('tmp/inst-jobs.sock')
32
+ it "must add a file name when a relative path to a directory is supplied" do
33
+ queue = described_class.new("server_address" => "tmp")
34
+ expect(queue.server_address).to eq Delayed::Settings.expand_rails_path("tmp/inst-jobs.sock")
35
35
  end
36
36
 
37
- it 'must capture a full absolute path' do
38
- queue = described_class.new('server_address' => '/tmp/foo.sock')
39
- expect(queue.server_address).to eq '/tmp/foo.sock'
37
+ it "must capture a full absolute path" do
38
+ queue = described_class.new("server_address" => "/tmp/foo.sock")
39
+ expect(queue.server_address).to eq "/tmp/foo.sock"
40
40
  end
41
41
 
42
- it 'must add a file name when an absolute path to a directory is supplied' do
43
- queue = described_class.new('server_address' => '/tmp')
44
- expect(queue.server_address).to eq '/tmp/inst-jobs.sock'
42
+ it "must add a file name when an absolute path to a directory is supplied" do
43
+ queue = described_class.new("server_address" => "/tmp")
44
+ expect(queue.server_address).to eq "/tmp/inst-jobs.sock"
45
45
  end
46
46
  end
47
47
 
48
- it 'generates a server listening on a valid unix socket' do
48
+ it "generates a server listening on a valid unix socket" do
49
49
  server = subject.server
50
50
  expect(server).to be_a(Delayed::WorkQueue::ParentProcess::Server)
51
51
  expect(server.listen_socket.local_address.unix?).to be(true)
52
52
  expect { server.listen_socket.accept_nonblock }.to raise_error(IO::WaitReadable)
53
53
  end
54
54
 
55
- it 'generates a client connected to the server unix socket' do
55
+ it "generates a client connected to the server unix socket" do
56
56
  server = subject.server
57
57
  client = subject.client
58
58
  expect(client).to be_a(Delayed::WorkQueue::ParentProcess::Client)