mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Use individual execution counters when calculating retry delay
Individual execution counters were introduced in #34352. However `#determine_delay` which is used to calculate retry delay still uses the global counter. This commit fixes it.
This commit is contained in:
parent
ef0c5fe0d9
commit
3a7fa10603
3 changed files with 26 additions and 2 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
* Use individual execution counters when calculating retry delay.
|
||||||
|
|
||||||
|
*Patrik Bóna*
|
||||||
|
|
||||||
* Make job argument assertions with `Time`, `ActiveSupport::TimeWithZone`, and `DateTime` work by dropping microseconds. Microsecond precision is lost during serialization.
|
* Make job argument assertions with `Time`, `ActiveSupport::TimeWithZone`, and `DateTime` work by dropping microseconds. Microsecond precision is lost during serialization.
|
||||||
|
|
||||||
*Gannon McGibbon*
|
*Gannon McGibbon*
|
||||||
|
|
|
@ -54,7 +54,7 @@ module ActiveJob
|
||||||
self.exception_executions[exceptions.to_s] = (exception_executions[exceptions.to_s] || 0) + 1
|
self.exception_executions[exceptions.to_s] = (exception_executions[exceptions.to_s] || 0) + 1
|
||||||
|
|
||||||
if exception_executions[exceptions.to_s] < attempts
|
if exception_executions[exceptions.to_s] < attempts
|
||||||
retry_job wait: determine_delay(wait), queue: queue, priority: priority, error: error
|
retry_job wait: determine_delay(seconds_or_duration_or_algorithm: wait, executions: exception_executions[exceptions.to_s]), queue: queue, priority: priority, error: error
|
||||||
else
|
else
|
||||||
if block_given?
|
if block_given?
|
||||||
instrument :retry_stopped, error: error do
|
instrument :retry_stopped, error: error do
|
||||||
|
@ -123,7 +123,7 @@ module ActiveJob
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
def determine_delay(seconds_or_duration_or_algorithm)
|
def determine_delay(seconds_or_duration_or_algorithm:, executions:)
|
||||||
case seconds_or_duration_or_algorithm
|
case seconds_or_duration_or_algorithm
|
||||||
when :exponentially_longer
|
when :exponentially_longer
|
||||||
(executions**4) + 2
|
(executions**4) + 2
|
||||||
|
|
|
@ -140,6 +140,26 @@ class ExceptionsTest < ActiveSupport::TestCase
|
||||||
], JobBuffer.values
|
], JobBuffer.values
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "use individual execution timers when calculating retry delay" do
|
||||||
|
travel_to Time.now
|
||||||
|
|
||||||
|
exceptions_to_raise = %w(ExponentialWaitTenAttemptsError CustomWaitTenAttemptsError ExponentialWaitTenAttemptsError CustomWaitTenAttemptsError)
|
||||||
|
|
||||||
|
RetryJob.perform_later exceptions_to_raise, 5, :log_scheduled_at
|
||||||
|
|
||||||
|
assert_equal [
|
||||||
|
"Raised ExponentialWaitTenAttemptsError for the 1st time",
|
||||||
|
"Next execution scheduled at #{(Time.now + 3.seconds).to_f}",
|
||||||
|
"Raised CustomWaitTenAttemptsError for the 2nd time",
|
||||||
|
"Next execution scheduled at #{(Time.now + 2.seconds).to_f}",
|
||||||
|
"Raised ExponentialWaitTenAttemptsError for the 3rd time",
|
||||||
|
"Next execution scheduled at #{(Time.now + 18.seconds).to_f}",
|
||||||
|
"Raised CustomWaitTenAttemptsError for the 4th time",
|
||||||
|
"Next execution scheduled at #{(Time.now + 4.seconds).to_f}",
|
||||||
|
"Successfully completed job"
|
||||||
|
], JobBuffer.values
|
||||||
|
end
|
||||||
|
|
||||||
test "successfully retry job throwing one of two retryable exceptions" do
|
test "successfully retry job throwing one of two retryable exceptions" do
|
||||||
RetryJob.perform_later "SecondRetryableErrorOfTwo", 3
|
RetryJob.perform_later "SecondRetryableErrorOfTwo", 3
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue