BigW Consortium Gitlab
Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
gitlab-ce
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Forest Godfrey
gitlab-ce
Commits
61f4d08b
Unverified
Commit
61f4d08b
authored
Oct 12, 2017
by
Zeger-Jan van de Weg
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Allow testing on Gitaly call count
Previous efforts were aimed at detecting N + 1 queries, general regressions are hard to find and mitigate.
parent
2087f121
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
52 additions
and
14 deletions
+52
-14
gitaly.md
doc/development/gitaly.md
+31
-3
pipelines_controller_spec.rb
spec/controllers/projects/pipelines_controller_spec.rb
+21
-11
No files found.
doc/development/gitaly.md
View file @
61f4d08b
...
...
@@ -52,8 +52,8 @@ rm -rf tmp/tests/gitaly
## `TooManyInvocationsError` errors
During development and testing, you may experience
`Gitlab::GitalyClient::TooManyInvocationsError`
failures.
The
`GitalyClient`
will attempt to block against potential n+1 issues by raising this error
During development and testing, you may experience
`Gitlab::GitalyClient::TooManyInvocationsError`
failures.
The
`GitalyClient`
will attempt to block against potential n+1 issues by raising this error
when Gitaly is called more than 30 times in a single Rails request or Sidekiq execution.
As a temporary measure, export
`GITALY_DISABLE_REQUEST_LIMITS=1`
to suppress the error. This will disable the n+1 detection
...
...
@@ -64,7 +64,7 @@ Please raise an issue in the GitLab CE or EE repositories to report the issue. I
`TooManyInvocationsError`
. Also include any known failing tests if possible.
Isolate the source of the n+1 problem. This will normally be a loop that results in Gitaly being called for each
element in an array. If you are unable to isolate the problem, please contact a member
element in an array. If you are unable to isolate the problem, please contact a member
of the
[
Gitaly Team
](
https://gitlab.com/groups/gl-gitaly/group_members
)
for assistance.
Once the source has been found, wrap it in an
`allow_n_plus_1_calls`
block, as follows:
...
...
@@ -79,6 +79,34 @@ end
Once the code is wrapped in this block, this code-path will be excluded from n+1 detection.
## Request counts
Commits and other git data, is now fetched through Gitaly. These fetches can,
much like with a database, be batched. This improves performance for the client
and for Gitaly itself and therefore for the users too. To keep performance stable
and guard performance regressions, Gitaly calls can be counted and the call count
can be tested against:
```
ruby
describe
'Gitaly Request count tests'
do
context
'when the request store is activated'
,
:request_store
do
it
'correctly counts the gitaly requests made'
do
count
=
gitaly_request_count
{
subject
}
expect
{
subject
}.
to
change
{
Gitlab
::
GitalyClient
.
get_request_count
}.
by
(
10
)
end
end
context
'when the request store is disabled'
do
it
'is always zero'
do
subject
expect
(
Gitlab
::
GitalyClient
.
get_request_count
).
to
be_zero
end
end
end
```
---
[
Return to Development documentation
](
README.md
)
spec/controllers/projects/pipelines_controller_spec.rb
View file @
61f4d08b
...
...
@@ -3,32 +3,36 @@ require 'spec_helper'
describe
Projects
::
PipelinesController
do
include
ApiHelpers
l
et
(
:user
)
{
create
(
:user
)
}
let
(
:project
)
{
create
(
:project
,
:public
)
}
s
et
(
:user
)
{
create
(
:user
)
}
set
(
:project
)
{
create
(
:project
,
:public
,
:repository
)
}
let
(
:feature
)
{
ProjectFeature
::
DISABLED
}
before
do
stub_not_protect_default_branch
project
.
add_developer
(
user
)
project
.
project_feature
.
update
(
builds_access_level:
feature
)
project
.
project_feature
.
update
(
builds_access_level:
feature
)
sign_in
(
user
)
end
describe
'GET index.json'
do
before
do
create
(
:ci_empty_pipeline
,
status:
'pending'
,
project:
project
)
create
(
:ci_empty_pipeline
,
status:
'running'
,
project:
project
)
create
(
:ci_empty_pipeline
,
status:
'created'
,
project:
project
)
create
(
:ci_empty_pipeline
,
status:
'success'
,
project:
project
)
branch_head
=
project
.
commit
parent
=
branch_head
.
parent
get
:index
,
namespace_id:
project
.
namespace
,
project_id:
project
,
format: :json
create
(
:ci_empty_pipeline
,
status:
'pending'
,
project:
project
,
sha:
branch_head
.
id
)
create
(
:ci_empty_pipeline
,
status:
'running'
,
project:
project
,
sha:
branch_head
.
id
)
create
(
:ci_empty_pipeline
,
status:
'created'
,
project:
project
,
sha:
parent
.
id
)
create
(
:ci_empty_pipeline
,
status:
'success'
,
project:
project
,
sha:
parent
.
id
)
end
subject
do
get
:index
,
namespace_id:
project
.
namespace
,
project_id:
project
,
format: :json
end
it
'returns JSON with serialized pipelines'
do
subject
expect
(
response
).
to
have_http_status
(
:ok
)
expect
(
response
).
to
match_response_schema
(
'pipeline'
)
...
...
@@ -39,6 +43,12 @@ describe Projects::PipelinesController do
expect
(
json_response
[
'count'
][
'pending'
]).
to
eq
1
expect
(
json_response
[
'count'
][
'finished'
]).
to
eq
1
end
context
'when performing gitaly calls'
,
:request_store
do
it
'limits the Gitaly requests'
do
expect
{
subject
}.
to
change
{
Gitlab
::
GitalyClient
.
get_request_count
}.
by
(
10
)
end
end
end
describe
'GET show JSON'
do
...
...
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