Skip to content

Infinite lock using until_and_while_executing after sidekiq restart #361

@mainameiz

Description

@mainameiz

Describe the bug
until_and_while_executing does not on sidekiq restarts.

Expected behavior
I expect that job will be retried when sidekiq started after normal restart.

Current behavior
There are some lock keys in redis that prevents job from being retries.

[8] pry(main)> Sidekiq.redis { |r| puts r.keys('uniquejob*').sort; }; nil
uniquejobs:f46bc25dd7800206da7159bd516aa7e1:AVAILABLE
uniquejobs:f46bc25dd7800206da7159bd516aa7e1:RUN:EXISTS
uniquejobs:f46bc25dd7800206da7159bd516aa7e1:RUN:GRABBED

Worker class

class TestWorker
  include Sidekiq::Worker

  # both does not work
  sidekiq_options queue: :default, unique: :until_and_while_executing, retry: true
  # sidekiq_options queue: :default, unique: :until_and_while_executing, retry: false

  # this callback is not called
  sidekiq_retries_exhausted do |msg, _ex|
    Rails.logger.info "sidekiq_retries_exhausted: #{object_id} msg['unique_digest']: #{msg['unique_digest'].inspect}"
    SidekiqUniqueJobs::Digests.del(digest: msg['unique_digest']) if msg['unique_digest']
  end

  def perform
    Rails.logger.info "started: #{object_id}, sleeping 40s"
    sleep 40
    Rails.logger.info "finished: #{object_id}"
  end
end

Additional context

Jobs are enqueued using perform_async.

`config/initializers/sidekiq.rb

Sidekiq.configure_server do |config|
  ....

  config.death_handlers << ->(job, _ex) do
    Rails.logger.info "death_handlers: #{object_id} job['unique_digest']: #{job['unique_digest'].inspect}"
    SidekiqUniqueJobs::Digests.del(digest: job['unique_digest']) if job['unique_digest']
  end
end

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions