From 2380cf01305e21d51673dcba6da84a89a4537024 Mon Sep 17 00:00:00 2001 From: Mikhail Nelaev Date: Fri, 24 Nov 2023 17:27:39 +0500 Subject: [PATCH] fix: unlock unique jobs without args https://jira.railsc.ru/browse/GOODS-2302 --- Gemfile | 1 + lib/resque/integration/unique.rb | 2 +- spec/resque/integration/unique_spec.rb | 36 +++++++++++++++++++++++--- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 8d30114..40a6721 100644 --- a/Gemfile +++ b/Gemfile @@ -3,4 +3,5 @@ source 'https://rubygems.org' # Specify your gem's dependencies in resque-integration.gemspec gemspec +gem 'loofah', '< 2.20.0', require: false gem 'pry', '< 0.13.0', require: false diff --git a/lib/resque/integration/unique.rb b/lib/resque/integration/unique.rb index baa1cf3..b37bca1 100644 --- a/lib/resque/integration/unique.rb +++ b/lib/resque/integration/unique.rb @@ -144,7 +144,7 @@ def around_perform_lock(_meta_id, *args) # When job is dequeued we should remove lock def after_dequeue_lock(_meta_id, *args) - unlock(*args) unless args.empty? + unlock(*args) end # Fail metadata if dequeue succeed diff --git a/spec/resque/integration/unique_spec.rb b/spec/resque/integration/unique_spec.rb index 2ae89ad..07d007d 100644 --- a/spec/resque/integration/unique_spec.rb +++ b/spec/resque/integration/unique_spec.rb @@ -88,7 +88,7 @@ class JobDequeueTest @queue = :queue2 - def self.execute(x) + def self.execute(*params) sleep 0.1 end end @@ -105,14 +105,24 @@ def self.execute(x) meta.should be_failed end + it 'dequeues and unlocks job without args if job is not in work now' do + JobDequeueTest.enqueue + JobDequeueTest.should be_enqueued + + JobDequeueTest.dequeue + JobDequeueTest.should_not be_enqueued + JobDequeueTest.should_not be_locked + + meta = JobDequeueTest.get_meta(JobDequeueTest.meta_id) + meta.should be_failed + end + it 'does not dequeue jobs in progress' do meta = JobDequeueTest.enqueue(1) job = Resque.reserve(:queue2) - worker = Thread.new { - job.perform - } + worker = Thread.new { job.perform } sleep 0.01 # give a worker some time to start meta.reload! @@ -124,6 +134,24 @@ def self.execute(x) worker.join end + + it 'does not dequeue jobs without args in progress' do + meta = JobDequeueTest.enqueue + + job = Resque.reserve(:queue2) + + worker = Thread.new { job.perform } + + sleep 0.01 # give a worker some time to start + meta.reload! + meta.should be_working + + JobDequeueTest.dequeue + JobDequeueTest.should be_locked + JobDequeueTest.should be_enqueued + + worker.join + end end describe Resque::Integration::Unique, '#on_failure_retry' do