Commit e13514e7 authored by Gabriel Mazetto's avatar Gabriel Mazetto

Adds reset! and expires_in methods to reference counter

Improved/redone specs
parent 63879f57
...@@ -29,7 +29,9 @@ module Gitlab ...@@ -29,7 +29,9 @@ module Gitlab
# #
# @return [Integer] value # @return [Integer] value
def value def value
Gitlab::Redis::SharedState.with { |redis| (redis.get(key) || 0).to_i } Gitlab::Redis::SharedState.with do |redis|
(redis.get(key) || 0).to_i
end
end end
# Increase the counter # Increase the counter
...@@ -57,15 +59,36 @@ module Gitlab ...@@ -57,15 +59,36 @@ module Gitlab
end end
end end
end end
# rubocop:enable Gitlab/RailsLogger
# Reset the reference counter
#
# @private Used internally by SRE and debugging purpose
# @return [Boolean] whether reset was a success
def reset!
redis_cmd do |redis|
redis.del(key)
end
end
# When the reference counter would expire
#
# @api private Used internally by SRE and debugging purpose
# @return [Integer] Number in seconds until expiration or false if never
def expires_in
Gitlab::Redis::SharedState.with do |redis|
redis.ttl(key)
end
end
private private
def redis_cmd def redis_cmd
Gitlab::Redis::SharedState.with { |redis| yield(redis) } Gitlab::Redis::SharedState.with { |redis| yield(redis) }
true true
rescue => e rescue => e
Rails.logger.warn("GitLab: An unexpected error occurred in writing to Redis: #{e}") # rubocop:disable Gitlab/RailsLogger Rails.logger.warn("GitLab: An unexpected error occurred in writing to Redis: #{e}") # rubocop:disable Gitlab/RailsLogger
false false
end end
end end
......
...@@ -2,38 +2,54 @@ ...@@ -2,38 +2,54 @@
require 'spec_helper' require 'spec_helper'
describe Gitlab::ReferenceCounter do describe Gitlab::ReferenceCounter, :clean_gitlab_redis_shared_state do
let(:redis) { double('redis') }
let(:reference_counter_key) { "git-receive-pack-reference-counter:project-1" }
let(:reference_counter) { described_class.new('project-1') } let(:reference_counter) { described_class.new('project-1') }
before do describe '#increase' do
allow(Gitlab::Redis::SharedState).to receive(:with).and_yield(redis) it 'increases and sets the expire time of a reference count for a path' do
end expect { reference_counter.increase }.to change { reference_counter.value }.by(1)
expect(reference_counter.expires_in).to be_positive
it 'increases and set the expire time of a reference count for a path' do
expect(redis).to receive(:incr).with(reference_counter_key)
expect(redis).to receive(:expire).with(reference_counter_key,
described_class::REFERENCE_EXPIRE_TIME)
expect(reference_counter.increase).to be(true) expect(reference_counter.increase).to be(true)
end end
end
describe '#decrease' do
it 'decreases the reference count for a path' do it 'decreases the reference count for a path' do
allow(redis).to receive(:decr).and_return(0) reference_counter.increase
expect(redis).to receive(:decr).with(reference_counter_key)
expect(reference_counter.decrease).to be(true) expect { reference_counter.decrease }.to change { reference_counter.value }.by(-1)
end end
it 'warns if attempting to decrease a counter with a value of one or less, and resets the counter' do it 'warns if attempting to decrease a counter with a value of zero or less, and resets the counter' do
expect(redis).to receive(:decr).and_return(-1)
expect(redis).to receive(:del)
expect(Rails.logger).to receive(:warn).with("Reference counter for project-1" \ expect(Rails.logger).to receive(:warn).with("Reference counter for project-1" \
" decreased when its value was less than 1. Reseting the counter.") " decreased when its value was less than 1. Resetting the counter.")
expect(reference_counter.decrease).to be(true) expect { reference_counter.decrease }.not_to change { reference_counter.value }
end
end end
describe '#value' do
it 'get the reference count for a path' do it 'get the reference count for a path' do
allow(redis).to receive(:get).and_return(1) expect(reference_counter.value).to eq(0)
expect(reference_counter.value).to be(1)
reference_counter.increase
expect(reference_counter.value).to eq(1)
end
end
describe '#reset!' do
it 'resets reference count down to zero' do
3.times { reference_counter.increase }
expect { reference_counter.reset! }.to change { reference_counter.value}.from(3).to(0)
end
end
describe '#expires_in' do
it 'displays the expiration time in seconds' do
reference_counter.increase
expect(reference_counter.expires_in).to be_between(500, 600)
end
end end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment