summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-03-21 21:11:14 +0000
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-03-21 21:11:14 +0000
commit63da396f59be2ef8af091f10979934f085139771 (patch)
tree573f4646094b97f19221d467069c757caf76d039
parent3b5df555f213e3a2be804b56455fcbaad3d93be0 (diff)
parentd96098e966f70afcf6f3bfa1ed1bc20be2672fc8 (diff)
downloadgitlab-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--CHANGELOG1
-rw-r--r--app/models/repository.rb39
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