diff options
Diffstat (limited to 'lib/gitlab/ci/trace/backoff.rb')
-rw-r--r-- | lib/gitlab/ci/trace/backoff.rb | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/lib/gitlab/ci/trace/backoff.rb b/lib/gitlab/ci/trace/backoff.rb new file mode 100644 index 00000000000..c13d88cced1 --- /dev/null +++ b/lib/gitlab/ci/trace/backoff.rb @@ -0,0 +1,55 @@ +# 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 |