Skip to content

until_executed lock not releasing after job finishes #883

@kapso

Description

@kapso

I’m seeing persistent Redis lock digests after a job finishes execution using lock: :until_executed in Sidekiq 8.0.4 with sidekiq-unique-jobs 8.0.11 on Rails 8.0.3.

  • Job runs and finishes successfully.
  • Lock digest (uniquejobs:) remains in Redis after job completion.
  • As a result, any subsequent .perform_async calls are rejected
  • I’ve verified the job does not raise exceptions.

Worker

# worker
class ProjectWorker
  include Sidekiq::Worker

  sidekiq_options queue: :project
                  retry: 8,
                  lock: :until_executed,
                  on_conflict: :log

  def perform(arg1, arg2)
    puts "Running: #{arg1}, #{arg2}"
  end
end

# enqueue
ProjectWorker.perform_async("hello", "world")

Gem versions:

Sidekiq v8.0.4 / Pro v8.0.1
sidekiq-unique-jobs: 8.0.11
rails: 8.0.3
redis: 7.2.0
ruby: 3.4.4

Sidekiq config:

require 'sidekiq/pro/web'
require 'sidekiq-scheduler'
require 'sidekiq-scheduler/web'
require 'sidekiq-unique-jobs'
require 'middleware/sidekiq/set_current_context'
require 'middleware/sidekiq/account_tenant_scoping'

require 'sidekiq/middleware/current_attributes'
Sidekiq::CurrentAttributes.persist('CurrentPersist')

Sidekiq.configure_client do |config|
  config.redis = { url: Settings.redis.url, ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE } }
  config.logger.level = Rails.env.development? ? Logger::INFO : Logger::WARN

  # Sidekiq Pro options
  Sidekiq::Client.reliable_push! unless Rails.env.test?

  config.client_middleware do |chain|
    chain.add SidekiqUniqueJobs::Middleware::Client
  end
end

Sidekiq.configure_server do |config|
  config.redis = { url: Settings.redis.url, ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE } }
  config.logger.level = Rails.env.development? ? Logger::INFO : Logger::WARN

  # Default is 5
  config.average_scheduled_poll_interval = 2

  config.on(:startup) do
    Sidekiq.schedule = YAML.safe_load(ERB.new(Rails.root.join('config/schedule.yml').read).result)
    SidekiqScheduler::Scheduler.instance.reload_schedule!
  end

  # Sidekiq Pro options
  Sidekiq::Client.reliable_push! unless Rails.env.test?
  config.super_fetch!
  config.reliable_scheduler!

  config.client_middleware do |chain|
    chain.add SidekiqUniqueJobs::Middleware::Client
  end

  config.server_middleware do |chain|
    chain.add SidekiqUniqueJobs::Middleware::Server
    chain.add Middleware::Sidekiq::SetCurrentContext
    chain.add Middleware::Sidekiq::AccountTenantScoping
  end

  SidekiqUniqueJobs::Server.configure(config)
end

unless Rails.env.local?
  Sidekiq::Web.use Rack::Auth::Basic do |username, password|
    username == Settings.sidekiq.admin.username && password == Settings.sidekiq.admin.password
  end
end

# Sidekiq Unique Jobs
SidekiqUniqueJobs.configure do |config|
  config.lock_info = true
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