activejob-retry 0.0.1 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +22 -0
- data/.travis.yml +20 -5
- data/CHANGELOG.md +3 -0
- data/Gemfile +9 -6
- data/Gemfile.lock +63 -51
- data/LICENSE +1 -1
- data/README.md +57 -25
- data/Rakefile +14 -13
- data/activejob-retry.gemspec +9 -12
- data/lib/active_job/retry.rb +69 -90
- data/lib/active_job/retry/constant_backoff_strategy.rb +50 -0
- data/lib/active_job/retry/constant_options_validator.rb +76 -0
- data/lib/active_job/retry/deserialize_monkey_patch.rb +17 -12
- data/lib/active_job/retry/errors.rb +6 -0
- data/lib/active_job/retry/variable_backoff_strategy.rb +34 -0
- data/lib/active_job/retry/variable_options_validator.rb +56 -0
- data/lib/active_job/retry/version.rb +1 -1
- data/spec/retry/constant_backoff_strategy_spec.rb +115 -0
- data/spec/retry/constant_options_validator_spec.rb +81 -0
- data/spec/retry/variable_backoff_strategy_spec.rb +121 -0
- data/spec/retry/variable_options_validator_spec.rb +83 -0
- data/spec/retry_spec.rb +114 -170
- data/spec/spec_helper.rb +3 -2
- data/test/adapters/backburner.rb +3 -0
- data/test/adapters/delayed_job.rb +7 -0
- data/test/adapters/inline.rb +1 -0
- data/test/adapters/qu.rb +3 -0
- data/test/adapters/que.rb +4 -0
- data/test/adapters/queue_classic.rb +2 -0
- data/test/adapters/resque.rb +2 -0
- data/test/adapters/sidekiq.rb +2 -0
- data/test/adapters/sneakers.rb +2 -0
- data/test/adapters/sucker_punch.rb +2 -0
- data/test/cases/adapter_test.rb +8 -0
- data/test/cases/argument_serialization_test.rb +84 -0
- data/test/cases/callbacks_test.rb +23 -0
- data/test/cases/job_serialization_test.rb +15 -0
- data/test/cases/logging_test.rb +114 -0
- data/test/cases/queue_naming_test.rb +102 -0
- data/test/cases/queuing_test.rb +44 -0
- data/test/cases/rescue_test.rb +35 -0
- data/test/cases/test_case_test.rb +14 -0
- data/test/cases/test_helper_test.rb +226 -0
- data/test/helper.rb +21 -0
- data/test/integration/queuing_test.rb +46 -0
- data/test/jobs/callback_job.rb +31 -0
- data/test/jobs/gid_job.rb +10 -0
- data/test/jobs/hello_job.rb +9 -0
- data/test/jobs/logging_job.rb +12 -0
- data/test/jobs/nested_job.rb +12 -0
- data/test/jobs/rescue_job.rb +31 -0
- data/test/models/person.rb +20 -0
- data/test/support/backburner/inline.rb +8 -0
- data/test/support/delayed_job/delayed/backend/test.rb +111 -0
- data/test/support/delayed_job/delayed/serialization/test.rb +0 -0
- data/test/support/integration/adapters/backburner.rb +38 -0
- data/test/support/integration/adapters/delayed_job.rb +20 -0
- data/test/support/integration/adapters/que.rb +37 -0
- data/test/support/integration/adapters/resque.rb +49 -0
- data/test/support/integration/adapters/sidekiq.rb +58 -0
- data/test/support/integration/dummy_app_template.rb +28 -0
- data/test/support/integration/helper.rb +30 -0
- data/test/support/integration/jobs_manager.rb +27 -0
- data/test/support/integration/test_case_helpers.rb +48 -0
- data/test/support/job_buffer.rb +19 -0
- data/test/support/que/inline.rb +9 -0
- metadata +60 -12
- data/lib/active_job-retry.rb +0 -14
- data/lib/active_job/retry/exponential_backoff.rb +0 -92
- data/lib/active_job/retry/exponential_options_validator.rb +0 -57
- data/lib/active_job/retry/invalid_configuration_error.rb +0 -6
- data/lib/active_job/retry/options_validator.rb +0 -84
@@ -1,57 +0,0 @@
|
|
1
|
-
module ActiveJob
|
2
|
-
module Retry
|
3
|
-
class ExponentialOptionsValidator
|
4
|
-
DELAY_MULTIPLIER_KEYS = %i(min_delay_multiplier max_delay_multiplier).freeze
|
5
|
-
|
6
|
-
def initialize(options)
|
7
|
-
@options = options
|
8
|
-
@retry_limit = options[:limit] || options.fetch(:strategy, []).length
|
9
|
-
end
|
10
|
-
|
11
|
-
def validate!
|
12
|
-
validate_strategy!
|
13
|
-
validate_delay_multipliers!
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
attr_reader :options, :retry_limit
|
19
|
-
|
20
|
-
def validate_strategy!
|
21
|
-
unless options[:strategy]
|
22
|
-
raise InvalidConfigurationError, "You must define a backoff strategy"
|
23
|
-
end
|
24
|
-
|
25
|
-
return unless retry_limit
|
26
|
-
|
27
|
-
unless retry_limit > 0
|
28
|
-
raise InvalidConfigurationError,
|
29
|
-
"Exponential backoff cannot be used with infinite or no retries"
|
30
|
-
end
|
31
|
-
|
32
|
-
return if options[:strategy].length == retry_limit
|
33
|
-
|
34
|
-
raise InvalidConfigurationError, "Strategy must have a delay for each retry"
|
35
|
-
end
|
36
|
-
|
37
|
-
def validate_delay_multipliers!
|
38
|
-
unless both_or_neither_multiplier_supplied?
|
39
|
-
raise InvalidConfigurationError,
|
40
|
-
"If one of min/max_delay_multiplier is supplied, both are required"
|
41
|
-
end
|
42
|
-
|
43
|
-
return unless options[:min_delay_multiplier] && options[:max_delay_multiplier]
|
44
|
-
|
45
|
-
return if options[:min_delay_multiplier] <= options[:max_delay_multiplier]
|
46
|
-
|
47
|
-
raise InvalidConfigurationError,
|
48
|
-
"min_delay_multiplier must be less than or equal to max_delay_multiplier"
|
49
|
-
end
|
50
|
-
|
51
|
-
def both_or_neither_multiplier_supplied?
|
52
|
-
supplied = DELAY_MULTIPLIER_KEYS.map { |key| options.key?(key) }
|
53
|
-
supplied.none? || supplied.all?
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
@@ -1,84 +0,0 @@
|
|
1
|
-
module ActiveJob
|
2
|
-
module Retry
|
3
|
-
class OptionsValidator
|
4
|
-
def initialize(options)
|
5
|
-
@options = options
|
6
|
-
end
|
7
|
-
|
8
|
-
def validate!
|
9
|
-
validate_limit!
|
10
|
-
validate_delay!
|
11
|
-
validate_fatal_exceptions!
|
12
|
-
validate_retry_exceptions!
|
13
|
-
end
|
14
|
-
|
15
|
-
private
|
16
|
-
|
17
|
-
attr_reader :options
|
18
|
-
|
19
|
-
# Limit must be an integer >= -1
|
20
|
-
# If it is -1 you *must* set `infinite_job: true` and understand that you're
|
21
|
-
# entering a world of pain and your ops team might hurt you.
|
22
|
-
def validate_limit!
|
23
|
-
return unless options[:limit]
|
24
|
-
|
25
|
-
unless options[:limit].is_a?(Fixnum)
|
26
|
-
raise InvalidConfigurationError, "Limit must be an integer"
|
27
|
-
end
|
28
|
-
|
29
|
-
raise InvalidConfigurationError, "Limit must be >= -1" if options[:limit] < -1
|
30
|
-
|
31
|
-
if options[:limit] == -1 && !options[:infinite_job]
|
32
|
-
raise InvalidConfigurationError,
|
33
|
-
"You must set `infinite_job: true` to use an infinite job"
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
# Delay must be non-negative
|
38
|
-
def validate_delay!
|
39
|
-
return unless options[:delay]
|
40
|
-
|
41
|
-
unless options[:delay] >= 0
|
42
|
-
raise InvalidConfigurationError, "Delay must be non-negative"
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
# Fatal exceptions must be an array (cannot be nil, since then all exceptions would
|
47
|
-
# be fatal - for that just set `limit: 0`)
|
48
|
-
def validate_fatal_exceptions!
|
49
|
-
return unless options[:fatal_exceptions]
|
50
|
-
|
51
|
-
unless options[:retry_exceptions].nil?
|
52
|
-
raise InvalidConfigurationError,
|
53
|
-
"fatal_exceptions and retry_exceptions cannot be used together"
|
54
|
-
end
|
55
|
-
|
56
|
-
unless options[:fatal_exceptions].is_a?(Array)
|
57
|
-
raise InvalidConfigurationError, "fatal_exceptions must be an array"
|
58
|
-
end
|
59
|
-
|
60
|
-
unless options[:fatal_exceptions].all? { |ex| ex.is_a?(Class) && ex <= Exception }
|
61
|
-
raise InvalidConfigurationError, "fatal_exceptions must be exceptions!"
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
# Retry exceptions must be an array of exceptions or `nil` to retry any exception
|
66
|
-
def validate_retry_exceptions!
|
67
|
-
return unless options[:retry_exceptions]
|
68
|
-
|
69
|
-
unless options[:fatal_exceptions].nil?
|
70
|
-
raise InvalidConfigurationError,
|
71
|
-
"retry_exceptions and fatal_exceptions cannot be used together"
|
72
|
-
end
|
73
|
-
|
74
|
-
unless options[:retry_exceptions].is_a?(Array)
|
75
|
-
raise InvalidConfigurationError, "retry_exceptions must be an array or nil"
|
76
|
-
end
|
77
|
-
|
78
|
-
unless options[:retry_exceptions].all? { |ex| ex.is_a?(Class) && ex <= Exception }
|
79
|
-
raise InvalidConfigurationError, "retry_exceptions must be exceptions!"
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|