Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue with until_and_while_executing lock when job is not enqueued through sidekiq #841

Open
schwerdt opened this issue Mar 21, 2024 · 0 comments

Comments

@schwerdt
Copy link

Is your feature request related to a problem? Please describe.
Recently, we observed an issue with the until_and_while_executing lock. We were using this lock as our default configuration in the sidekiq initializer, so it was applied to all workers where we did not explicitly change the lock, as expected.

Jobs for one of our workers, however, are not enqueued through sidekiq but are pushed directly to redis (using scout. The behavior we observed is this:

  1. The job is published to redis by scout - but without creating a lock.
  2. The job is picked up for processing.
  3. sidekiq-unique-jobs tries to remove the lock so that it can create the runtime lock here which returns false and goes to the else statement
  4. The perform function is never called but no error is raised so the job appears to complete successfully.

The solution we are using is to explicitly use no lock for this worker. We could also possibly use the while_executing lock.

The main issue was that we were not expecting the job to fail to execute the perform function and also fail silently.

Describe the solution you'd like
In the until_and_while_executing lock, do you think it makes sense to check if a lock is locked? before attempting to unlock it. I understand why it could be a problem if unlocking fails (the lock will live on). If the lock was never present to begin with, though, is it harmful to try to create the runtime lock anyway and run the job?

I realize it's unconventional to enqueue jobs this way (enqueue directly to redis), so I wanted to learn what your thoughts are on this idea.

Could there be a check on the presence the lock before attempting the unlock?

 locksmith.locked?

Describe alternatives you've considered
As an alternative, it might be helpful to have a logging statement or an error if the job fails to execute because the lock can not be unlocked.

Additional context

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant