From 8b49b130ef5b514b5462a0dd31c170f269f4d909 Mon Sep 17 00:00:00 2001 From: Sven Selberg Date: Wed, 13 Nov 2013 16:04:35 +0100 Subject: 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 --- .../main/java/com/google/gerrit/server/project/ProjectControl.java | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'gerrit-server') 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 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()); -- cgit v1.2.3