Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
e13514e7
Commit
e13514e7
authored
Jan 23, 2020
by
Gabriel Mazetto
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Adds reset! and expires_in methods to reference counter
Improved/redone specs
parent
63879f57
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
64 additions
and
25 deletions
+64
-25
lib/gitlab/reference_counter.rb
lib/gitlab/reference_counter.rb
+25
-2
spec/lib/gitlab/reference_counter_spec.rb
spec/lib/gitlab/reference_counter_spec.rb
+39
-23
No files found.
lib/gitlab/reference_counter.rb
View file @
e13514e7
...
@@ -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
...
...
spec/lib/gitlab/reference_counter_spec.rb
View file @
e13514e7
...
@@ -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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment