From b43e0682f5b74a5df323ce4a048e52cb6e89876a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20=C5=A0ar=C4=8Devi=C4=87?= Date: Wed, 1 Jul 2015 11:00:57 +0000 Subject: [PATCH] Maximum interval option for Retry middleware --- lib/faraday/request/retry.rb | 10 ++++++++-- test/middleware/retry_test.rb | 8 ++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/faraday/request/retry.rb b/lib/faraday/request/retry.rb index cf3169e9..b05c5181 100644 --- a/lib/faraday/request/retry.rb +++ b/lib/faraday/request/retry.rb @@ -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 diff --git a/test/middleware/retry_test.rb b/test/middleware/retry_test.rb index 71ed96c7..42b5fc6a 100644 --- a/test/middleware/retry_test.rb +++ b/test/middleware/retry_test.rb @@ -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)