diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt index 6acb2d6a00..36b0e31370 100644 --- a/Documentation/config-gerrit.txt +++ b/Documentation/config-gerrit.txt @@ -823,6 +823,15 @@ changes is updated. + Default is 1. +[[changeMerge.interactiveThreadPoolSize]]changeMerge.interactiveThreadPoolSize:: ++ +Maximum size of the thread pool in which the mergeability flag of open +changes is updated, when processing interactive user requests (e.g. +pushes to refs/for/*). Set to 0 or negative to share the pool for +background mergeability checks. ++ +Default is 1. + [[commentlink]] === Section commentlink diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java index 2b0850e2cf..b8649629e4 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java @@ -44,6 +44,7 @@ import com.google.gerrit.server.cache.h2.DefaultCacheFactory; import com.google.gerrit.server.change.ChangeKindCache; import com.google.gerrit.server.change.MergeabilityChecker; import com.google.gerrit.server.change.MergeabilityChecksExecutor; +import com.google.gerrit.server.change.MergeabilityChecksExecutor.Priority; import com.google.gerrit.server.change.PatchSetInserter; import com.google.gerrit.server.config.CanonicalWebUrl; import com.google.gerrit.server.config.CanonicalWebUrlProvider; @@ -290,11 +291,20 @@ public class Reindex extends SiteProgram { @Provides @Singleton - @MergeabilityChecksExecutor + @MergeabilityChecksExecutor(Priority.BACKGROUND) public WorkQueue.Executor createMergeabilityChecksExecutor( WorkQueue queues) { return queues.createQueue(1, "MergeabilityChecks"); } + + @Provides + @Singleton + @MergeabilityChecksExecutor(Priority.INTERACTIVE) + public WorkQueue.Executor createInteractiveMergeabilityChecksExecutor( + @MergeabilityChecksExecutor(Priority.BACKGROUND) + WorkQueue.Executor bg) { + return bg; + } } private int indexAll() throws Exception { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityChecker.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityChecker.java index e6d8b69d2e..0734d12496 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityChecker.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityChecker.java @@ -34,6 +34,7 @@ import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.IdentifiedUser; +import com.google.gerrit.server.change.MergeabilityChecksExecutor.Priority; import com.google.gerrit.server.change.Mergeable.MergeableInfo; import com.google.gerrit.server.git.MetaDataUpdate; import com.google.gerrit.server.git.ProjectConfig; @@ -85,11 +86,13 @@ public class MergeabilityChecker implements GitReferenceUpdatedListener { private List projects; private boolean force; private boolean reindex; + private boolean interactive; private Check() { changes = Lists.newArrayListWithExpectedSize(1); branches = Lists.newArrayListWithExpectedSize(1); projects = Lists.newArrayListWithExpectedSize(1); + interactive = true; } public Check addChange(Change change) { @@ -99,11 +102,13 @@ public class MergeabilityChecker implements GitReferenceUpdatedListener { public Check addBranch(Branch.NameKey branch) { branches.add(branch); + interactive = false; return this; } public Check addProject(Project.NameKey project) { projects.add(project); + interactive = false; return this; } @@ -119,7 +124,12 @@ public class MergeabilityChecker implements GitReferenceUpdatedListener { return this; } + private ListeningExecutorService getExecutor() { + return interactive ? interactiveExecutor : backgroundExecutor; + } + public CheckedFuture runAsync() { + final ListeningExecutorService executor = getExecutor(); ListenableFuture> getChanges; if (branches.isEmpty() && projects.isEmpty()) { getChanges = Futures.immediateFuture(changes); @@ -201,7 +211,8 @@ public class MergeabilityChecker implements GitReferenceUpdatedListener { private final ChangeControl.GenericFactory changeControlFactory; private final Provider mergeable; private final ChangeIndexer indexer; - private final ListeningExecutorService executor; + private final ListeningExecutorService backgroundExecutor; + private final ListeningExecutorService interactiveExecutor; private final MergeabilityCheckQueue mergeabilityCheckQueue; private final MetaDataUpdate.Server metaDataUpdateFactory; @@ -211,7 +222,10 @@ public class MergeabilityChecker implements GitReferenceUpdatedListener { IdentifiedUser.GenericFactory identifiedUserFactory, ChangeControl.GenericFactory changeControlFactory, Provider mergeable, ChangeIndexer indexer, - @MergeabilityChecksExecutor Executor executor, + @MergeabilityChecksExecutor(Priority.BACKGROUND) + Executor backgroundExecutor, + @MergeabilityChecksExecutor(Priority.INTERACTIVE) + Executor interactiveExecutor, MergeabilityCheckQueue mergeabilityCheckQueue, MetaDataUpdate.Server metaDataUpdateFactory) { this.tl = tl; @@ -220,7 +234,10 @@ public class MergeabilityChecker implements GitReferenceUpdatedListener { this.changeControlFactory = changeControlFactory; this.mergeable = mergeable; this.indexer = indexer; - this.executor = MoreExecutors.listeningDecorator(executor); + this.backgroundExecutor = + MoreExecutors.listeningDecorator(backgroundExecutor); + this.interactiveExecutor = + MoreExecutors.listeningDecorator(interactiveExecutor); this.mergeabilityCheckQueue = mergeabilityCheckQueue; this.metaDataUpdateFactory = metaDataUpdateFactory; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityChecksExecutor.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityChecksExecutor.java index 5a26086768..632e6ac053 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityChecksExecutor.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityChecksExecutor.java @@ -28,4 +28,9 @@ import java.lang.annotation.Retention; @Retention(RUNTIME) @BindingAnnotation public @interface MergeabilityChecksExecutor { + public enum Priority { + BACKGROUND, INTERACTIVE; + } + + Priority value(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityChecksExecutorModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityChecksExecutorModule.java index 102cfafe83..96c83d36ab 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityChecksExecutorModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityChecksExecutorModule.java @@ -14,6 +14,7 @@ package com.google.gerrit.server.change; +import com.google.gerrit.server.change.MergeabilityChecksExecutor.Priority; import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.git.WorkQueue; import com.google.inject.AbstractModule; @@ -22,7 +23,6 @@ import com.google.inject.Singleton; import org.eclipse.jgit.lib.Config; - /** Module providing the {@link MergeabilityChecksExecutor}. */ public class MergeabilityChecksExecutorModule extends AbstractModule { @Override @@ -31,11 +31,27 @@ public class MergeabilityChecksExecutorModule extends AbstractModule { @Provides @Singleton - @MergeabilityChecksExecutor + @MergeabilityChecksExecutor(Priority.BACKGROUND) public WorkQueue.Executor createMergeabilityChecksExecutor( @GerritServerConfig Config config, WorkQueue queues) { int poolSize = config.getInt("changeMerge", null, "threadPoolSize", 1); return queues.createQueue(poolSize, "MergeabilityChecks"); } + + @Provides + @Singleton + @MergeabilityChecksExecutor(Priority.INTERACTIVE) + public WorkQueue.Executor createMergeabilityChecksExecutor( + @GerritServerConfig Config config, + WorkQueue queues, + @MergeabilityChecksExecutor(Priority.BACKGROUND) + WorkQueue.Executor backgroundExecutor) { + int poolSize = + config.getInt("changeMerge", null, "interactiveThreadPoolSize", 1); + if (poolSize <= 0) { + return backgroundExecutor; + } + return queues.createQueue(poolSize, "InteractiveMergeabilityChecks"); + } }