talentbox-delayed_job_sequel 4.2.1 → 4.2.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 +4 -4
 - data/README.md +1 -0
 - data/lib/delayed/backend/sequel.rb +24 -1
 - data/spec/delayed/backend/sequel_spec.rb +17 -4
 - metadata +3 -3
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: b1852e994414af80378eb9b6dc43f5d0896f5efc
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 5dea3af8a408fdaae2999522b58c39b2be0d59a8
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 1d4ece1d72b8cd5325918caa63a71cb06e69ace258c8a1da3ac04a06ba93833fd6748ea156cbe7f944f600aa602afd19d00b1d527821950369ec004f3d010feb
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 728f1b030ff5a21aece61a2da07edb9ca1502301381f5c03465680c33f5fdd30ffdd354ac5b18d902ff02658c5d7a34b4cd17606460de343923d9ad63acb2f9d
         
     | 
    
        data/README.md
    CHANGED
    
    
| 
         @@ -44,14 +44,28 @@ module Delayed 
     | 
|
| 
       44 
44 
     | 
    
         
             
                      filter(:locked_by => worker_name).update(:locked_by => nil, :locked_at => nil)
         
     | 
| 
       45 
45 
     | 
    
         
             
                    end
         
     | 
| 
       46 
46 
     | 
    
         | 
| 
      
 47 
     | 
    
         
            +
                    # adapted from
         
     | 
| 
      
 48 
     | 
    
         
            +
                    # https://github.com/collectiveidea/delayed_job_active_record/blob/master/lib/delayed/backend/active_record.rb
         
     | 
| 
       47 
49 
     | 
    
         
             
                    def self.reserve(worker, max_run_time = Worker.max_run_time)
         
     | 
| 
       48 
50 
     | 
    
         
             
                      ds = ready_to_run(worker.name, max_run_time)
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
       49 
52 
     | 
    
         
             
                      ds = ds.filter(::Sequel.lit("priority >= ?", Worker.min_priority)) if Worker.min_priority
         
     | 
| 
       50 
53 
     | 
    
         
             
                      ds = ds.filter(::Sequel.lit("priority <= ?", Worker.max_priority)) if Worker.max_priority
         
     | 
| 
       51 
54 
     | 
    
         
             
                      ds = ds.filter(:queue => Worker.queues) if Worker.queues.any?
         
     | 
| 
       52 
55 
     | 
    
         
             
                      ds = ds.by_priority
         
     | 
| 
       53 
     | 
    
         
            -
                      ds = ds.for_update
         
     | 
| 
       54 
56 
     | 
    
         | 
| 
      
 57 
     | 
    
         
            +
                      case ::Sequel::Model.db.database_type
         
     | 
| 
      
 58 
     | 
    
         
            +
                      when :mysql
         
     | 
| 
      
 59 
     | 
    
         
            +
                        lock_with_read_ahead(ds, worker)
         
     | 
| 
      
 60 
     | 
    
         
            +
                      else
         
     | 
| 
      
 61 
     | 
    
         
            +
                        lock_with_for_update(ds, worker)
         
     | 
| 
      
 62 
     | 
    
         
            +
                      end
         
     | 
| 
      
 63 
     | 
    
         
            +
                    end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                    # Lock a single job using SELECT ... FOR UPDATE.
         
     | 
| 
      
 66 
     | 
    
         
            +
                    # More performant but may cause deadlocks in some databases.
         
     | 
| 
      
 67 
     | 
    
         
            +
                    def self.lock_with_for_update(ds, worker)
         
     | 
| 
      
 68 
     | 
    
         
            +
                      ds = ds.for_update
         
     | 
| 
       55 
69 
     | 
    
         
             
                      db.transaction do
         
     | 
| 
       56 
70 
     | 
    
         
             
                        if job = ds.first
         
     | 
| 
       57 
71 
     | 
    
         
             
                          job.locked_at = self.db_time_now
         
     | 
| 
         @@ -62,6 +76,15 @@ module Delayed 
     | 
|
| 
       62 
76 
     | 
    
         
             
                      end
         
     | 
| 
       63 
77 
     | 
    
         
             
                    end
         
     | 
| 
       64 
78 
     | 
    
         | 
| 
      
 79 
     | 
    
         
            +
                    # Fetch up-to `worker.read_ahead` jobs, try to lock one at a time.
         
     | 
| 
      
 80 
     | 
    
         
            +
                    # This query is more conservative as it does not acquire any DB read locks.
         
     | 
| 
      
 81 
     | 
    
         
            +
                    def self.lock_with_read_ahead(ds, worker)
         
     | 
| 
      
 82 
     | 
    
         
            +
                      ds.limit(worker.read_ahead).detect do |job|
         
     | 
