Maximum interval option for Retry middleware

This commit is contained in:
Igor Šarčević 2015-07-01 11:00:57 +00:00
parent 1316f4cbd9
commit b43e0682f5
2 changed files with 16 additions and 2 deletions

View File

@ -22,8 +22,8 @@ module Faraday
IDEMPOTENT_METHODS = [:delete, :get, :head, :options, :put]
class Options < Faraday::Options.new(:max, :interval, :interval_randomness, :backoff_factor,
:exceptions, :methods, :retry_if)
class Options < Faraday::Options.new(:max, :interval, :max_interval, :interval_randomness,
:backoff_factor, :exceptions, :methods, :retry_if)
DEFAULT_CHECK = lambda { |env,exception| false }
def self.from(value)
@ -42,6 +42,10 @@ module Faraday
(self[:interval] ||= 0).to_f
end
def max_interval
(self[:max_interval] ||= Float::MAX).to_f
end
def interval_randomness
(self[:interval_randomness] ||= 0).to_i
end
@ -73,6 +77,7 @@ module Faraday
# interval_randomness - The maximum random interval amount expressed
# as a float between 0 and 1 to use in addition to the
# interval. (default: 0)
# max_interval - An upper limit for the interval (default: Float::MAX)
# backoff_factor - The amount to multiple each successive retry's
# interval amount by in order to provide backoff
# (default: 1)
@ -98,6 +103,7 @@ module Faraday
def sleep_amount(retries)
retry_index = @options.max - retries
current_interval = @options.interval * (@options.backoff_factor ** retry_index)
current_interval = [current_interval, @options.max_interval].min
random_interval = rand * @options.interval_randomness.to_f * @options.interval
current_interval + random_interval
end

View File

@ -100,6 +100,14 @@ module Middleware
assert_equal middleware.sleep_amount(3), 0.4
end
def test_exponential_backoff_with_max_interval
middleware = Faraday::Request::Retry.new(nil, :max => 5, :interval => 1, :max_interval => 3, :backoff_factor => 2)
assert_equal middleware.sleep_amount(5), 1
assert_equal middleware.sleep_amount(4), 2
assert_equal middleware.sleep_amount(3), 3
assert_equal middleware.sleep_amount(2), 3
end
def test_random_additional_interval_amount
middleware = Faraday::Request::Retry.new(nil, :max => 2, :interval => 0.1, :interval_randomness => 1.0)
sleep_amount = middleware.sleep_amount(2)