inst-jobs 2.0.0 → 3.1.0
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/db/migrate/20101216224513_create_delayed_jobs.rb +9 -7
- data/db/migrate/20110531144916_cleanup_delayed_jobs_indexes.rb +8 -13
- data/db/migrate/20110610213249_optimize_delayed_jobs.rb +8 -8
- data/db/migrate/20110831210257_add_delayed_jobs_next_in_strand.rb +25 -25
- data/db/migrate/20120510004759_delayed_jobs_delete_trigger_lock_for_update.rb +4 -8
- data/db/migrate/20120531150712_drop_psql_jobs_pop_fn.rb +1 -3
- data/db/migrate/20120607164022_delayed_jobs_use_advisory_locks.rb +11 -15
- data/db/migrate/20120607181141_index_jobs_on_locked_by.rb +1 -1
- data/db/migrate/20120608191051_add_jobs_run_at_index.rb +2 -2
- data/db/migrate/20120927184213_change_delayed_jobs_handler_to_text.rb +1 -1
- data/db/migrate/20140505215510_copy_failed_jobs_original_id.rb +2 -3
- data/db/migrate/20150807133223_add_max_concurrent_to_jobs.rb +9 -13
- data/db/migrate/20151210162949_improve_max_concurrent.rb +4 -8
- data/db/migrate/20161206323555_add_back_default_string_limits_jobs.rb +3 -2
- data/db/migrate/20181217155351_speed_up_max_concurrent_triggers.rb +13 -17
- data/db/migrate/20200330230722_add_id_to_get_delayed_jobs_index.rb +8 -8
- data/db/migrate/20200824222232_speed_up_max_concurrent_delete_trigger.rb +72 -77
- data/db/migrate/20200825011002_add_strand_order_override.rb +93 -97
- data/db/migrate/20210809145804_add_n_strand_index.rb +12 -0
- data/db/migrate/20210812210128_add_singleton_column.rb +200 -0
- data/db/migrate/20210917232626_add_delete_conflicting_singletons_before_unlock_trigger.rb +27 -0
- data/db/migrate/20210928174754_fix_singleton_condition_in_before_insert.rb +56 -0
- data/db/migrate/20210929204903_update_conflicting_singleton_function_to_use_index.rb +27 -0
- data/db/migrate/20211101190934_update_after_delete_trigger_for_singleton_index.rb +137 -0
- data/db/migrate/20211207094200_update_after_delete_trigger_for_singleton_transition_cases.rb +171 -0
- data/db/migrate/20211220112800_fix_singleton_race_condition_insert.rb +59 -0
- data/db/migrate/20211220113000_fix_singleton_race_condition_delete.rb +207 -0
- data/db/migrate/20220127091200_fix_singleton_unique_constraint.rb +31 -0
- data/db/migrate/20220128084800_update_insert_trigger_for_singleton_unique_constraint_change.rb +60 -0
- data/db/migrate/20220128084900_update_delete_trigger_for_singleton_unique_constraint_change.rb +209 -0
- data/db/migrate/20220203063200_remove_old_singleton_index.rb +31 -0
- data/db/migrate/20220328152900_add_failed_jobs_indicies.rb +12 -0
- data/exe/inst_jobs +3 -2
- data/lib/delayed/backend/active_record.rb +226 -168
- data/lib/delayed/backend/base.rb +119 -72
- data/lib/delayed/batch.rb +11 -9
- data/lib/delayed/cli.rb +98 -84
- data/lib/delayed/core_ext/kernel.rb +4 -2
- data/lib/delayed/daemon.rb +70 -74
- data/lib/delayed/job_tracking.rb +26 -25
- data/lib/delayed/lifecycle.rb +28 -23
- data/lib/delayed/log_tailer.rb +17 -17
- data/lib/delayed/logging.rb +13 -16
- data/lib/delayed/message_sending.rb +43 -52
- data/lib/delayed/performable_method.rb +6 -8
- data/lib/delayed/periodic.rb +72 -68
- data/lib/delayed/plugin.rb +2 -4
- data/lib/delayed/pool.rb +205 -168
- data/lib/delayed/rails_reloader_plugin.rb +30 -0
- data/lib/delayed/server/helpers.rb +6 -6
- data/lib/delayed/server.rb +51 -54
- data/lib/delayed/settings.rb +96 -81
- data/lib/delayed/testing.rb +21 -22
- data/lib/delayed/version.rb +1 -1
- data/lib/delayed/work_queue/in_process.rb +21 -17
- data/lib/delayed/work_queue/parent_process/client.rb +55 -53
- data/lib/delayed/work_queue/parent_process/server.rb +245 -207
- data/lib/delayed/work_queue/parent_process.rb +52 -53
- data/lib/delayed/worker/consul_health_check.rb +32 -33
- data/lib/delayed/worker/health_check.rb +35 -27
- data/lib/delayed/worker/null_health_check.rb +3 -1
- data/lib/delayed/worker/process_helper.rb +11 -12
- data/lib/delayed/worker.rb +257 -244
- data/lib/delayed/yaml_extensions.rb +12 -10
- data/lib/delayed_job.rb +37 -37
- data/lib/inst-jobs.rb +1 -1
- data/spec/active_record_job_spec.rb +152 -139
- data/spec/delayed/cli_spec.rb +7 -7
- data/spec/delayed/daemon_spec.rb +10 -9
- data/spec/delayed/message_sending_spec.rb +16 -9
- data/spec/delayed/periodic_spec.rb +14 -21
- data/spec/delayed/server_spec.rb +38 -38
- data/spec/delayed/settings_spec.rb +26 -25
- data/spec/delayed/work_queue/in_process_spec.rb +8 -9
- data/spec/delayed/work_queue/parent_process/client_spec.rb +17 -12
- data/spec/delayed/work_queue/parent_process/server_spec.rb +118 -42
- data/spec/delayed/work_queue/parent_process_spec.rb +21 -23
- data/spec/delayed/worker/consul_health_check_spec.rb +37 -50
- data/spec/delayed/worker/health_check_spec.rb +60 -52
- data/spec/delayed/worker_spec.rb +53 -24
- data/spec/sample_jobs.rb +45 -15
- data/spec/shared/delayed_batch.rb +74 -67
- data/spec/shared/delayed_method.rb +143 -102
- data/spec/shared/performable_method.rb +39 -38
- data/spec/shared/shared_backend.rb +801 -440
- data/spec/shared/testing.rb +14 -14
- data/spec/shared/worker.rb +157 -149
- data/spec/shared_jobs_specs.rb +13 -13
- data/spec/spec_helper.rb +57 -56
- metadata +183 -103
- data/lib/delayed/backend/redis/bulk_update.lua +0 -50
- data/lib/delayed/backend/redis/destroy_job.lua +0 -2
- data/lib/delayed/backend/redis/enqueue.lua +0 -29
- data/lib/delayed/backend/redis/fail_job.lua +0 -5
- data/lib/delayed/backend/redis/find_available.lua +0 -3
- data/lib/delayed/backend/redis/functions.rb +0 -59
- data/lib/delayed/backend/redis/get_and_lock_next_available.lua +0 -17
- data/lib/delayed/backend/redis/includes/jobs_common.lua +0 -203
- data/lib/delayed/backend/redis/job.rb +0 -535
- data/lib/delayed/backend/redis/set_running.lua +0 -5
- data/lib/delayed/backend/redis/tickle_strand.lua +0 -2
- data/spec/gemfiles/42.gemfile +0 -7
- data/spec/gemfiles/50.gemfile +0 -7
- data/spec/gemfiles/51.gemfile +0 -7
- data/spec/gemfiles/52.gemfile +0 -7
- data/spec/gemfiles/60.gemfile +0 -7
- data/spec/redis_job_spec.rb +0 -148
| @@ -1,15 +1,16 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
            require  | 
