summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNasser Grainawi <nasser.grainawi@linaro.org>2023-11-10 17:01:14 -0700
committerNasser Grainawi <nasser.grainawi@linaro.org>2023-11-10 17:18:25 -0700
commit22ce9df0793d2be6eccf3a19cbda4bb33ae030d6 (patch)
tree66689f752d6da6030812e7d7f4ad4b19a034d679
parentf85560a5d385c8abfa4df740f31485288b67cdce (diff)
MergeUtil: Create an optimized canFastForwardOrMerge
This method de-duplicates the potentially expensive hasMissingDependencies() call for callers that needed to do `canFastForward() || canMerge()`. Change-Id: If4b5a1244b79d84103af8939e621b503ba587cc3 Release-Notes: Improved performance for conflicts: operator and other mergability checks when submit type is Merge-If-Necessary
-rw-r--r--java/com/google/gerrit/server/git/MergeUtil.java25
-rw-r--r--java/com/google/gerrit/server/submit/MergeIfNecessary.java4
2 files changed, 25 insertions, 4 deletions
diff --git a/java/com/google/gerrit/server/git/MergeUtil.java b/java/com/google/gerrit/server/git/MergeUtil.java
index c1333cb744..fac05d28ec 100644
--- a/java/com/google/gerrit/server/git/MergeUtil.java
+++ b/java/com/google/gerrit/server/git/MergeUtil.java
@@ -679,6 +679,10 @@ public class MergeUtil {
return false;
}
+ return canMerge(mergeTip, repo, toMerge);
+ }
+
+ private boolean canMerge(CodeReviewCommit mergeTip, Repository repo, CodeReviewCommit toMerge) {
try (ObjectInserter ins = new InMemoryInserter(repo)) {
return newThreeWayMerger(ins, repo.getConfig()).merge(mergeTip, toMerge);
} catch (LargeObjectException e) {
@@ -700,6 +704,11 @@ public class MergeUtil {
return false;
}
+ return canFastForward(mergeTip, rw, toMerge);
+ }
+
+ private boolean canFastForward(
+ CodeReviewCommit mergeTip, CodeReviewRevWalk rw, CodeReviewCommit toMerge) {
try {
return mergeTip == null
|| rw.isMergedInto(mergeTip, toMerge)
@@ -709,6 +718,19 @@ public class MergeUtil {
}
}
+ public boolean canFastForwardOrMerge(
+ MergeSorter mergeSorter,
+ CodeReviewCommit mergeTip,
+ CodeReviewRevWalk rw,
+ Repository repo,
+ CodeReviewCommit toMerge) {
+ if (hasMissingDependencies(mergeSorter, toMerge)) {
+ return false;
+ }
+
+ return canFastForward(mergeTip, rw, toMerge) || canMerge(mergeTip, repo, toMerge);
+ }
+
public boolean canCherryPick(
MergeSorter mergeSorter,
Repository repo,
@@ -751,8 +773,7 @@ public class MergeUtil {
// by an equivalent merge with a different first parent. So
// instead behave as though MERGE_IF_NECESSARY was configured.
//
- return canFastForward(mergeSorter, mergeTip, rw, toMerge)
- || canMerge(mergeSorter, repo, mergeTip, toMerge);
+ return canFastForwardOrMerge(mergeSorter, mergeTip, rw, repo, toMerge);
}
public boolean hasMissingDependencies(MergeSorter mergeSorter, CodeReviewCommit toMerge) {
diff --git a/java/com/google/gerrit/server/submit/MergeIfNecessary.java b/java/com/google/gerrit/server/submit/MergeIfNecessary.java
index 30f16616cf..c6877d26ac 100644
--- a/java/com/google/gerrit/server/submit/MergeIfNecessary.java
+++ b/java/com/google/gerrit/server/submit/MergeIfNecessary.java
@@ -48,7 +48,7 @@ public class MergeIfNecessary extends SubmitStrategy {
static boolean dryRun(
SubmitDryRun.Arguments args, CodeReviewCommit mergeTip, CodeReviewCommit toMerge) {
- return args.mergeUtil.canFastForward(args.mergeSorter, mergeTip, args.rw, toMerge)
- || args.mergeUtil.canMerge(args.mergeSorter, args.repo, mergeTip, toMerge);
+ return args.mergeUtil.canFastForwardOrMerge(
+ args.mergeSorter, mergeTip, args.rw, args.repo, toMerge);
}
}