56 lines
1.5 KiB
Ruby
56 lines
1.5 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Gitlab
|
||
|
module Ci
|
||
|
class Trace
|
||
|
##
|
||
|
# Trace::Backoff class is responsible for calculating a backoff value
|
||
|
# for when to be able to retry archiving a build's trace
|
||
|
#
|
||
|
# Because we're updating `last_archival_attempt_at` timestamp with every
|
||
|
# failed archival attempt, we need to be sure that sum of the backoff values
|
||
|
# for 1..MAX_ATTEMPTS is under 7 days(CHUNK_REDIS_TTL).
|
||
|
#
|
||
|
class Backoff
|
||
|
include Gitlab::Utils::StrongMemoize
|
||
|
|
||
|
MAX_JITTER_VALUE = 4
|
||
|
|
||
|
attr_reader :archival_attempts
|
||
|
|
||
|
def initialize(archival_attempts)
|
||
|
@archival_attempts = archival_attempts
|
||
|
end
|
||
|
|
||
|
def value
|
||
|
(((chunks_ttl / (3.5 * max_attempts)) * archival_attempts) / 1.hour).hours
|
||
|
end
|
||
|
|
||
|
# This formula generates an increasing delay between executions
|
||
|
# 9.6, 19.2, 28.8, 38.4, 48.0 + a random amount of time to
|
||
|
# change the order of execution for the jobs.
|
||
|
# With maximum value for each call to rand(4), this sums up to 6.8 days
|
||
|
# and with minimum values is 6 days.
|
||
|
#
|
||
|
def value_with_jitter
|
||
|
value + jitter
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def jitter
|
||
|
rand(MAX_JITTER_VALUE).hours
|
||
|
end
|
||
|
|
||
|
def chunks_ttl
|
||
|
::Ci::BuildTraceChunks::RedisBase::CHUNK_REDIS_TTL
|
||
|
end
|
||
|
|
||
|
def max_attempts
|
||
|
::Ci::BuildTraceMetadata::MAX_ATTEMPTS
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|