45 lines
1 KiB
Ruby
45 lines
1 KiB
Ruby
|
module Gitlab
|
||
|
class ReferenceCounter
|
||
|
REFERENCE_EXPIRE_TIME = 600
|
||
|
|
||
|
attr_reader :gl_repository, :key
|
||
|
|
||
|
def initialize(gl_repository)
|
||
|
@gl_repository = gl_repository
|
||
|
@key = "git-receive-pack-reference-counter:#{gl_repository}"
|
||
|
end
|
||
|
|
||
|
def value
|
||
|
Gitlab::Redis::SharedState.with { |redis| (redis.get(key) || 0).to_i }
|
||
|
end
|
||
|
|
||
|
def increase
|
||
|
redis_cmd do |redis|
|
||
|
redis.incr(key)
|
||
|
redis.expire(key, REFERENCE_EXPIRE_TIME)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def decrease
|
||
|
redis_cmd do |redis|
|
||
|
current_value = redis.decr(key)
|
||
|
if current_value < 0
|
||
|
Rails.logger.warn("Reference counter for #{gl_repository} decreased" \
|
||
|
" when its value was less than 1. Reseting the counter.")
|
||
|
redis.del(key)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def redis_cmd
|
||
|
Gitlab::Redis::SharedState.with { |redis| yield(redis) }
|
||
|
true
|
||
|
rescue => e
|
||
|
Rails.logger.warn("GitLab: An unexpected error occurred in writing to Redis: #{e}")
|
||
|
false
|
||
|
end
|
||
|
end
|
||
|
end
|