Set uninteresting branches based on project configuration
The set of uninteresting branches varies depending on whether the
"Create a new change for every commit not in target" is set or not.
If it is not set all branches are uninteresting since you aren't
allowed to push the same commit for review on two different branches.
If it is set there are a lot more edge-cases to consider which
potentially requires a lot of rev-walking which in turn potentially
comes with a significant performance impact.
Not having to take the penalty for uninteresting edge-cases is the
preferred behavior.
Bug: Issue 16814
Release-Notes: Improve Rebase-SubmitStrategy performance in some cases
Change-Id: I2338c0a94304b7f899d446afa23fde920dc4639c
diff --git a/java/com/google/gerrit/server/submit/RebaseSorter.java b/java/com/google/gerrit/server/submit/RebaseSorter.java
index 3645d3f..e960284 100644
--- a/java/com/google/gerrit/server/submit/RebaseSorter.java
+++ b/java/com/google/gerrit/server/submit/RebaseSorter.java
@@ -40,7 +40,7 @@
private final CurrentUser caller;
private final CodeReviewRevWalk rw;
private final RevFlag canMergeFlag;
- private final RevCommit initialTip;
+ private final Set<RevCommit> uninterestingBranchTips;
private final Set<RevCommit> alreadyAccepted;
private final Provider<InternalChangeQuery> queryProvider;
private final Set<CodeReviewCommit> incoming;
@@ -48,7 +48,7 @@
public RebaseSorter(
CurrentUser caller,
CodeReviewRevWalk rw,
- RevCommit initialTip,
+ Set<RevCommit> uninterestingBranchTips,
Set<RevCommit> alreadyAccepted,
RevFlag canMergeFlag,
Provider<InternalChangeQuery> queryProvider,
@@ -56,7 +56,7 @@
this.caller = caller;
this.rw = rw;
this.canMergeFlag = canMergeFlag;
- this.initialTip = initialTip;
+ this.uninterestingBranchTips = uninterestingBranchTips;
this.alreadyAccepted = alreadyAccepted;
this.queryProvider = queryProvider;
this.incoming = incoming;
@@ -70,8 +70,8 @@
rw.resetRetain(canMergeFlag);
rw.markStart(n);
- if (initialTip != null) {
- rw.markUninteresting(initialTip);
+ for (RevCommit uninterestingBranchTip : uninterestingBranchTips) {
+ rw.markUninteresting(uninterestingBranchTip);
}
CodeReviewCommit c;
diff --git a/java/com/google/gerrit/server/submit/SubmitStrategy.java b/java/com/google/gerrit/server/submit/SubmitStrategy.java
index 6291e6c..3b0ad00 100644
--- a/java/com/google/gerrit/server/submit/SubmitStrategy.java
+++ b/java/com/google/gerrit/server/submit/SubmitStrategy.java
@@ -20,6 +20,7 @@
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets;
+import com.google.gerrit.entities.BooleanProjectConfig;
import com.google.gerrit.entities.BranchNameKey;
import com.google.gerrit.entities.Change;
import com.google.gerrit.entities.SubmissionId;
@@ -212,11 +213,18 @@
projectCache.get(destBranch.project()).orElseThrow(illegalState(destBranch.project()));
this.mergeSorter =
new MergeSorter(caller, rw, alreadyAccepted, canMergeFlag, queryProvider, incoming);
+ Set<RevCommit> uninterestingBranchTips;
+ if (project.is(BooleanProjectConfig.CREATE_NEW_CHANGE_FOR_ALL_NOT_IN_TARGET)) {
+ RevCommit initialTip = mergeTip.getInitialTip();
+ uninterestingBranchTips = initialTip == null ? Set.of() : Set.of(initialTip);
+ } else {
+ uninterestingBranchTips = alreadyAccepted;
+ }
this.rebaseSorter =
new RebaseSorter(
caller,
rw,
- mergeTip.getInitialTip(),
+ uninterestingBranchTips,
alreadyAccepted,
canMergeFlag,
queryProvider,