class SidekiqUniqueDigestsCleaner

Public Class Methods

clean_unique_digests() click to toggle source
# File lib/sidekiq_unique_digests_cleaner.rb, line 4
def self.clean_unique_digests
  Sidekiq.logger.info('######## Starting cleaning up locked unique digests...')
  digests = stuck_digests
  if digests.any?
    Sidekiq.logger.info('######## Looks like those digests are stuck: ' + digests.join(', '))
    Sidekiq.logger.info('######## Unlocking digests...')
    digests.map { |digest| SidekiqUniqueJobs::Digests.del(digest: digest) }
    Sidekiq.logger.info('######## Unlocked!')
  else
    Sidekiq.logger.info('######## What is the nice day! Nothing to unlock.')
  end
end
stuck_digests() click to toggle source
# File lib/sidekiq_unique_digests_cleaner.rb, line 17
def self.stuck_digests
  digests_with_lock = [
    Sidekiq::ScheduledSet.new.map(&:value),
    Sidekiq::RetrySet.new.map(&:value),
    Sidekiq::Queue.all.map { |queue| queue.map(&:value) },
  ].flatten.map { |job_value| JSON.parse(job_value, symbolize_names: true)[:unique_digest] }

  digests_with_lock += Sidekiq::Workers.new.map { |_pid, _tid, job| job['unique_digest'] }

  SidekiqUniqueJobs::Digests.all - digests_with_lock
end