diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2015-03-21 21:11:14 +0000 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2015-03-21 21:11:14 +0000 |
commit | 63da396f59be2ef8af091f10979934f085139771 (patch) | |
tree | 573f4646094b97f19221d467069c757caf76d039 | |
parent | 3b5df555f213e3a2be804b56455fcbaad3d93be0 (diff) | |
parent | d96098e966f70afcf6f3bfa1ed1bc20be2672fc8 (diff) | |
download | gitlab-ce-63da396f59be2ef8af091f10979934f085139771.tar.gz |
Merge branch 'performance-tune' into 'master'
Performance improvements
* Cache project branches and tags into variables
* Cache lookup results into hash to prevent repeating same requests to git repo
* Cache head commit and head tree
See merge request !417
-rw-r--r-- | CHANGELOG | 1 | ||||
-rw-r--r-- | app/models/repository.rb | 39 |
2 files changed, 37 insertions, 3 deletions
diff --git a/CHANGELOG b/CHANGELOG index 9a1c4f41dbb..f9f857e562d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -17,6 +17,7 @@ v 7.10.0 (unreleased) - Passing the name of pushed ref to CI service (requires GitLab CI 7.9+) - Add location field to user profile - Fix print view for markdown files and wiki pages + - Improve GitLab performance when working with git repositories v 7.9.0 (unreleased) - Add HipChat integration documentation (Stan Hu) diff --git a/app/models/repository.rb b/app/models/repository.rb index c6eaa485b8a..082ad7a0c6a 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -62,24 +62,28 @@ class Repository def add_branch(branch_name, ref) cache.expire(:branch_names) + @branches = nil gitlab_shell.add_branch(path_with_namespace, branch_name, ref) end def add_tag(tag_name, ref, message = nil) cache.expire(:tag_names) + @tags = nil gitlab_shell.add_tag(path_with_namespace, tag_name, ref, message) end def rm_branch(branch_name) cache.expire(:branch_names) + @branches = nil gitlab_shell.rm_branch(path_with_namespace, branch_name) end def rm_tag(tag_name) cache.expire(:tag_names) + @tags = nil gitlab_shell.rm_tag(path_with_namespace, tag_name) end @@ -180,8 +184,17 @@ class Repository end end + def lookup_cache + @lookup_cache ||= {} + end + def method_missing(m, *args, &block) - raw_repository.send(m, *args, &block) + if m == :lookup && !block_given? + lookup_cache[m] ||= {} + lookup_cache[m][args.join(":")] ||= raw_repository.send(m, *args, &block) + else + raw_repository.send(m, *args, &block) + end end def respond_to?(method) @@ -235,12 +248,20 @@ class Repository end def head_commit - commit(self.root_ref) + @head_commit ||= commit(self.root_ref) + end + + def head_tree + @head_tree ||= Tree.new(self, head_commit.sha, nil) end def tree(sha = :head, path = nil) if sha == :head - sha = head_commit.sha + if path.nil? + return head_tree + else + sha = head_commit.sha + end end Tree.new(self, sha, path) @@ -368,6 +389,18 @@ class Repository end end + def branches + @branches ||= raw_repository.branches + end + + def tags + @tags ||= raw_repository.tags + end + + def root_ref + @root_ref ||= raw_repository.root_ref + end + private def cache |