| 4 | 
            -
            require  | 
| 3 | 
            +
            require "spec_helper"
         | 
| 4 | 
            +
            require "debug_inspector"
         | 
| 5 5 |  | 
| 6 6 | 
             
            RSpec.describe Delayed::MessageSending do
         | 
| 7 7 | 
             
              before do
         | 
| 8 8 | 
             
                allow(::Rails.env).to receive(:test?).and_return(true)
         | 
| 9 9 | 
             
              end
         | 
| 10 10 |  | 
| 11 | 
            -
              before | 
| 12 | 
            -
                 | 
| 11 | 
            +
              before(:all) do
         | 
| 12 | 
            +
                # this has to be a "real" constant
         | 
| 13 | 
            +
                class SpecClass # rubocop:disable RSpec/LeakyConstantDeclaration, Lint/ConstantDefinitionInBlock
         | 
| 13 14 | 
             
                  def call_private(**enqueue_args)
         | 
| 14 15 | 
             
                    delay(**enqueue_args).private_method
         | 
| 15 16 | 
             
                  end
         | 
| @@ -19,15 +20,17 @@ RSpec.describe Delayed::MessageSending do | |
| 19 20 | 
             
                    other.delay(**enqueue_args).protected_method
         | 
| 20 21 | 
             
                  end
         | 
