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 'app/models/ci/build_metadata.rb')
-rw-r--r--app/models/ci/build_metadata.rb46
1 files changed, 40 insertions, 6 deletions
diff --git a/app/models/ci/build_metadata.rb b/app/models/ci/build_metadata.rb
index f281cbd1d6f..89cdd8c64f8 100644
--- a/app/models/ci/build_metadata.rb
+++ b/app/models/ci/build_metadata.rb
@@ -4,9 +4,12 @@ module Ci
# The purpose of this class is to store Build related data that can be disposed.
# Data that should be persisted forever, should be stored with Ci::Build model.
class BuildMetadata < ApplicationRecord
+ BuildTimeout = Struct.new(:value, :source)
+
extend Gitlab::Ci::Model
include Presentable
include ChronicDurationAttribute
+ include Gitlab::Utils::StrongMemoize
self.table_name = 'ci_builds_metadata'
@@ -25,17 +28,16 @@ module Ci
enum timeout_source: {
unknown_timeout_source: 1,
project_timeout_source: 2,
- runner_timeout_source: 3
+ runner_timeout_source: 3,
+ job_timeout_source: 4
}
def update_timeout_state
- return unless build.runner.present?
+ timeout = timeout_with_highest_precedence
- project_timeout = project&.build_timeout
- timeout = [project_timeout, build.runner.maximum_timeout].compact.min
- timeout_source = timeout < project_timeout ? :runner_timeout_source : :project_timeout_source
+ return unless timeout
- update(timeout: timeout, timeout_source: timeout_source)
+ update(timeout: timeout.value, timeout_source: timeout.source)
end
private
@@ -43,5 +45,37 @@ module Ci
def set_build_project
self.project_id ||= self.build.project_id
end
+
+ def timeout_with_highest_precedence
+ [(job_timeout || project_timeout), runner_timeout].compact.min_by { |timeout| timeout.value }
+ end
+
+ def project_timeout
+ strong_memoize(:project_timeout) do
+ BuildTimeout.new(project&.build_timeout, :project_timeout_source)
+ end
+ end
+
+ def job_timeout
+ return unless build.options
+
+ strong_memoize(:job_timeout) do
+ if timeout_from_options = build.options[:job_timeout]
+ BuildTimeout.new(timeout_from_options, :job_timeout_source)
+ end
+ end
+ end
+
+ def runner_timeout
+ return unless runner_timeout_set?
+
+ strong_memoize(:runner_timeout) do
+ BuildTimeout.new(build.runner.maximum_timeout, :runner_timeout_source)
+ end
+ end
+
+ def runner_timeout_set?
+ build.runner&.maximum_timeout.to_i > 0
+ end
end
end