]> cat aescling's git repositories - mastodon.git/commitdiff
Do not execute the job with the same arguments as the retry job (#4814)
authorabcang <abcang1015@gmail.com>
Tue, 5 Sep 2017 18:56:20 +0000 (03:56 +0900)
committerEugen Rochko <eugen@zeonfederated.com>
Tue, 5 Sep 2017 18:56:20 +0000 (20:56 +0200)
app/workers/pubsubhubbub/subscribe_worker.rb
config/application.rb
config/initializers/sidekiq.rb
lib/mastodon/unique_retry_job_middleware.rb [new file with mode: 0644]

index 7560c2671f7c412f1eabc2da2b4dc5784765d26c..130c967e022215399c88a9ef38c8894f71ab33a3 100644 (file)
@@ -3,7 +3,7 @@
 class Pubsubhubbub::SubscribeWorker
   include Sidekiq::Worker
 
-  sidekiq_options queue: 'push', retry: 10, unique: :until_executed, dead: false
+  sidekiq_options queue: 'push', retry: 10, unique: :until_executed, dead: false, unique_retry: true
 
   sidekiq_retry_in do |count|
     case count
index b6ce7414775a407d4226eaeaa5c696c4f0b1b75b..f98f7af16764313555eeb3106b988b4d4fa2b644 100644 (file)
@@ -10,6 +10,7 @@ require_relative '../app/lib/exceptions'
 require_relative '../lib/paperclip/gif_transcoder'
 require_relative '../lib/paperclip/video_transcoder'
 require_relative '../lib/mastodon/version'
+require_relative '../lib/mastodon/unique_retry_job_middleware'
 
 Dotenv::Railtie.load
 
index b70784d79a7c36746bdaf10c3d567096f070b0cf..61e13133647a0f448575e012bfd5f27dd3c0ec8b 100644 (file)
@@ -13,4 +13,7 @@ end
 
 Sidekiq.configure_client do |config|
   config.redis = redis_params
+  config.client_middleware do |chain|
+    chain.add Mastodon::UniqueRetryJobMiddleware
+  end
 end
diff --git a/lib/mastodon/unique_retry_job_middleware.rb b/lib/mastodon/unique_retry_job_middleware.rb
new file mode 100644 (file)
index 0000000..75da8a0
--- /dev/null
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class Mastodon::UniqueRetryJobMiddleware
+  def call(_worker_class, item, _queue, _redis_pool)
+    return if item['unique_retry'] && retried?(item)
+    yield
+  end
+
+  private
+
+  def retried?(item)
+    # Use unique digest key of SidekiqUniqueJobs
+    unique_key = SidekiqUniqueJobs::UNIQUE_DIGEST_KEY
+    unique_digest = item[unique_key]
+    class_name = item['class']
+    retries = Sidekiq::RetrySet.new
+
+    retries.any? { |job| job.item['class'] == class_name && job.item[unique_key] == unique_digest }
+  end
+end