| 21 22 |  | 
| 23 | 
            +
                  def call_public(**_kwargs)
         | 
| 24 | 
            +
                    42
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
             | 
| 22 27 | 
             
                  private
         | 
| 23 28 |  | 
| 24 | 
            -
                  def private_method
         | 
| 25 | 
            -
                  end
         | 
| 29 | 
            +
                  def private_method; end
         | 
| 26 30 |  | 
| 27 31 | 
             
                  protected
         | 
| 28 32 |  | 
| 29 | 
            -
                  def protected_method
         | 
| 30 | 
            -
                  end
         | 
| 33 | 
            +
                  def protected_method; end
         | 
| 31 34 | 
             
                end
         | 
| 32 35 | 
             
              end
         | 
| 33 36 |  | 
| @@ -75,6 +78,10 @@ RSpec.describe Delayed::MessageSending do | |
| 75 78 | 
             
                klass.new.call_protected(synchronous: true)
         | 
| 76 79 | 
             
              end
         | 
| 77 80 |  | 
| 81 | 
            +
              it "directly calls a public method on an object with kwargs" do
         | 
| 82 | 
            +
                expect(klass.new.delay(synchronous: true).call_public(kwarg: 10)).to eq 42
         | 
| 83 | 
            +
              end
         | 
| 84 | 
            +
             | 
| 78 85 | 
             
              it "warns about directly sending a protected message asynchronously" do
         | 
| 79 86 | 
             
                expect { klass.new.delay.protected_method }.to raise_error(NoMethodError)
         | 
| 80 87 | 
             
              end
         | 
| @@ -89,7 +96,7 @@ RSpec.describe Delayed::MessageSending do | |
| 89 96 | 
             
                    Kernel.delay.sleep(1)
         | 
| 90 97 | 
             
                  end
         | 
