Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/ci/pipeline/chain/limit/active_jobs.rb')
-rw-r--r--lib/gitlab/ci/pipeline/chain/limit/active_jobs.rb63
1 files changed, 63 insertions, 0 deletions
diff --git a/lib/gitlab/ci/pipeline/chain/limit/active_jobs.rb b/lib/gitlab/ci/pipeline/chain/limit/active_jobs.rb
new file mode 100644
index 00000000000..8b26416edf7
--- /dev/null
+++ b/lib/gitlab/ci/pipeline/chain/limit/active_jobs.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Pipeline
+ module Chain
+ module Limit
+ class ActiveJobs < Chain::Base
+ include ::Gitlab::Utils::StrongMemoize
+ include ::Gitlab::Ci::Pipeline::Chain::Helpers
+
+ LIMIT_NAME = :ci_active_jobs
+ MESSAGE = "Project exceeded the allowed number of jobs in active pipelines. Retry later."
+
+ def perform!
+ return unless limits.exceeded?(LIMIT_NAME, count_jobs_in_alive_pipelines)
+
+ error(MESSAGE, drop_reason: :job_activity_limit_exceeded)
+
+ Gitlab::AppLogger.info(
+ class: self.class.name,
+ message: MESSAGE,
+ project_id: project.id,
+ plan: project.actual_plan_name)
+ end
+
+ def break?
+ pipeline.errors.any?
+ end
+
+ private
+
+ def namespace
+ strong_memoize(:namespace) do
+ project.namespace
+ end
+ end
+
+ def limits
+ strong_memoize(:limits) do
+ namespace.actual_limits
+ end
+ end
+
+ def count_jobs_in_alive_pipelines
+ strong_memoize(:count_jobs_in_alive_pipelines) do
+ count_persisted_jobs_in_all_alive_pipelines + count_current_pipeline_jobs
+ end
+ end
+
+ def count_current_pipeline_jobs
+ command.pipeline_seed.size
+ end
+
+ def count_persisted_jobs_in_all_alive_pipelines
+ project.all_pipelines.jobs_count_in_alive_pipelines
+ end
+ end
+ end
+ end
+ end
+ end
+end