diff options
Diffstat (limited to 'java/com/google/gerrit/server/submit/LocalMergeSuperSetComputation.java')
-rw-r--r-- | java/com/google/gerrit/server/submit/LocalMergeSuperSetComputation.java | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/java/com/google/gerrit/server/submit/LocalMergeSuperSetComputation.java b/java/com/google/gerrit/server/submit/LocalMergeSuperSetComputation.java index 9efb976a65..60b0c5b01a 100644 --- a/java/com/google/gerrit/server/submit/LocalMergeSuperSetComputation.java +++ b/java/com/google/gerrit/server/submit/LocalMergeSuperSetComputation.java @@ -30,6 +30,7 @@ import com.google.gerrit.reviewdb.client.Branch; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.CurrentUser; +import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.permissions.ChangePermission; import com.google.gerrit.server.permissions.PermissionBackend; import com.google.gerrit.server.permissions.PermissionBackendException; @@ -53,6 +54,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; +import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.revwalk.RevCommit; @@ -65,6 +67,8 @@ import org.eclipse.jgit.revwalk.RevSort; public class LocalMergeSuperSetComputation implements MergeSuperSetComputation { private static final FluentLogger logger = FluentLogger.forEnclosingClass(); + public static final int MAX_SUBMITTABLE_CHANGES_AT_ONCE_DEFAULT = 1024; + public static class Module extends AbstractModule { @Override protected void configure() { @@ -90,17 +94,22 @@ public class LocalMergeSuperSetComputation implements MergeSuperSetComputation { private final Map<QueryKey, List<ChangeData>> queryCache; private final Map<Branch.NameKey, Optional<RevCommit>> heads; private final ProjectCache projectCache; + private final int maxSubmittableChangesAtOnce; @Inject LocalMergeSuperSetComputation( PermissionBackend permissionBackend, Provider<InternalChangeQuery> queryProvider, - ProjectCache projectCache) { + ProjectCache projectCache, + @GerritServerConfig Config gerritConfig) { this.projectCache = projectCache; this.permissionBackend = permissionBackend; this.queryProvider = queryProvider; this.queryCache = new HashMap<>(); this.heads = new HashMap<>(); + this.maxSubmittableChangesAtOnce = + gerritConfig.getInt( + "change", "maxSubmittableAtOnce", MAX_SUBMITTABLE_CHANGES_AT_ONCE_DEFAULT); } @Override @@ -146,10 +155,12 @@ public class LocalMergeSuperSetComputation implements MergeSuperSetComputation { } Set<String> visibleHashes = - walkChangesByHashes(visibleCommits, Collections.emptySet(), or, b); + walkChangesByHashes( + visibleCommits, Collections.emptySet(), or, b, maxSubmittableChangesAtOnce); Iterables.addAll(visibleChanges, byCommitsOnBranchNotMerged(or, db, b, visibleHashes)); - Set<String> nonVisibleHashes = walkChangesByHashes(nonVisibleCommits, visibleHashes, or, b); + Set<String> nonVisibleHashes = + walkChangesByHashes(nonVisibleCommits, visibleHashes, or, b, maxSubmittableChangesAtOnce); Iterables.addAll(nonVisibleChanges, byCommitsOnBranchNotMerged(or, db, b, nonVisibleHashes)); } @@ -229,7 +240,11 @@ public class LocalMergeSuperSetComputation implements MergeSuperSetComputation { } private Set<String> walkChangesByHashes( - Collection<RevCommit> sourceCommits, Set<String> ignoreHashes, OpenRepo or, Branch.NameKey b) + Collection<RevCommit> sourceCommits, + Set<String> ignoreHashes, + OpenRepo or, + Branch.NameKey b, + int limit) throws IOException { Set<String> destHashes = new HashSet<>(); or.rw.reset(); @@ -239,7 +254,11 @@ public class LocalMergeSuperSetComputation implements MergeSuperSetComputation { if (ignoreHashes.contains(name)) { continue; } - destHashes.add(name); + if (destHashes.size() < limit) { + destHashes.add(name); + } else { + break; + } or.rw.markStart(c); } for (RevCommit c : or.rw) { @@ -247,7 +266,11 @@ public class LocalMergeSuperSetComputation implements MergeSuperSetComputation { if (ignoreHashes.contains(name)) { continue; } - destHashes.add(name); + if (destHashes.size() < limit) { + destHashes.add(name); + } else { + break; + } } return destHashes; |