Skip to content

Commit be7ffa2

Browse files
abcangGargron
authored andcommitted
Do not execute the job with the same arguments as the retry job (mastodon#4814)
1 parent e821c00 commit be7ffa2

File tree

4 files changed

+25
-1
lines changed

4 files changed

+25
-1
lines changed

app/workers/pubsubhubbub/subscribe_worker.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
class Pubsubhubbub::SubscribeWorker
44
include Sidekiq::Worker
55

6-
sidekiq_options queue: 'push', retry: 10, unique: :until_executed, dead: false
6+
sidekiq_options queue: 'push', retry: 10, unique: :until_executed, dead: false, unique_retry: true
77

88
sidekiq_retry_in do |count|
99
case count

config/application.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
require_relative '../lib/paperclip/gif_transcoder'
1111
require_relative '../lib/paperclip/video_transcoder'
1212
require_relative '../lib/mastodon/version'
13+
require_relative '../lib/mastodon/unique_retry_job_middleware'
1314

1415
Dotenv::Railtie.load
1516

config/initializers/sidekiq.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,7 @@
1313

1414
Sidekiq.configure_client do |config|
1515
config.redis = redis_params
16+
config.client_middleware do |chain|
17+
chain.add Mastodon::UniqueRetryJobMiddleware
18+
end
1619
end
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# frozen_string_literal: true
2+
3+
class Mastodon::UniqueRetryJobMiddleware
4+
def call(_worker_class, item, _queue, _redis_pool)
5+
return if item['unique_retry'] && retried?(item)
6+
yield
7+
end
8+
9+
private
10+
11+
def retried?(item)
12+
# Use unique digest key of SidekiqUniqueJobs
13+
unique_key = SidekiqUniqueJobs::UNIQUE_DIGEST_KEY
14+
unique_digest = item[unique_key]
15+
class_name = item['class']
16+
retries = Sidekiq::RetrySet.new
17+
18+
retries.any? { |job| job.item['class'] == class_name && job.item[unique_key] == unique_digest }
19+
end
20+
end

0 commit comments

Comments
 (0)