未验证 提交 19c5bd38 编写于 作者: E Eileen M. Uchitelle 提交者: GitHub

Merge pull request #37923 from cpruitt/add-config-for-activejob-retry-jitter

Add ActiveJob::Base.default_retry_jitter config option to specify jitter value
......@@ -7,6 +7,11 @@ module ActiveJob
module Exceptions
extend ActiveSupport::Concern
included do
class_attribute :default_retry_jitter, instance_accessor: false, instance_predicate: false
self.default_retry_jitter = 0.15
end
module ClassMethods
# Catch the exception and reschedule job for re-execution after so many seconds, for a specific number of attempts.
# If the exception keeps getting raised beyond the specified number of attempts, the exception is allowed to
......@@ -49,7 +54,7 @@ module ClassMethods
# # Might raise Net::OpenTimeout or Timeout::Error when the remote service is down
# end
# end
def retry_on(*exceptions, wait: 3.seconds, attempts: 5, queue: nil, priority: nil, jitter: 0.15)
def retry_on(*exceptions, wait: 3.seconds, attempts: 5, queue: nil, priority: nil, jitter: nil)
rescue_from(*exceptions) do |error|
executions = executions_for(exceptions)
if executions < attempts
......@@ -122,7 +127,8 @@ def retry_job(options = {})
end
private
def determine_delay(seconds_or_duration_or_algorithm:, executions:, jitter:)
def determine_delay(seconds_or_duration_or_algorithm:, executions:, jitter: nil)
jitter ||= self.class.default_retry_jitter
case seconds_or_duration_or_algorithm
when :exponentially_longer
((executions**4) + (Kernel.rand((executions**4) * jitter))) + 2
......
......@@ -129,6 +129,31 @@ class ExceptionsTest < ActiveSupport::TestCase
end
end
test "retry jitter uses value from ActiveJob::Base.default_retry_jitter by default" do
old_jitter = ActiveJob::Base.default_retry_jitter
ActiveJob::Base.default_retry_jitter = 4.0
travel_to Time.now
Kernel.stub(:rand, ->(arg) { arg }) do
RetryJob.perform_later "ExponentialWaitTenAttemptsError", 5, :log_scheduled_at
assert_equal [
"Raised ExponentialWaitTenAttemptsError for the 1st time",
"Next execution scheduled at #{(Time.now + 7.seconds).to_f}",
"Raised ExponentialWaitTenAttemptsError for the 2nd time",
"Next execution scheduled at #{(Time.now + 82.seconds).to_f}",
"Raised ExponentialWaitTenAttemptsError for the 3rd time",
"Next execution scheduled at #{(Time.now + 407.seconds).to_f}",
"Raised ExponentialWaitTenAttemptsError for the 4th time",
"Next execution scheduled at #{(Time.now + 1282.seconds).to_f}",
"Successfully completed job"
], JobBuffer.values
end
ensure
ActiveJob::Base.default_retry_jitter = old_jitter
end
test "custom wait retrying job" do
travel_to Time.now
......
......@@ -807,6 +807,8 @@ There are a few configuration options available in Active Support:
* `config.active_job.log_arguments` controls if the arguments of a job are logged. Defaults to `true`.
* `config.active_job.default_retry_jitter` controls the amount of "jitter" (random variation) applied to the delay time calculated when retrying failed jobs. Defaults to `0.15`.
### Configuring Action Cable
* `config.action_cable.url` accepts a string for the URL for where
......
......@@ -156,6 +156,10 @@ def load_defaults(target_version)
when "6.1"
load_defaults "6.0"
if respond_to?(:active_job)
active_job.default_retry_jitter = 0.15
end
if respond_to?(:active_record)
active_record.has_many_inversing = true
end
......
......@@ -2262,6 +2262,20 @@ class ::DummySerializer < ActiveJob::Serializers::ObjectSerializer; end
end
end
test "ActiveJob::Base.default_retry_jitter is 0.15 by default" do
app "development"
assert_equal 0.15, ActiveJob::Base.default_retry_jitter
end
test "ActiveJob::Base.default_retry_jitter can be set by config" do
app "development"
Rails.application.config.active_job.default_retry_jitter = 0.22
assert_equal 0.22, ActiveJob::Base.default_retry_jitter
end
test "ActiveJob::Base.return_false_on_aborted_enqueue is true by default" do
app "development"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册