feat: raise error when advisory lock cannot be acquired within configured timeout #480
+54
−4
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Overview
This PR introduces an
:advisory_lock_timeout_secondsconfiguration option that triggers an error when an advisory lock cannot be obtained within the specified time limit.Motivation
We experienced jobs that would wait for several minutes executing
SELECT GET_LOCKuntil Sidekiq terminated them. This created queue blockages and led to significant job backlogs. Implementing a timeout enables jobs to fail quickly and retry during periods of lower contention, ultimately completing successfully.Example Usage
Behavior
When
advisory_lock_timeout_secondsis configured, aWithAdvisoryLock::FailedToAcquireLockexception is raised if the lock cannot be secured within the designated timeframe, creating explicit failure handling for lock contention scenarios.Without this configuration, the system maintains the default behavior of waiting indefinitely until lock acquisition.
Implementation Details
advisory_lock_timeout_secondsconfiguration optionwith_advisory_lock!with lock parameters whenadvisory_lock_timeout_secondsis specifiedBackward Compatibility
The
advisory_lock_timeout_secondsoption defaults tonil, andwith_advisory_lock!is only invoked when a non-null value is supplied.