diff options
author | Sean McGivern <sean@gitlab.com> | 2017-06-16 11:10:42 +0100 |
---|---|---|
committer | Sean McGivern <sean@gitlab.com> | 2017-06-16 11:14:41 +0100 |
commit | fe0898cc14606ec0cc0ca57db9d21bf1424f290f (patch) | |
tree | 1768eeea5fb118e2cdb0a23cf6df0f2590f5a790 | |
parent | 587a73b2dd63cbb7d69c45c20d4cb33673c33463 (diff) | |
download | gitlab-ce-fe0898cc14606ec0cc0ca57db9d21bf1424f290f.tar.gz |
Speed up used languages calculation on charts page
We removed calls from our code to Rugged::Repository#fetch_attributes:
<https://gitlab.com/gitlab-org/gitlab_git/commit/340e111e040ae847b614d35b4d3173ec48329015>
However, we didn't remove calls from within Linguist. This method is only called
when calculating the languages for a repository on the Charts page:
<https://github.com/github/linguist/blob/v4.7.0/lib/linguist/lazy_blob.rb#L33-L36>
We can safely use our own Gitlab::Git::Attributes here. On staging, for the
GitLab CE repo, this makes the calculation take about a third of the time:
# Before
Benchmark.realtime do
Linguist::Repository.new(repository.rugged,
repository.rugged.head.target_id).languages
end
#=> 23.67193900188431
# After
Benchmark.realtime do
Linguist::Repository.new(repository.rugged,
repository.rugged.head.target_id).languages
end
#=> 8.945212290156633
-rw-r--r-- | changelogs/unreleased/speed-up-graphs.yml | 4 | ||||
-rw-r--r-- | config/initializers/rugged_use_gitlab_git_attributes.rb | 25 |
2 files changed, 29 insertions, 0 deletions
diff --git a/changelogs/unreleased/speed-up-graphs.yml b/changelogs/unreleased/speed-up-graphs.yml new file mode 100644 index 00000000000..7cb155af6fd --- /dev/null +++ b/changelogs/unreleased/speed-up-graphs.yml @@ -0,0 +1,4 @@ +--- +title: Speed up used languages calculation on charts page +merge_request: +author: diff --git a/config/initializers/rugged_use_gitlab_git_attributes.rb b/config/initializers/rugged_use_gitlab_git_attributes.rb new file mode 100644 index 00000000000..7d652799786 --- /dev/null +++ b/config/initializers/rugged_use_gitlab_git_attributes.rb @@ -0,0 +1,25 @@ +# We don't want to ever call Rugged::Repository#fetch_attributes, because it has +# a lot of I/O overhead: +# <https://gitlab.com/gitlab-org/gitlab_git/commit/340e111e040ae847b614d35b4d3173ec48329015> +# +# While we don't do this from within the GitLab source itself, the Linguist gem +# has a dependency on Rugged and uses the gitattributes file when calculating +# repository-wide language statistics: +# <https://github.com/github/linguist/blob/v4.7.0/lib/linguist/lazy_blob.rb#L33-L36> +# +# The options passed by Linguist are those assumed by Gitlab::Git::Attributes +# anyway, and there is no great efficiency gain from just fetching the listed +# attributes with our implementation, so we ignore the additional arguments. +# +module Rugged + class Repository + module UseGitlabGitAttributes + def fetch_attributes(name, *) + @attributes ||= Gitlab::Git::Attributes.new(path) + @attributes.attributes(name) + end + end + + prepend UseGitlabGitAttributes + end +end |