summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean McGivern <sean@gitlab.com>2017-06-16 11:10:42 +0100
committerSean McGivern <sean@gitlab.com>2017-06-16 11:14:41 +0100
commitfe0898cc14606ec0cc0ca57db9d21bf1424f290f (patch)
tree1768eeea5fb118e2cdb0a23cf6df0f2590f5a790
parent587a73b2dd63cbb7d69c45c20d4cb33673c33463 (diff)
downloadgitlab-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.yml4
-rw-r--r--config/initializers/rugged_use_gitlab_git_attributes.rb25
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