You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
19 lines
743 B
19 lines
743 B
# frozen_string_literal: true |
|
|
|
module Lockable |
|
# @param [String] lock_name |
|
# @param [ActiveSupport::Duration] autorelease Automatically release the lock after this time |
|
# @param [Boolean] raise_on_failure Raise an error if a lock cannot be acquired, or fail silently |
|
# @raise [Mastodon::RaceConditionError] |
|
def with_lock(lock_name, autorelease: 15.minutes, raise_on_failure: true) |
|
with_redis do |redis| |
|
RedisLock.acquire(redis: redis, key: "lock:#{lock_name}", autorelease: autorelease.seconds) do |lock| |
|
if lock.acquired? |
|
yield |
|
elsif raise_on_failure |
|
raise Mastodon::RaceConditionError, "Could not acquire lock for #{lock_name}, try again later" |
|
end |
|
end |
|
end |
|
end |
|
end
|
|
|