Module: Mihari::Concerns::Retriable

Extended by:
ActiveSupport::Concern
Included in:
Actor
Defined in:
lib/mihari/concerns/retriable.rb

Overview

Retriable concern

Constant Summary collapse

RETRIABLE_ERRORS =
[
  OpenSSL::SSL::SSLError,
  Timeout::Error,
  ::HTTP::ConnectionError,
  ::HTTP::ResponseError,
  ::HTTP::TimeoutError
].freeze
DEFAULT_CONDITION =
lambda do |error|
  return true if RETRIABLE_ERRORS.any? { |klass| error.is_a? klass }

  case error
  when StatusError
    ![401, 404].include?(error.status_code)
  else
    false
  end
end

Instance Method Summary collapse

Instance Method Details

#retry_on_error(times: 3, interval: 5, exponential_backoff: true, condition: DEFAULT_CONDITION) ⇒ Object

Retry on error

Parameters:

  • times (Integer) (defaults to: 3)
  • interval (Integer) (defaults to: 5)
  • exponential_backoff (Boolean) (defaults to: true)
  • condition (Proc) (defaults to: DEFAULT_CONDITION)
  • on (Object)


39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/mihari/concerns/retriable.rb', line 39

def retry_on_error(times: 3, interval: 5, exponential_backoff: true, condition: DEFAULT_CONDITION)
  try = 0
  begin
    try += 1
    yield
  rescue => e
    # Raise error if it's not a retriable error
    raise e unless condition.call(e)

    sleep_seconds = exponential_backoff ? interval * (2**(try - 1)) : interval
    sleep sleep_seconds
    retry if try < times

    # Raise error if retry times exceed a given times
    raise e
  end
end