Module: CircleciTools::Retryable

Included in:
ApiService, LogUploader, UsageReportService
Defined in:
lib/circleci-tools/retryable.rb

Constant Summary collapse

MAX_RETRIES =
5
BACKOFF_FACTOR =
0.5
MAX_BACKOFF_TIME =
60

Instance Method Summary collapse

Instance Method Details

#retry_loggerObject



25
26
27
# File 'lib/circleci-tools/retryable.rb', line 25

def retry_logger
  @logger ||= Logger.new(STDOUT)
end

#with_retries(max_retries: MAX_RETRIES) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/circleci-tools/retryable.rb', line 7

def with_retries(max_retries: MAX_RETRIES)
  retries = 0
  begin
    yield
  rescue => e
    if retries < max_retries
      retries += 1
      backoff_time = [BACKOFF_FACTOR * (2 ** retries), MAX_BACKOFF_TIME].min.floor
      retry_logger.info "Retry ##{retries} after #{backoff_time} seconds"
      retry_logger.debug "Thread #{Thread.current.object_id}: Error: #{e.message}"
      sleep backoff_time
      retry
    else
      retry_logger.warn "Thread #{Thread.current.object_id}: Error: #{e.message}"
    end
  end
end