diff options
author | Alejandro RodrÃguez <alejorro70@gmail.com> | 2017-08-30 05:10:41 +0300 |
---|---|---|
committer | Alejandro RodrÃguez <alejorro70@gmail.com> | 2017-08-31 17:31:45 +0300 |
commit | eaf60bb5441190e2ffcf219b3169bda2237d57cd (patch) | |
tree | 3139e8056df242472c91d9d2ac6d48c82cf4b36c /lib/gitlab/reference_counter.rb | |
parent | cbaa015cc9f55a387cdab85a6ba4b8c9c6ab447e (diff) |
Implement /internal/post_receive unified endpoint for PostReceive tasks
Diffstat (limited to 'lib/gitlab/reference_counter.rb')
-rw-r--r-- | lib/gitlab/reference_counter.rb | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/lib/gitlab/reference_counter.rb b/lib/gitlab/reference_counter.rb new file mode 100644 index 00000000000..bb26f1b610a --- /dev/null +++ b/lib/gitlab/reference_counter.rb @@ -0,0 +1,44 @@ +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 |