| 
      
 83 
     | 
    
         
            +
                        count = ds.where(id: job.id).update(locked_at: self.db_time_now, locked_by: worker.name)
         
     | 
| 
      
 84 
     | 
    
         
            +
                        count == 1 && job.reload
         
     | 
| 
      
 85 
     | 
    
         
            +
                      end
         
     | 
| 
      
 86 
     | 
    
         
            +
                    end
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
       65 
88 
     | 
    
         
             
                    # Get the current time (GMT or local depending on DB)
         
     | 
| 
       66 
89 
     | 
    
         
             
                    # Note: This does not ping the DB to get the time, so all your clients
         
     | 
| 
       67 
90 
     | 
    
         
             
                    # must have syncronized clocks.
         
     | 
| 
         @@ -14,20 +14,33 @@ describe Delayed::Backend::Sequel::Job do 
     | 
|
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
              it "does not allow more than 1 worker to grab the same job" do
         
     | 
| 
       16 
16 
     | 
    
         
             
                expect do
         
     | 
| 
       17 
     | 
    
         
            -
                   
     | 
| 
      
 17 
     | 
    
         
            +
                  jobs_to_run = 200
         
     | 
| 
      
 18 
     | 
    
         
            +
                  workers_to_run = 20
         
     | 
| 
      
 19 
     | 
    
         
            +
                  jobs_per_worker = jobs_to_run/workers_to_run
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                  jobs_to_run.times do
         
     | 
| 
       18 
22 
     | 
    
         
             
                    described_class.create(payload_object: SimpleJob.new)
         
     | 
| 
       19 
23 
     | 
    
         
             
                  end
         
     | 
| 
       20 
24 
     | 
    
         | 
| 
       21 
     | 
    
         
            -
                   
     | 
| 
      
 25 
     | 
    
         
            +
                  workers_to_run.times.map do |i|
         
     | 
| 
       22 
26 
     | 
    
         
             
                    Thread.new do
         
     | 
| 
       23 
27 
     | 
    
         
             
                      worker = Delayed::Worker.new
         
     | 
| 
       24 
28 
     | 
    
         
             
                      worker.name = "worker_#{i}"
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                      # Ensure each worker performs the expected number of jobs as
         
     | 
| 
      
 31 
     | 
    
         
            +
                      # `work_off` will ocassionally perform less than the requested number
         
     | 
| 
      
 32 
     | 
    
         
            +
                      # if it is unable to lock a job within the `worker.read_ahead` limit
         
     | 
| 
      
 33 
     | 
    
         
            +
                      jobs_completed_by_this_worker = 0
         
     | 
| 
      
 34 
     | 
    
         
            +
                      while jobs_completed_by_this_worker < jobs_per_worker do
         
     | 
| 
      
 35 
     | 
    
         
            +
                        successes, failures = worker.work_off(jobs_per_worker - jobs_completed_by_this_worker)
         
     | 
| 
      
 36 
     | 
    
         
            +
                        expect(failures).to eq(0), "Expected zero failures, got #{failures}"
         
     | 
| 
      
 37 
     | 
    
         
            +
                        jobs_completed_by_this_worker += successes
         
     | 
| 
      
 38 
     | 
    
         
            +
                      end
         
     | 
| 
       26 
39 
     | 
    
         
             
                    end
         
     | 
| 
       27 
40 
     | 
    
         
             
                  end.map(&:join)
         
     | 
| 
       28 
41 
     | 
    
         
             
                end.not_to raise_error
         
     | 
| 
       29 
42 
     | 
    
         | 
| 
       30 
     | 
    
         
            -
                expect(Delayed::Job.count).to  
     | 
| 
      
 43 
     | 
    
         
            +
                expect(Delayed::Job.count).to eql 0
         
     | 
| 
       31 
44 
     | 
    
         
             
              end
         
     | 
| 
       32 
45 
     | 
    
         | 
| 
       33 
46 
     | 
    
         
             
              context ".count" do
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: talentbox-delayed_job_sequel
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 4.2. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 4.2.2
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Jonathan Tron
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2017- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2017-08-03 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: sequel
         
     | 
| 
         @@ -127,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       127 
127 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       128 
128 
     | 
    
         
             
            requirements: []
         
     | 
| 
       129 
129 
     | 
    
         
             
            rubyforge_project: 
         
     | 
| 
       130 
     | 
    
         
            -
            rubygems_version: 2.5. 
     | 
| 
      
 130 
     | 
    
         
            +
            rubygems_version: 2.5.2
         
     | 
| 
       131 
131 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       132 
132 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       133 
133 
     | 
    
         
             
            summary: Sequel backend for DelayedJob
         
     |