module StartHer::RetryPolicies

Public Instance Methods

exponential_backoff(opts = {}, *exception_classes) { || ... } click to toggle source

rubocop:disable Metrics/AbcSize,Metrics/MethodLength

# File lib/start_her/retry_policies.rb, line 4
def exponential_backoff(opts = {}, *exception_classes)
  options = { elapsed_time_secs: 600, multiplier: 2 }
  options.merge!(opts)

  time = 0.2
  started_at = Time.now.utc

  begin
    yield
  rescue *exception_classes => ex
    raise ex if (Time.now.utc - started_at) >= options[:elapsed_time_secs]
    sleep(time)

    time *= options[:multiplier]
    if (Time.now.utc - started_at) + time >= options[:elapsed_time_secs]
      time = options[:elapsed_time_secs] - (Time.now.utc - started_at)
    end

    retry
  end
end