mirror of
https://github.com/lostisland/faraday.git
synced 2025-10-15 00:01:36 -04:00
Maximum interval option for Retry middleware
This commit is contained in:
parent
1316f4cbd9
commit
b43e0682f5
@ -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
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user