summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn Pearce <sop@google.com>2012-12-21 08:07:58 -0800
committerGerrit Code Review <noreply-gerritcodereview@google.com>2012-12-21 08:07:58 -0800
commitd4fad3658028249df40faa0f583fcbf67d902279 (patch)
tree30f86b77f425406f67a02d7f0cd85e4cc26ea158
parent818b53654cf9f810c22fec2689b1e3d413bc6927 (diff)
parent9bcd4750fcee86a4dbddb65f347ebe2b9845008c (diff)
Merge "Improve performance of ReceiveCommits for repos with many refs" into stable-2.5
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java62
1 files changed, 26 insertions, 36 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
index 9f781a0af7..7d1a33a633 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
@@ -249,7 +249,6 @@ public class ReceiveCommits {
private final Map<RevCommit, ReplaceRequest> replaceByCommit =
new HashMap<RevCommit, ReplaceRequest>();
- private Collection<ObjectId> existingObjects;
private Map<ObjectId, Ref> refsById;
private String destTopicName;
@@ -1116,22 +1115,7 @@ public class ReceiveCommits {
try {
Set<ObjectId> existing = Sets.newHashSet();
walk.markStart(walk.parseCommit(newChange.getNewId()));
- for (Ref ref : repo.getAllRefs().values()) {
- if (ref.getObjectId() == null) {
- continue;
- } else if (ref.getName().startsWith("refs/changes/")) {
- existing.add(ref.getObjectId());
- } else if (ref.getName().startsWith(R_HEADS)
- || ref.getName().equals(destBranchCtl.getRefName())) {
- try {
- walk.markUninteresting(walk.parseCommit(ref.getObjectId()));
- } catch (IOException e) {
- log.warn(String.format("Invalid ref %s in %s",
- ref.getName(), project.getName()), e);
- continue;
- }
- }
- }
+ markHeadsAsUninteresting(walk, existing);
List<ChangeLookup> pending = Lists.newArrayList();
final Set<Change.Key> newChangeIds = new HashSet<Change.Key>();
@@ -1229,6 +1213,26 @@ public class ReceiveCommits {
return newChanges;
}
+
+ private void markHeadsAsUninteresting(final RevWalk walk, Set<ObjectId> existing) {
+ for (Ref ref : repo.getAllRefs().values()) {
+ if (ref.getObjectId() == null) {
+ continue;
+ } else if (ref.getName().startsWith("refs/changes/")) {
+ existing.add(ref.getObjectId());
+ } else if (ref.getName().startsWith(R_HEADS)
+ || (destBranchCtl != null && ref.getName().equals(destBranchCtl.getRefName()))) {
+ try {
+ walk.markUninteresting(walk.parseCommit(ref.getObjectId()));
+ } catch (IOException e) {
+ log.warn(String.format("Invalid ref %s in %s",
+ ref.getName(), project.getName()), e);
+ continue;
+ }
+ }
+ }
+ }
+
private static boolean isValidChangeId(String idStr) {
return idStr.matches("^I[0-9a-fA-F]{40}$") && !idStr.matches("^I00*$");
}
@@ -1811,18 +1815,15 @@ public class ReceiveCommits {
walk.reset();
walk.sort(RevSort.NONE);
try {
+ Set<ObjectId> existing = Sets.newHashSet();
walk.markStart(walk.parseCommit(cmd.getNewId()));
- for (ObjectId id : existingObjects()) {
- try {
- walk.markUninteresting(walk.parseCommit(id));
- } catch (IOException e) {
- continue;
- }
- }
+ markHeadsAsUninteresting(walk, existing);
RevCommit c;
while ((c = walk.next()) != null) {
- if (!validCommit(ctl, cmd, c)) {
+ if (existing.contains(c)) {
+ continue;
+ } else if (!validCommit(ctl, cmd, c)) {
break;
}
}
@@ -1832,17 +1833,6 @@ public class ReceiveCommits {
}
}
- private Collection<ObjectId> existingObjects() {
- if (existingObjects == null) {
- Map<String, Ref> refs = repo.getAllRefs();
- existingObjects = new ArrayList<ObjectId>(refs.size());
- for (Ref r : refs.values()) {
- existingObjects.add(r.getObjectId());
- }
- }
- return existingObjects;
- }
-
private boolean validCommit(final RefControl ctl, final ReceiveCommand cmd,
final RevCommit c) throws MissingObjectException, IOException {
rp.getRevWalk().parseBody(c);