summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Selberg <sven.selberg@sonymobile.com>2013-11-13 16:04:35 +0100
committerGustaf Lundh <gustaf.lundh@sonymobile.com>2013-11-14 13:12:53 +0100
commit8b49b130ef5b514b5462a0dd31c170f269f4d909 (patch)
treeaf29e0e0b3661bb7238879d0eb25c03b9bfdd33d
parente5b7f1aa5c195098cdd043a21aa2734dd0764db4 (diff)
Fix: Performance issue when traversing large Git repositories
The commit: 3488eece9f1a197aedfe41d0b3275065c4981c82 "Verify access to source ref during add branch operation" introduced a performance issue on Git repositories with many refs and large commit graphs. Tree traversal, to verify visibility of initial revision, included namespaces whose tips are not reachable from any branch. Iterating over all these refs ended up stalling our system. By filtering the refs, so that only "refs/heads" and "refs/tags" namespaces are traversed, time was reduced from 1h+ to ~10 seconds for a create branch operation. Change-Id: I64c1123cc092fa5a7de6db8be7999672bd9f67b0
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java4
1 files changed, 4 insertions, 0 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
index a50d33dbd5..85637e0543 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
@@ -469,6 +469,10 @@ public class ProjectControl {
Repository repo = repoManager.openRepository(projName);
try {
for (Entry<String, Ref> entry : repo.getAllRefs().entrySet()) {
+ String refName = entry.getKey();
+ if (!refName.startsWith("refs/heads") && !refName.startsWith("refs/tags")) {
+ continue;
+ }
RevCommit tip;
try {
tip = rw.parseCommit(entry.getValue().getObjectId());