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
5cea315a
Commit
5cea315a
authored
Jun 26, 2018
by
Douglas Barbosa Alexandre
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Retry checksum calculation for failures
parent
3effb9ac
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
127 additions
and
9 deletions
+127
-9
ee/app/finders/geo/repository_verification_finder.rb
ee/app/finders/geo/repository_verification_finder.rb
+29
-0
ee/app/workers/geo/repository_verification/primary/shard_worker.rb
...rkers/geo/repository_verification/primary/shard_worker.rb
+10
-5
ee/spec/finders/geo/repository_verification_finder_spec.rb
ee/spec/finders/geo/repository_verification_finder_spec.rb
+64
-0
ee/spec/workers/geo/repository_verification/primary/shard_worker_spec.rb
.../geo/repository_verification/primary/shard_worker_spec.rb
+24
-4
No files found.
ee/app/finders/geo/repository_verification_finder.rb
View file @
5cea315a
...
@@ -4,6 +4,15 @@ module Geo
...
@@ -4,6 +4,15 @@ module Geo
@shard_name
=
shard_name
@shard_name
=
shard_name
end
end
def
find_failed_projects
(
batch_size
:)
query
=
build_query_to_find_failed_projects
(
batch_size:
batch_size
)
cte
=
Gitlab
::
SQL
::
CTE
.
new
(
:failed_projects
,
query
)
Project
.
with
(
cte
.
to_arel
)
.
from
(
cte
.
alias_to
(
projects_table
))
.
order
(
last_repository_updated_at_asc
)
end
def
find_outdated_projects
(
batch_size
:)
def
find_outdated_projects
(
batch_size
:)
query
=
build_query_to_find_outdated_projects
(
batch_size:
batch_size
)
query
=
build_query_to_find_outdated_projects
(
batch_size:
batch_size
)
cte
=
Gitlab
::
SQL
::
CTE
.
new
(
:outdated_projects
,
query
)
cte
=
Gitlab
::
SQL
::
CTE
.
new
(
:outdated_projects
,
query
)
...
@@ -45,6 +54,18 @@ module Geo
...
@@ -45,6 +54,18 @@ module Geo
attr_reader
:shard_name
attr_reader
:shard_name
def
build_query_to_find_failed_projects
(
batch_size
:)
query
=
projects_table
.
join
(
repository_state_table
).
on
(
project_id_matcher
)
.
project
(
projects_table
[
:id
],
projects_table
[
:last_repository_updated_at
])
.
where
(
repository_failed
.
or
(
wiki_failed
))
.
take
(
batch_size
)
query
=
apply_shard_restriction
(
query
)
if
shard_name
.
present?
query
end
def
build_query_to_find_outdated_projects
(
batch_size
:)
def
build_query_to_find_outdated_projects
(
batch_size
:)
query
=
query
=
projects_table
projects_table
...
@@ -76,11 +97,19 @@ module Geo
...
@@ -76,11 +97,19 @@ module Geo
.
join_sources
.
join_sources
end
end
def
repository_failed
repository_state_table
[
:last_repository_verification_failure
].
not_eq
(
nil
)
end
def
repository_outdated
def
repository_outdated
repository_state_table
[
:repository_verification_checksum
].
eq
(
nil
)
repository_state_table
[
:repository_verification_checksum
].
eq
(
nil
)
.
and
(
repository_state_table
[
:last_repository_verification_failure
].
eq
(
nil
))
.
and
(
repository_state_table
[
:last_repository_verification_failure
].
eq
(
nil
))
end
end
def
wiki_failed
repository_state_table
[
:last_wiki_verification_failure
].
not_eq
(
nil
)
end
def
wiki_outdated
def
wiki_outdated
repository_state_table
[
:wiki_verification_checksum
].
eq
(
nil
)
repository_state_table
[
:wiki_verification_checksum
].
eq
(
nil
)
.
and
(
repository_state_table
[
:last_wiki_verification_failure
].
eq
(
nil
))
.
and
(
repository_state_table
[
:last_wiki_verification_failure
].
eq
(
nil
))
...
...
ee/app/workers/geo/repository_verification/primary/shard_worker.rb
View file @
5cea315a
...
@@ -42,12 +42,13 @@ module Geo
...
@@ -42,12 +42,13 @@ module Geo
def
load_pending_resources
def
load_pending_resources
resources
=
find_unverified_project_ids
(
batch_size:
db_retrieve_batch_size
)
resources
=
find_unverified_project_ids
(
batch_size:
db_retrieve_batch_size
)
remaining_capacity
=
db_retrieve_batch_size
-
resources
.
size
remaining_capacity
=
db_retrieve_batch_size
-
resources
.
size
return
resources
if
remaining_capacity
.
zero?
if
remaining_capacity
.
zero?
resources
=
resources
+
find_outdated_project_ids
(
batch_size:
remaining_capacity
)
resources
remaining_capacity
=
db_retrieve_batch_size
-
resources
.
size
else
return
resources
if
remaining_capacity
.
zero?
resources
+
find_outdated_project_ids
(
batch_size:
remaining_capacity
)
end
resources
+
find_failed_project_ids
(
batch_size:
remaining_capacity
)
end
end
def
find_unverified_project_ids
(
batch_size
:)
def
find_unverified_project_ids
(
batch_size
:)
...
@@ -57,6 +58,10 @@ module Geo
...
@@ -57,6 +58,10 @@ module Geo
def
find_outdated_project_ids
(
batch_size
:)
def
find_outdated_project_ids
(
batch_size
:)
finder
.
find_outdated_projects
(
batch_size:
batch_size
).
pluck
(
:id
)
finder
.
find_outdated_projects
(
batch_size:
batch_size
).
pluck
(
:id
)
end
end
def
find_failed_project_ids
(
batch_size
:)
finder
.
find_failed_projects
(
batch_size:
batch_size
).
pluck
(
:id
)
end
end
end
end
end
end
end
...
...
ee/spec/finders/geo/repository_verification_finder_spec.rb
View file @
5cea315a
...
@@ -3,6 +3,70 @@ require 'spec_helper'
...
@@ -3,6 +3,70 @@ require 'spec_helper'
describe
Geo
::
RepositoryVerificationFinder
,
:postgresql
do
describe
Geo
::
RepositoryVerificationFinder
,
:postgresql
do
set
(
:project
)
{
create
(
:project
)
}
set
(
:project
)
{
create
(
:project
)
}
describe
'#find_failed_projects'
do
it
'returns projects where repository verification failed'
do
create
(
:repository_state
,
:repository_failed
,
:wiki_verified
,
project:
project
)
expect
(
subject
.
find_failed_projects
(
batch_size:
10
))
.
to
match_array
(
project
)
end
it
'does not return projects where repository verification is outdated'
do
create
(
:repository_state
,
:repository_outdated
,
project:
project
)
expect
(
subject
.
find_failed_projects
(
batch_size:
10
)).
to
be_empty
end
it
'does not return projects where repository verification is pending'
do
create
(
:repository_state
,
:wiki_verified
,
project:
project
)
expect
(
subject
.
find_failed_projects
(
batch_size:
10
)).
to
be_empty
end
it
'returns projects where wiki verification failed'
do
create
(
:repository_state
,
:repository_verified
,
:wiki_failed
,
project:
project
)
expect
(
subject
.
find_failed_projects
(
batch_size:
10
))
.
to
match_array
(
project
)
end
it
'does non return projects where wiki verification is outdated'
do
create
(
:repository_state
,
:wiki_outdated
,
project:
project
)
expect
(
subject
.
find_failed_projects
(
batch_size:
10
)).
to
be_empty
end
it
'does not return projects where wiki verification is pending'
do
create
(
:repository_state
,
:repository_verified
,
project:
project
)
expect
(
subject
.
find_failed_projects
(
batch_size:
10
)).
to
be_empty
end
it
'returns less active projects first'
do
less_active_project
=
create
(
:project
)
create
(
:repository_state
,
:repository_failed
,
project:
project
)
create
(
:repository_state
,
:repository_failed
,
project:
less_active_project
)
project
.
update_column
(
:last_repository_updated_at
,
30
.
minutes
.
ago
)
less_active_project
.
update_column
(
:last_repository_updated_at
,
2
.
days
.
ago
)
expect
(
subject
.
find_failed_projects
(
batch_size:
10
)).
to
eq
[
less_active_project
,
project
]
end
context
'with shard restriction'
do
subject
{
described_class
.
new
(
shard_name:
project
.
repository_storage
)
}
it
'does not return projects on other shards'
do
project_other_shard
=
create
(
:project
)
project_other_shard
.
update_column
(
:repository_storage
,
'other'
)
create
(
:repository_state
,
:repository_failed
,
project:
project
)
create
(
:repository_state
,
:repository_failed
,
project:
project_other_shard
)
expect
(
subject
.
find_failed_projects
(
batch_size:
10
))
.
to
match_array
(
project
)
end
end
end
describe
'#find_outdated_projects'
do
describe
'#find_outdated_projects'
do
it
'returns projects where repository verification is outdated'
do
it
'returns projects where repository verification is outdated'
do
create
(
:repository_state
,
:repository_outdated
,
project:
project
)
create
(
:repository_state
,
:repository_outdated
,
project:
project
)
...
...
ee/spec/workers/geo/repository_verification/primary/shard_worker_spec.rb
View file @
5cea315a
...
@@ -63,6 +63,26 @@ describe Geo::RepositoryVerification::Primary::ShardWorker, :postgresql, :clean_
...
@@ -63,6 +63,26 @@ describe Geo::RepositoryVerification::Primary::ShardWorker, :postgresql, :clean_
subject
.
perform
(
shard_name
)
subject
.
perform
(
shard_name
)
end
end
it
'performs Geo::RepositoryVerification::Primary::SingleWorker for projects where repository verification failed'
do
repository_verification_failed
=
create
(
:project
)
create
(
:repository_state
,
:repository_failed
,
:wiki_verified
,
project:
repository_verification_failed
)
expect
(
primary_singleworker
).
to
receive
(
:perform_async
).
with
(
repository_verification_failed
.
id
)
subject
.
perform
(
shard_name
)
end
it
'performs Geo::RepositoryVerification::Primary::SingleWorker for projects where wiki verification failed'
do
wiki_verification_failed
=
create
(
:project
)
create
(
:repository_state
,
:repository_verified
,
:wiki_failed
,
project:
wiki_verification_failed
)
expect
(
primary_singleworker
).
to
receive
(
:perform_async
).
with
(
wiki_verification_failed
.
id
)
subject
.
perform
(
shard_name
)
end
it
'does not perform Geo::RepositoryVerification::Primary::SingleWorker when shard becomes unhealthy'
do
it
'does not perform Geo::RepositoryVerification::Primary::SingleWorker when shard becomes unhealthy'
do
create
(
:project
)
create
(
:project
)
...
@@ -133,14 +153,14 @@ describe Geo::RepositoryVerification::Primary::ShardWorker, :postgresql, :clean_
...
@@ -133,14 +153,14 @@ describe Geo::RepositoryVerification::Primary::ShardWorker, :postgresql, :clean_
end
end
end
end
it
'handles multiple batches of projects needing verification,
skipp
ing failed repos'
do
it
'handles multiple batches of projects needing verification,
includ
ing failed repos'
do
expect
(
primary_singleworker
).
to
receive
(
:perform_async
).
with
(
project_repo_unverified
.
id
).
once
.
and_call_original
expect
(
primary_singleworker
).
to
receive
(
:perform_async
).
with
(
project_repo_unverified
.
id
).
once
.
and_call_original
expect
(
primary_singleworker
).
to
receive
(
:perform_async
).
with
(
project_wiki_unverified
.
id
).
once
.
and_call_original
expect
(
primary_singleworker
).
to
receive
(
:perform_async
).
with
(
project_wiki_unverified
.
id
).
once
.
and_call_original
expect
(
primary_singleworker
).
to
receive
(
:perform_async
).
with
(
project_repo_verified
.
id
).
once
.
and_call_original
expect
(
primary_singleworker
).
to
receive
(
:perform_async
).
with
(
project_repo_verified
.
id
).
once
.
and_call_original
expect
(
primary_singleworker
).
to
receive
(
:perform_async
).
with
(
project_wiki_verified
.
id
).
once
.
and_call_original
expect
(
primary_singleworker
).
to
receive
(
:perform_async
).
with
(
project_wiki_verified
.
id
).
once
.
and_call_original
expect
(
primary_singleworker
).
not_to
receive
(
:perform_async
).
with
(
project_both_failed
.
id
)
expect
(
primary_singleworker
).
to
receive
(
:perform_async
).
with
(
project_both_failed
.
id
).
once
.
and_call_original
expect
(
primary_singleworker
).
not_to
receive
(
:perform_async
).
with
(
project_repo_failed_wiki_verified
.
id
)
expect
(
primary_singleworker
).
to
receive
(
:perform_async
).
with
(
project_repo_failed_wiki_verified
.
id
).
once
.
and_call_original
expect
(
primary_singleworker
).
not_to
receive
(
:perform_async
).
with
(
project_repo_verified_wiki_failed
.
id
)
expect
(
primary_singleworker
).
to
receive
(
:perform_async
).
with
(
project_repo_verified_wiki_failed
.
id
).
once
.
and_call_original
8
.
times
do
8
.
times
do
Sidekiq
::
Testing
.
inline!
{
subject
.
perform
(
shard_name
)
}
Sidekiq
::
Testing
.
inline!
{
subject
.
perform
(
shard_name
)
}
...
...
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