| 91 98 |  | 
| 92 | 
            -
                  def encode_with( | 
| 99 | 
            +
                  def encode_with(_encoder)
         | 
| 93 100 | 
             
                    raise "yaml encoding failed"
         | 
| 94 101 | 
             
                  end
         | 
| 95 102 | 
             
                end
         | 
| @@ -1,39 +1,32 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
            require  | 
| 3 | 
            +
            require "spec_helper"
         | 
| 4 4 |  | 
| 5 5 | 
             
            RSpec.describe Delayed::Periodic do
         | 
| 6 | 
            -
              around | 
| 6 | 
            +
              around do |block|
         | 
| 7 7 | 
             
                # make sure we can use ".cron" and
         | 
| 8 8 | 
             
                # such safely without leaking global state
         | 
| 9 | 
            -
                prev_sched =  | 
| 10 | 
            -
                prev_ovr =  | 
| 11 | 
            -
                 | 
| 12 | 
            -
                 | 
| 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 | 
            -
                 | 
| 16 | 
            -
                 | 
| 15 | 
            +
                described_class.scheduled = prev_sched
         | 
| 16 | 
            +
                described_class.overrides = prev_ovr
         | 
| 17 | 
            +
                Delayed::Job.delete_all
         | 
| 17 18 | 
             
              end
         | 
| 18 19 |  | 
| 19 20 | 
             
              describe ".cron" do
         | 
| 20 | 
            -
                let(:job_name){  | 
| 21 | 
            +
                let(:job_name) { "just a test" }
         | 
| 22 | 
            +
             | 
| 21 23 | 
             
                it "provides a tag by default for periodic jobs" do
         | 
| 22 | 
            -
                   | 
| 24 | 
            +
                  described_class.cron job_name, "*/10 * * * *" do
         | 
| 23 25 | 
             
                    # no-op
         | 
| 24 26 | 
             
                  end
         | 
| 25 | 
            -
                  instance =  | 
| 26 | 
            -
                  expect(instance). | 
| 27 | 
            +
                  instance = described_class.scheduled[job_name]
         | 
| 28 | 
            +
                  expect(instance).not_to be_nil
         | 
| 27 29 | 
             
                  expect(instance.enqueue_args[:singleton]).to eq("periodic: just a test")
         | 
| 28 30 | 
             
                end
         | 
| 29 | 
            -
             | 
| 30 | 
            -
                it "uses no singleton if told to skip" do
         | 
| 31 | 
            -
                  Delayed::Periodic.cron job_name, '*/10 * * * *', {singleton: false} do
         | 
| 32 | 
            -
                    # no-op
         | 
| 33 | 
            -
                  end
         | 
| 34 | 
            -
                  instance = Delayed::Periodic.scheduled[job_name]
         | 
| 35 | 
            -
                  expect(instance).to_not be_nil
         | 
| 36 | 
            -
                  expect(instance.enqueue_args[:singleton]).to be_nil
         | 
| 37 | 
            -
                end
         | 
| 38 31 | 
             
              end
         | 
| 39 32 | 
             
            end
         | 
    
        data/spec/delayed/server_spec.rb
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
            require  | 
| 4 | 
            -
            require  | 
| 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 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 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  | 
| 32 | 
            +
                  get "/running"
         | 
| 33 33 | 
             
                end
         | 
| 34 34 |  | 
| 35 | 
            -
                it  | 
| 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[ | 
| 38 | 
            -
                  expect(parsed_body[ | 
| 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!(: | 
| 44 | 
            -
                let!(: | 
| 45 | 
            -
                let!(: | 
| 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  | 
| 47 | 
            +
                context "with the flavor param set to id" do
         | 
| 48 48 | 
             
                  before do
         | 
| 49 | 
            -
                    get "/jobs?flavor=id&search_term=#{ | 
| 49 | 
            +
                    get "/jobs?flavor=id&search_term=#{job2.id}"
         | 
| 50 50 | 
             
                  end
         | 
| 51 51 |  | 
| 52 | 
            -
                  it  | 
| 53 | 
            -
                    jobs = parsed_body[ | 
| 54 | 
            -
                    job_ids = jobs.map{ |j| j[ | 
| 55 | 
            -
                    expect(job_ids).to eq [ | 
| 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  | 
| 59 | 
            -
                    expect(parsed_body[ | 
| 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!(: | 
| 66 | 
            -
                let!(: | 
| 67 | 
            -
                let!(: | 
| 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  | 
| 69 | 
            +
                context "with update enabled" do
         | 
| 70 70 | 
             
                  before do
         | 
| 71 71 | 
             
                    @update = true
         | 
| 72 | 
            -
                    post "/bulk_update",  | 
| 72 | 
            +
                    post "/bulk_update", JSON.generate(action: "destroy", ids: [job1.id])
         | 
| 73 73 | 
             
                  end
         | 
| 74 74 |  | 
| 75 | 
            -
                  it  | 
| 76 | 
            -
                    expect{ Delayed::Job.find( | 
| 77 | 
            -
                    expect(Delayed::Job.find( | 
| 78 | 
            -
                    expect(Delayed::Job.find( | 
| 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  | 
| 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  | 
| 86 | 
            +
                context "with update disabled" do
         | 
| 87 87 | 
             
                  before do
         | 
| 88 88 | 
             
                    @update = false
         | 
| 89 | 
            -
                    post "/bulk_update",  | 
| 89 | 
            +
                    post "/bulk_update", JSON.generate(action: "destroy", ids: [job1.id])
         | 
| 90 90 | 
             
                  end
         | 
| 91 91 |  | 
| 92 | 
            -
                  it  | 
| 93 | 
            -
                    expect(Delayed::Job.find( | 
| 94 | 
            -
                    expect(Delayed::Job.find( | 
| 95 | 
            -
                    expect(Delayed::Job.find( | 
| 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  | 
| 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  | 
| 3 | 
            +
            require "spec_helper"
         | 
| 4 4 |  | 
| 5 5 | 
             
            RSpec.describe Delayed::Settings do
         | 
| 6 | 
            -
              let(:configfile)  | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 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  | 
| 18 | 
            -
                it  | 
| 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 | 
            -
             | 
| 23 | 
            -
             | 
| 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  | 
| 29 | 
            -
                it  | 
| 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!( | 
| 32 | 
            +
                  described_class.apply_worker_config!("last_ditch_logfile" => true)
         | 
| 32 33 | 
             
                end
         | 
| 33 34 |  | 
| 34 | 
            -
                it  | 
| 35 | 
            -
                  described_class.apply_worker_config!( | 
| 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( | 
| 38 | 
            +
                  expect(described_class.parent_process).to include("foo" => "bar")
         | 
| 38 39 | 
             
                end
         | 
| 39 40 | 
             
              end
         | 
| 40 41 |  | 
| 41 | 
            -
              describe  | 
| 42 | 
            -
                it  | 
| 43 | 
            -
                   | 
| 44 | 
            -
                  expect( | 
| 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,32 +1,31 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
            require  | 
| 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  | 
| 10 | 
            +
              after do
         | 
| 11 11 | 
             
                Delayed::Worker.lifecycle.reset!
         | 
| 12 12 | 
             
              end
         | 
| 13 13 |  | 
| 14 | 
            -
              let(: | 
| 15 | 
            -
              let(:worker_config) { {queue: "test", min_priority: 1, max_priority: 2} }
         | 
| 14 | 
            +
              let(:worker_config) { { queue: "test", min_priority: 1, max_priority: 2 } }
         | 
| 16 15 | 
             
              let(:args) { ["worker_name", worker_config] }
         | 
| 17 16 |  | 
| 18 | 
            -
              it  | 
| 17 | 
            +
              it "triggers the lifecycle event around the pop" do
         | 
| 19 18 | 
             
                called = false
         | 
| 20 19 | 
             
                Delayed::Worker.lifecycle.around(:work_queue_pop) do |queue, &cb|
         | 
| 21 20 | 
             
                  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)
         | 
| 21 | 
            +
                  expect(Delayed::Job).to receive(:get_and_lock_next_available)
         | 
| 22 | 
            +
                    .with("worker_name", "test", 1, 2)
         | 
| 23 | 
            +
                    .and_return(:job)
         | 
| 25 24 | 
             
                  called = true
         | 
| 26 25 | 
             
                  cb.call(queue)
         | 
| 27 26 | 
             
                end
         | 
| 28 27 | 
             
                job = subject.get_and_lock_next_available(*args)
         | 
| 29 28 | 
             
                expect(job).to eq(:job)
         | 
| 30 | 
            -
                expect(called).to  | 
| 29 | 
            +
                expect(called).to be(true)
         | 
| 31 30 | 
             
              end
         | 
| 32 31 | 
             
            end
         | 
| @@ -1,22 +1,23 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
            require  | 
| 3 | 
            +
            require "spec_helper"
         | 
| 4 4 |  | 
| 5 5 | 
             
            RSpec.describe Delayed::WorkQueue::ParentProcess::Client do
         | 
| 6 | 
            -
               | 
| 7 | 
            -
             | 
| 8 | 
            -
              let(: | 
| 6 | 
            +
              subject { described_class.new(addrinfo).tap(&:init) }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              let(:addrinfo) { double("Addrinfo") }
         | 
| 9 | 
            +
              let(:connection) { double("Socket") }
         | 
| 9 10 | 
             
              let(:job) { Delayed::Job.new(locked_by: "worker_name") }
         | 
| 10 11 | 
             
              let(:worker_config) { { queue: "queue_name", min_priority: 1, max_priority: 2 } }
         | 
| 11 12 | 
             
              let(:args) { ["worker_name", worker_config] }
         | 
| 12 13 | 
             
              let(:job_args) { [["worker_name"], "queue_name", 1, 2] }
         | 
| 13 14 |  | 
| 14 15 | 
             
              before :all do
         | 
| 15 | 
            -
                FileUtils.mkdir_p(Delayed::Settings.expand_rails_path( | 
| 16 | 
            +
                FileUtils.mkdir_p(Delayed::Settings.expand_rails_path("tmp"))
         | 
| 16 17 | 
             
                Delayed.select_backend(Delayed::Backend::ActiveRecord::Job)
         | 
| 17 18 | 
             
              end
         | 
| 18 19 |  | 
| 19 | 
            -
              it  | 
| 20 | 
            +
              it "marshals the given arguments to the server and returns the response" do
         | 
| 20 21 | 
             
                expect(addrinfo).to receive(:connect).once.and_return(connection)
         | 
| 21 22 | 
             
                expect(connection).to receive(:eof?).and_return(false)
         | 
| 22 23 | 
             
                expect(IO).to receive(:select).and_return([[connection], nil, nil])
         | 
| @@ -26,7 +27,7 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Client do | |
| 26 27 | 
             
                expect(response).to eq(job)
         | 
| 27 28 | 
             
              end
         | 
| 28 29 |  | 
| 29 | 
            -
              it  | 
| 30 | 
            +
              it "returns nil and then reconnects on socket write error" do
         | 
| 30 31 | 
             
                expect(addrinfo).to receive(:connect).once.and_return(connection)
         | 
| 31 32 | 
             
                expect(Marshal).to receive(:dump).and_raise(SystemCallError.new("failure"))
         | 
| 32 33 | 
             
                expect(IO).to receive(:select).and_return([[connection], nil, nil])
         | 
| @@ -42,7 +43,7 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Client do | |
| 42 43 | 
             
                expect(response).to eq(job)
         | 
| 43 44 | 
             
              end
         | 
| 44 45 |  | 
| 45 | 
            -
              it  | 
| 46 | 
            +
              it "returns nil and then reconnects when the socket indicates eof" do
         | 
| 46 47 | 
             
                expect(addrinfo).to receive(:connect).once.and_return(connection)
         | 
| 47 48 | 
             
                expect(connection).to receive(:eof?).and_return(true)
         | 
| 48 49 | 
             
                expect(Marshal).to receive(:dump).with(args, connection).ordered
         | 
| @@ -59,17 +60,19 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Client do | |
| 59 60 | 
             
                expect(response).to eq(job)
         | 
| 60 61 | 
             
              end
         | 
| 61 62 |  | 
| 62 | 
            -
              it  | 
| 63 | 
            +
              it "errors if the response is not a locked job" do
         | 
| 63 64 | 
             
                expect(addrinfo).to receive(:connect).once.and_return(connection)
         | 
| 64 65 | 
             
                expect(Marshal).to receive(:dump).with(args, connection)
         | 
| 65 66 | 
             
                expect(IO).to receive(:select).and_return([[connection], nil, nil])
         | 
| 66 67 | 
             
                expect(Marshal).to receive(:load).with(connection).and_return(:not_a_job)
         | 
| 67 68 | 
             
                expect(connection).to receive(:eof?).and_return(false)
         | 
| 68 69 |  | 
| 69 | 
            -
                expect  | 
| 70 | 
            +
                expect do
         | 
| 71 | 
            +
                  subject.get_and_lock_next_available(*args)
         | 
| 72 | 
            +
                end.to raise_error(Delayed::WorkQueue::ParentProcess::ProtocolError)
         | 
| 70 73 | 
             
              end
         | 
| 71 74 |  | 
| 72 | 
            -
              it  | 
| 75 | 
            +
              it "errors if the response is a job not locked by this worker" do
         | 
| 73 76 | 
             
                expect(addrinfo).to receive(:connect).once.and_return(connection)
         | 
| 74 77 | 
             
                expect(Marshal).to receive(:dump).with(args, connection)
         | 
| 75 78 | 
             
                job.locked_by = "somebody_else"
         | 
| @@ -77,6 +80,8 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Client do | |
| 77 80 | 
             
                expect(Marshal).to receive(:load).with(connection).and_return(job)
         | 
| 78 81 | 
             
                expect(connection).to receive(:eof?).and_return(false)
         | 
| 79 82 |  | 
| 80 | 
            -
                expect  | 
| 83 | 
            +
                expect do
         | 
| 84 | 
            +
                  subject.get_and_lock_next_available(*args)
         | 
| 85 | 
            +
                end.to raise_error(Delayed::WorkQueue::ParentProcess::ProtocolError)
         | 
| 81 86 | 
             
              end
         | 
| 82 87 | 
             
            end
         |