diff options
Diffstat (limited to 'app/models/ci/build_trace_metadata.rb')
-rw-r--r-- | app/models/ci/build_trace_metadata.rb | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/app/models/ci/build_trace_metadata.rb b/app/models/ci/build_trace_metadata.rb index 05bdb3d8b7b..901b84ceec6 100644 --- a/app/models/ci/build_trace_metadata.rb +++ b/app/models/ci/build_trace_metadata.rb @@ -2,6 +2,7 @@ module Ci class BuildTraceMetadata < Ci::ApplicationRecord + MAX_ATTEMPTS = 5 self.table_name = 'ci_build_trace_metadata' self.primary_key = :build_id @@ -9,5 +10,49 @@ module Ci belongs_to :trace_artifact, class_name: 'Ci::JobArtifact' validates :build, presence: true + validates :archival_attempts, presence: true + + def self.find_or_upsert_for!(build_id) + record = find_by(build_id: build_id) + return record if record + + upsert({ build_id: build_id }, unique_by: :build_id) + find_by!(build_id: build_id) + end + + # The job is retried around 5 times during the 7 days retention period for + # trace chunks as defined in `Ci::BuildTraceChunks::RedisBase::CHUNK_REDIS_TTL` + def can_attempt_archival_now? + return false unless archival_attempts_available? + return true unless last_archival_attempt_at + + last_archival_attempt_at + backoff < Time.current + end + + def archival_attempts_available? + archival_attempts <= MAX_ATTEMPTS + end + + def increment_archival_attempts! + increment!(:archival_attempts, touch: :last_archival_attempt_at) + end + + def track_archival!(trace_artifact_id) + update!(trace_artifact_id: trace_artifact_id, archived_at: Time.current) + end + + def archival_attempts_message + if archival_attempts_available? + 'The job can not be archived right now.' + else + 'The job is out of archival attempts.' + end + end + + private + + def backoff + ::Gitlab::Ci::Trace::Backoff.new(archival_attempts).value_with_jitter + end end end |