Introduce #renew for ExclusiveLease
This commit is contained in:
parent
6b86ce75cf
commit
43c3fa4455
2 changed files with 31 additions and 1 deletions
|
@ -10,13 +10,21 @@ module Gitlab
|
||||||
# ExclusiveLease.
|
# ExclusiveLease.
|
||||||
#
|
#
|
||||||
class ExclusiveLease
|
class ExclusiveLease
|
||||||
LUA_CANCEL_SCRIPT = <<-EOS.freeze
|
LUA_CANCEL_SCRIPT = <<~EOS.freeze
|
||||||
local key, uuid = KEYS[1], ARGV[1]
|
local key, uuid = KEYS[1], ARGV[1]
|
||||||
if redis.call("get", key) == uuid then
|
if redis.call("get", key) == uuid then
|
||||||
redis.call("del", key)
|
redis.call("del", key)
|
||||||
end
|
end
|
||||||
EOS
|
EOS
|
||||||
|
|
||||||
|
LUA_RENEW_SCRIPT = <<~EOS.freeze
|
||||||
|
local key, uuid, ttl = KEYS[1], ARGV[1], ARGV[2]
|
||||||
|
if redis.call("get", key) == uuid then
|
||||||
|
redis.call("expire", key, ttl)
|
||||||
|
return uuid
|
||||||
|
end
|
||||||
|
EOS
|
||||||
|
|
||||||
def self.cancel(key, uuid)
|
def self.cancel(key, uuid)
|
||||||
Gitlab::Redis.with do |redis|
|
Gitlab::Redis.with do |redis|
|
||||||
redis.eval(LUA_CANCEL_SCRIPT, keys: [redis_key(key)], argv: [uuid])
|
redis.eval(LUA_CANCEL_SCRIPT, keys: [redis_key(key)], argv: [uuid])
|
||||||
|
@ -42,6 +50,15 @@ module Gitlab
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Try to renew an existing lease. Return lease UUID on success,
|
||||||
|
# false if the lease is taken by a different UUID or inexistent.
|
||||||
|
def renew
|
||||||
|
Gitlab::Redis.with do |redis|
|
||||||
|
result = redis.eval(LUA_RENEW_SCRIPT, keys: [@redis_key], argv: [@uuid, @timeout])
|
||||||
|
result == @uuid
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Returns true if the key for this lease is set.
|
# Returns true if the key for this lease is set.
|
||||||
def exists?
|
def exists?
|
||||||
Gitlab::Redis.with do |redis|
|
Gitlab::Redis.with do |redis|
|
||||||
|
|
|
@ -19,6 +19,19 @@ describe Gitlab::ExclusiveLease, type: :redis do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#renew' do
|
||||||
|
it 'returns true when we have the existing lease' do
|
||||||
|
lease = described_class.new(unique_key, timeout: 3600)
|
||||||
|
expect(lease.try_obtain).to be_present
|
||||||
|
expect(lease.renew).to be_truthy
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns false when we dont have a lease' do
|
||||||
|
lease = described_class.new(unique_key, timeout: 3600)
|
||||||
|
expect(lease.renew).to be_falsey
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe '#exists?' do
|
describe '#exists?' do
|
||||||
it 'returns true for an existing lease' do
|
it 'returns true for an existing lease' do
|
||||||
lease = described_class.new(unique_key, timeout: 3600)
|
lease = described_class.new(unique_key, timeout: 3600)
|
||||||
|
|
Loading…
Reference in a new issue