Class: LazyData::Retries
- Inherits:
-
Object
- Object
- LazyData::Retries
- Defined in:
- lib/lazy_data/retries.rb
Overview
A simple retry manager with optional delay and backoff. It retries until either a configured maximum number of attempts has been reached, or a configurable total time has elapsed since the first failure.
This class is not thread-safe by itself. Access should be protected by an external mutex.
Instance Method Summary collapse
-
#finish! ⇒ self
Cause the retry limit to be reached immediately.
-
#finished? ⇒ true, false
Returns true if the retry limit has been reached.
-
#initialize(max_tries: 1, max_time: nil, initial_delay: 0, max_delay: nil, delay_multiplier: 1, delay_adder: 0, delay_includes_time_elapsed: false) ⇒ Retries
constructor
Create and initialize a retry manager.
-
#next(start_time: nil) ⇒ Numeric?
Advance to the next attempt.
-
#reset! ⇒ self
Reset to the initial attempt.
-
#reset_dup ⇒ Retries
Create a duplicate in the reset state.
Constructor Details
#initialize(max_tries: 1, max_time: nil, initial_delay: 0, max_delay: nil, delay_multiplier: 1, delay_adder: 0, delay_includes_time_elapsed: false) ⇒ Retries
Create and initialize a retry manager.
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/lazy_data/retries.rb', line 49 def initialize(max_tries: 1, max_time: nil, initial_delay: 0, max_delay: nil, delay_multiplier: 1, delay_adder: 0, delay_includes_time_elapsed: false) @max_tries = max_tries&.to_i raise ::ArgumentError, "max_tries must be positive" if @max_tries && !@max_tries.positive? @max_time = max_time raise ::ArgumentError, "max_time must be positive" if @max_time && !@max_time.positive? @initial_delay = initial_delay raise ::ArgumentError, "initial_delay must be nonnegative" if @initial_delay&.negative? @max_delay = max_delay raise ::ArgumentError, "max_delay must be nonnegative" if @max_delay&.negative? @delay_multiplier = delay_multiplier @delay_adder = delay_adder @delay_includes_time_elapsed = delay_includes_time_elapsed reset! end |
Instance Method Details
#finish! ⇒ self
Cause the retry limit to be reached immediately.
109 110 111 112 |
# File 'lib/lazy_data/retries.rb', line 109 def finish! @current_delay = nil self end |
#finished? ⇒ true, false
Returns true if the retry limit has been reached.
90 91 92 |
# File 'lib/lazy_data/retries.rb', line 90 def finished? @current_delay.nil? end |
#next(start_time: nil) ⇒ Numeric?
Advance to the next attempt.
Returns nil if the retry limit has been reached. Otherwise, returns the delay in seconds until the next retry (0 for no delay). Raises an error if the previous call already returned nil.
125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/lazy_data/retries.rb', line 125 def next(start_time: nil) raise "no tries remaining" if finished? cur_time = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC) if @current_delay == :reset setup_first_retry(cur_time) else advance_delay end advance_retry(cur_time) adjusted_delay(start_time, cur_time) end |
#reset! ⇒ self
Reset to the initial attempt.
99 100 101 102 |
# File 'lib/lazy_data/retries.rb', line 99 def reset! @current_delay = :reset self end |
#reset_dup ⇒ Retries
Create a duplicate in the reset state
75 76 77 78 79 80 81 82 83 |
# File 'lib/lazy_data/retries.rb', line 75 def reset_dup Retries.new(max_tries: @max_tries, max_time: @max_time, initial_delay: @initial_delay, max_delay: @max_delay, delay_multiplier: @delay_multiplier, delay_adder: @delay_adder, delay_includes_time_elapsed: @delay_includes_time_elapsed) end |