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