diff options
author | Sven Selberg <sven.selberg@sonymobile.com> | 2013-11-13 16:04:35 +0100 |
---|---|---|
committer | Gustaf Lundh <gustaf.lundh@sonymobile.com> | 2013-11-14 13:12:53 +0100 |
commit | 8b49b130ef5b514b5462a0dd31c170f269f4d909 (patch) | |
tree | af29e0e0b3661bb7238879d0eb25c03b9bfdd33d | |
parent | e5b7f1aa5c195098cdd043a21aa2734dd0764db4 (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.java | 4 |
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()); |