diff --git a/src/main/java/jenkins/branch/MultiBranchProject.java b/src/main/java/jenkins/branch/MultiBranchProject.java index 99055ade..30565113 100644 --- a/src/main/java/jenkins/branch/MultiBranchProject.java +++ b/src/main/java/jenkins/branch/MultiBranchProject.java @@ -132,6 +132,13 @@ public abstract class MultiBranchProject
& TopLevelItem, private static /* not final */ boolean FIRE_SCM_SOURCE_BUILDS_AFTER_SAVE = SystemProperties.getBoolean(MultiBranchProject.class.getName() + ".fireSCMSourceBuildsAfterSave", true); + + /** + * Maximum concurrent indexing. + * Can be configured via system property jenkins.branch.MultiBranchProject.maxConcurrentIndexing + */ + private static final int MAX_CONCURRENT_INDEXING = + SystemProperties.getInteger(MultiBranchProject.class.getName() + ".maxConcurrentIndexing", 5); /** * Our logger. @@ -905,6 +912,15 @@ public MultiBranchProjectDescriptor getDescriptor() { public synchronized BranchIndexing
getIndexing() { return (BranchIndexing) getComputation(); } + + /** + * Returns the maximum concurrent indexing limit. + * + * @return the maximum concurrent indexing limit + */ + public static int getMaxConcurrentIndexing() { + return MAX_CONCURRENT_INDEXING; + } /** * {@inheritDoc} @@ -1082,6 +1098,35 @@ public boolean isBuildable() { } return super.isBuildable() && !sources.isEmpty(); } + + /** + * {@inheritDoc} + */ + @Override + public hudson.model.queue.CauseOfBlockage getCauseOfBlockage() { + // Check if we've exceeded the maximum concurrent indexing limit + if (indexingCount() > MAX_CONCURRENT_INDEXING) { + return hudson.model.queue.CauseOfBlockage.fromMessage( + Messages._MultiBranchProject_MaxConcurrentIndexing(MAX_CONCURRENT_INDEXING) + ); + } + return super.getCauseOfBlockage(); + } + + /** + * Count the number of multibranch projects currently indexing. + * + * @return the number of projects currently indexing + */ + private static int indexingCount() { + int count = 0; + for (MultiBranchProject, ?> project : Jenkins.get().getAllItems(MultiBranchProject.class)) { + if (project.getComputation() != null && project.getComputation().isBuilding()) { + count++; + } + } + return count; + } /** * {@inheritDoc} diff --git a/src/main/resources/jenkins/branch/Messages.properties b/src/main/resources/jenkins/branch/Messages.properties index 2aee3dd2..944e14a8 100644 --- a/src/main/resources/jenkins/branch/Messages.properties +++ b/src/main/resources/jenkins/branch/Messages.properties @@ -48,6 +48,7 @@ RateLimitBranchProperty.duration.month=Month RateLimitBranchProperty.duration.year=Year MultiBranchProject.BranchIndexing.displayName=Scan {0} MultiBranchProject.CopyItemVeto.reason=Copying branch projects outside of their multi-branch container is not supported. +MultiBranchProject.MaxConcurrentIndexing=Already indexing maximum number of projects (limit: {0}) MultiBranchProjectDisplayNamingTrait.DisplayName=Job display name with fallback to name MultiBranchProjectDisplayNamingTrait.Raw=Simple name only MultiBranchProjectDisplayNamingTrait.RawAndDisplayName=Name and, if available, display name