lib/asir/retry_behavior.rb in asir-1.2.8 vs lib/asir/retry_behavior.rb in asir-1.2.9
- old
+ new
@@ -1,5 +1,8 @@
+require 'asir/error'
+require 'asir/adaptive_value'
+
module ASIR
# !SLIDE
# Generic retry behavior
module RetryBehavior
# Maximum trys.
@@ -10,41 +13,46 @@
attr_accessor :try_sleep_increment
# Maxinum amount of seconds to sleep between each try.
attr_accessor :try_sleep_max
# Yields:
- # :try, n_try
- # :rescue, exc
- # :retry, exc
- # :failed, nil
+ # :try, n_try - for each attempt.
+ # :rescue, exc - for any rescued exception.
+ # :retry, exc - before each retry.
+ # :failed, last_exc - when too many retrys occurred.
def with_retry
n_try = 0
- sleep_secs = try_sleep
+ @try_sleep_value ||= ::ASIR::AdaptiveValue.new
+ @try_sleep_value.init = try_sleep
+ @try_sleep_value.reset!
result = done = last_exception = nil
begin
n_try += 1
result = yield :try, n_try
done = true
rescue *Error::Unrecoverable.modules
raise
- rescue *Error::Unforwardable.unforwardable
+ rescue *Error::Unforwardable.modules
raise
rescue ::Exception => exc
- last_exception = exc
+ last_exc = exc
yield :rescue, exc
if ! try_max || try_max > n_try
yield :retry, exc
- if sleep_secs
+ if try_sleep
+ sleep_secs = @try_sleep_value.value
sleep sleep_secs if sleep_secs > 0
- sleep_secs += try_sleep_increment if try_sleep_increment
- sleep_secs = try_sleep_max if try_sleep_max && sleep_secs > try_sleep_max
+ @try_sleep_value.init = try_sleep
+ @try_sleep_value.add = try_sleep_increment
+ @try_sleep_value.max = try_sleep_max
+ @try_sleep_value.adapt!
end
retry
end
end
unless done
- unless yield :failed, last_exception
- exc = last_exception
+ unless yield :failed, last_exc
+ exc = last_exc
raise RetryError, "Retry failed: #{exc.inspect}", exc.backtrace
end
end
result
end