aws-flow 1.0.8 → 1.0.9

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.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +1 -1
  3. data/Rakefile +18 -31
  4. data/aws-flow.gemspec +1 -1
  5. data/lib/aws/decider.rb +1 -2
  6. data/lib/aws/decider/activity.rb +99 -53
  7. data/lib/aws/decider/activity_definition.rb +43 -7
  8. data/lib/aws/decider/async_decider.rb +56 -57
  9. data/lib/aws/decider/async_retrying_executor.rb +4 -5
  10. data/lib/aws/decider/data_converter.rb +2 -2
  11. data/lib/aws/decider/decider.rb +46 -41
  12. data/lib/aws/decider/decision_context.rb +2 -2
  13. data/lib/aws/decider/exceptions.rb +6 -6
  14. data/lib/aws/decider/executor.rb +15 -11
  15. data/lib/aws/decider/flow_defaults.rb +54 -22
  16. data/lib/aws/decider/generic_client.rb +7 -7
  17. data/lib/aws/decider/history_helper.rb +0 -0
  18. data/lib/aws/decider/implementation.rb +5 -5
  19. data/lib/aws/decider/options.rb +285 -155
  20. data/lib/aws/decider/state_machines.rb +10 -10
  21. data/lib/aws/decider/task_handler.rb +5 -5
  22. data/lib/aws/decider/task_poller.rb +152 -15
  23. data/lib/aws/decider/utilities.rb +14 -14
  24. data/lib/aws/decider/version.rb +1 -1
  25. data/lib/aws/decider/worker.rb +21 -20
  26. data/lib/aws/decider/workflow_client.rb +78 -31
  27. data/lib/aws/decider/workflow_clock.rb +1 -1
  28. data/lib/aws/decider/workflow_definition.rb +5 -5
  29. data/lib/aws/decider/workflow_definition_factory.rb +1 -1
  30. data/lib/aws/decider/workflow_enabled.rb +1 -1
  31. data/lib/aws/flow/async_backtrace.rb +19 -18
  32. data/lib/aws/flow/async_scope.rb +32 -16
  33. data/lib/aws/flow/begin_rescue_ensure.rb +61 -56
  34. data/lib/aws/flow/fiber.rb +14 -6
  35. data/lib/aws/flow/flow_utils.rb +9 -6
  36. data/lib/aws/flow/future.rb +43 -18
  37. data/lib/aws/flow/implementation.rb +34 -18
  38. data/lib/aws/flow/simple_dfa.rb +12 -4
  39. data/lib/aws/flow/tasks.rb +120 -86
  40. data/{test/aws → spec/aws/integration}/integration_spec.rb +0 -0
  41. data/{test/aws → spec/aws/unit}/async_backtrace_spec.rb +1 -0
  42. data/{test/aws → spec/aws/unit}/async_scope_spec.rb +0 -0
  43. data/{test/aws → spec/aws/unit}/begin_rescue_ensure_spec.rb +90 -2
  44. data/{test/aws → spec/aws/unit}/decider_spec.rb +41 -53
  45. data/{test/aws → spec/aws/unit}/external_task_spec.rb +0 -0
  46. data/{test/aws → spec/aws/unit}/factories.rb +0 -0
  47. data/{test/aws → spec/aws/unit}/fiber_condition_variable_spec.rb +0 -0
  48. data/{test/aws → spec/aws/unit}/fiber_spec.rb +0 -0
  49. data/{test/aws → spec/aws/unit}/flow_spec.rb +0 -0
  50. data/{test/aws → spec/aws/unit}/future_spec.rb +0 -0
  51. data/{test/aws → spec/aws/unit}/preinclude_tests.rb +0 -0
  52. data/{test/aws → spec/aws/unit}/rubyflow.rb +0 -0
  53. data/{test/aws → spec/aws/unit}/simple_dfa_spec.rb +0 -0
  54. data/{test/aws → spec}/spec_helper.rb +0 -0
  55. metadata +30 -30
@@ -92,7 +92,7 @@ module AWS
92
92
  # Represents a policy for retrying failed tasks.
93
93
  class RetryPolicy
94
94
 
95
- # Creates a new RetryPolicy instance
95
+ # Creates a new `RetryPolicy` instance.
96
96
  #
97
97
  # @param retry_function
98
98
  # The method to be called for each retry attempt.
@@ -134,7 +134,7 @@ module AWS
134
134
  #return (!@exceptions_to_exclude.include?(failure) && @exceptions_to_include.include?(failure))
135
135
  end
136
136
 
137
- # Schedules a new retry attempt
137
+ # Schedules a new retry attempt.
138
138
  #
139
139
  # @param first_attempt
140
140
  #
@@ -156,7 +156,6 @@ module AWS
156
156
  end
157
157
  return -1 if failure == nil
158
158
 
159
-
160
159
  # For reverse compatbility purposes, we must ensure that this function
161
160
  # can take 3 arguments. However, we must also consume options in order
162
161
  # for the default retry function to work correctly. Because we support
@@ -168,8 +167,8 @@ module AWS
168
167
  retry_seconds = @retry_function.call(*call_args)
169
168
  # Check to see if we should jitter or not and pass in the jitter
170
169
  # function to retry function accordingly.
171
- if @should_jitter
172
- retry_seconds += @jitter_function.call(execution_id, retry_seconds/2)
170
+ if @should_jitter && retry_seconds > 0
171
+ retry_seconds += @jitter_function.call(execution_id, retry_seconds/2)
173
172
  end
174
173
  return retry_seconds
175
174
  end
@@ -15,8 +15,8 @@
15
15
 
16
16
  module AWS
17
17
  module Flow
18
- # We special case exception for now, as YAML doesn't propagate backtraces
19
- # properly, and they are very handy for debugging
18
+ # Converts an object to YAML. Exceptions are handled differently because YAML doesn't propagate backtraces
19
+ # properly, and they are very handy for debugging.
20
20
  class YAMLDataConverter
21
21
 
22
22
  def dump(object)
@@ -16,7 +16,7 @@
16
16
  module AWS
17
17
  module Flow
18
18
 
19
- # A MethodPair groups a method name with an associated data converter.
19
+ # Groups a method name with an associated data converter.
20
20
  class MethodPair
21
21
  # The method name for the method pair.
22
22
  attr_accessor :method_name
@@ -61,17 +61,19 @@ module AWS
61
61
  @workflow_context = workflow_context
62
62
  end
63
63
 
64
- # Handler for the ExternalWorkflowExecutionCancelRequested event.
64
+ # Handler for the `ExternalWorkflowExecutionCancelRequested` event.
65
65
  #
66
- # @param [Object] event The event instance.
66
+ # @param [Object] event
67
+ # The event instance.
67
68
  #
68
69
  def handle_external_workflow_execution_cancel_requested(event)
69
70
  # NOOP
70
71
  end
71
72
 
72
- # Handler for the ChildWorkflowExecutionCanceled event.
73
+ # Handler for the `ChildWorkflowExecutionCanceled` event.
73
74
  #
74
- # @param [Object] event The event instance.
75
+ # @param [Object] event
76
+ # The event instance.
75
77
  #
76
78
  def handle_child_workflow_execution_canceled(event)
77
79
  handle_event(event,
@@ -87,11 +89,11 @@ module AWS
87
89
  end
88
90
 
89
91
 
90
- # Handler for the ChildWorkflowExecutionCompleted event.
92
+ # Handler for the `ChildWorkflowExecutionCompleted` event.
91
93
  #
92
- # @param [Object] event The event instance.
94
+ # @param [Object] event
95
+ # The event instance.
93
96
  #
94
-
95
97
  def handle_child_workflow_execution_completed(event)
96
98
  handle_event(event,
97
99
  {:id_methods => [:workflow_execution, :workflow_id],
@@ -101,9 +103,10 @@ module AWS
101
103
  })
102
104
  end
103
105
 
104
- # Handler for the ChildWorkflowExecutionFailed event.
106
+ # Handler for the `ChildWorkflowExecutionFailed` event.
105
107
  #
106
- # @param [Object] event The event instance.
108
+ # @param [Object] event
109
+ # The event instance.
107
110
  #
108
111
  def handle_child_workflow_execution_failed(event)
109
112
  handle_event(event,
@@ -126,9 +129,10 @@ module AWS
126
129
  end
127
130
 
128
131
 
129
- # Handler for the ChildWorkflowExecutionStarted event.
132
+ # Handler for the `ChildWorkflowExecutionStarted` event.
130
133
  #
131
- # @param [Object] event The event instance.
134
+ # @param [Object] event
135
+ # The event instance.
132
136
  #
133
137
  def handle_child_workflow_execution_started(event)
134
138
  handle_event(event,
@@ -141,9 +145,10 @@ module AWS
141
145
  })
142
146
  end
143
147
 
144
- # Handler for the ChildWorkflowExecutionTerminated event.
148
+ # Handler for the `ChildWorkflowExecutionTerminated` event.
145
149
  #
146
- # @param [Object] event The event instance.
150
+ # @param [Object] event
151
+ # The event instance.
147
152
  #
148
153
  def handle_child_workflow_execution_terminated(event)
149
154
  handle_event(event,
@@ -157,9 +162,10 @@ module AWS
157
162
  })
158
163
  end
159
164
 
160
- # Handler for the ChildWorkflowExecutionTimedOut event.
165
+ # Handler for the `ChildWorkflowExecutionTimedOut` event.
161
166
  #
162
- # @param [Object] event The event instance.
167
+ # @param [Object] event
168
+ # The event instance.
163
169
  #
164
170
  def handle_child_workflow_execution_timed_out(event)
165
171
  handle_event(event,
@@ -173,9 +179,10 @@ module AWS
173
179
  })
174
180
  end
175
181
 
176
- # Handler for the ExternalWorkflowExecutionSignaled event.
182
+ # Handler for the `ExternalWorkflowExecutionSignaled` event.
177
183
  #
178
- # @param [Object] event The event instance.
184
+ # @param [Object] event
185
+ # The event instance.
179
186
  #
180
187
  def handle_external_workflow_execution_signaled(event)
181
188
  signal_id = @decision_helper.signal_initiated_event_to_signal_id[event.attributes[:initiated_event_id]]
@@ -188,9 +195,10 @@ module AWS
188
195
  end
189
196
  end
190
197
 
191
- # Handler for the SignalExternalWorkflowExecutionFailed event.
198
+ # Handler for the `SignalExternalWorkflowExecutionFailed` event.
192
199
  #
193
- # @param [Object] event The event instance.
200
+ # @param [Object] event
201
+ # The event instance.
194
202
  #
195
203
  def handle_signal_external_workflow_execution_failed(event)
196
204
  handle_event(event, {
@@ -205,9 +213,10 @@ module AWS
205
213
  })
206
214
  end
207
215
 
208
- # Handler for the StartChildWorkflowExecutionFailed event.
216
+ # Handler for the `StartExternalWorkflowExecutionFailed` event.
209
217
  #
210
- # @param [Object] event The event instance.
218
+ # @param [Object] event
219
+ # The event instance.
211
220
  #
212
221
  def handle_start_child_workflow_execution_failed(event)
213
222
  handle_event(event, {
@@ -225,11 +234,10 @@ module AWS
225
234
  end
226
235
  end
227
236
 
228
-
229
237
  # Types and methods related to workflow execution. Extend this to implement a workflow decider.
230
238
  #
231
239
  # @!attribute version
232
- # Sets or returns the Decider version.
240
+ # Sets or returns the decider version.
233
241
  #
234
242
  # @!attribute options
235
243
  # Sets or returns the {WorkflowOptions} for this decider.
@@ -249,10 +257,9 @@ module AWS
249
257
  base.send :include, InstanceMethods
250
258
  end
251
259
 
252
- # This method is for internal use only and may be changed or removed
253
- # without prior notice. Use {#workflows} instead. Set the entry point
254
- # in the {#workflow} method when creating a new workflow.
255
- # @!visibility private
260
+ # @deprecated Set the entry point with {Workflows#workflow} instead.
261
+ #
262
+ # @api private
256
263
  def entry_point(input=nil)
257
264
  if input
258
265
  @entry_point = input
@@ -267,10 +274,8 @@ module AWS
267
274
  raise "You must set an entry point on the workflow definition"
268
275
  end
269
276
 
270
- # This method is for internal use only and may be changed or removed
271
- # without prior notice. Use {#workflows} instead.
272
- # Set the version in the {WorkflowOptions} passed in to the {#workflow} method.
273
- # @!visibility private
277
+ # @deprecated Set the version in the {WorkflowOptions} passed in to the {#workflow} method.
278
+ # @api private
274
279
  def version(arg = nil)
275
280
  if arg
276
281
  self.workflows.each { |workflow| workflow.version = arg }
@@ -321,10 +326,10 @@ module AWS
321
326
  end
322
327
 
323
328
 
324
- # @!visibility private
329
+ # @api private
325
330
  def _options; self.workflows.map(&:options); end
326
331
 
327
- # Defines a new workflow
332
+ # Defines a new workflow.
328
333
  #
329
334
  # @param entry_point
330
335
  # The entry point (method) that starts the workflow.
@@ -341,7 +346,7 @@ module AWS
341
346
  end
342
347
 
343
348
  # @return [MethodPair]
344
- # A {MethodPair} object
349
+ # A {MethodPair} object.
345
350
  #
346
351
  def get_state_method(get_state_method = nil, options = {})
347
352
  data_converter = options[:data_converter]
@@ -375,7 +380,7 @@ module AWS
375
380
  end
376
381
 
377
382
 
378
- # Instance methods for {DecisionContext}
383
+ # Instance methods for {DecisionContext}.
379
384
  module InstanceMethods
380
385
 
381
386
  # Returns the {DecisionContext} instance.
@@ -389,7 +394,7 @@ module AWS
389
394
  # Returns the workflow ID.
390
395
  #
391
396
  # @return
392
- # The workflow ID
397
+ # The workflow ID.
393
398
  #
394
399
  def workflow_id
395
400
  self.decision_context.workflow_context.decision_task.workflow_execution.workflow_id
@@ -451,7 +456,7 @@ module AWS
451
456
  # @deprecated
452
457
  # Use {#create_timer_async} instead.
453
458
  #
454
- # @!visibility private
459
+ # @api private
455
460
  def async_create_timer(delay_seconds, &block)
456
461
  task { self.decision_context.workflow_clock.create_timer(delay_seconds, block) }
457
462
  end
@@ -482,12 +487,12 @@ module AWS
482
487
  continue_as_new_options.input = input
483
488
  end
484
489
  known_workflows = self.class.workflows
485
- # If there is only one workflow, we can unambiguously say that we should use that one
490
+ # If there is only one workflow, we can unambiguously say that we should use that one.
486
491
 
487
492
  if known_workflows.length == 1
488
493
  continue_as_new_options.precursors << known_workflows.first.options
489
494
  end
490
- # If we can find a name that matches, use that one
495
+ # If we can find a name that matches, use that one.
491
496
  if continue_as_new_options.execution_method
492
497
  matching_option = self.class.workflows.map(&:options).find {|x| x.execution_method == continue_as_new_options.execution_method }
493
498
  continue_as_new_options.precursors << matching_option unless matching_option.nil?
@@ -501,7 +506,7 @@ module AWS
501
506
  # without prior notice.
502
507
  # Use {Workflows} instead.
503
508
  #
504
- # @!visibility private
509
+ # @api private
505
510
  module Decider
506
511
  include Workflows
507
512
 
@@ -27,7 +27,7 @@
27
27
  end
28
28
 
29
29
 
30
- # The context for a workflow
30
+ # The context for a workflow.
31
31
  class WorkflowContext
32
32
 
33
33
  attr_accessor :continue_as_new_options
@@ -37,7 +37,7 @@
37
37
  # The {WorkflowClock} for this workflow.
38
38
  attr_accessor :workflow_clock
39
39
 
40
- # Creates a new `WorkflowContext`
40
+ # Creates a new `WorkflowContext`.
41
41
  #
42
42
  # @param decision_task
43
43
  # The decision task method for this workflow. This is accessible after instance creation by using the
@@ -88,7 +88,7 @@ module AWS
88
88
  # Creates a new `ChildWorkflowFailedException`
89
89
  #
90
90
  # @param event_id
91
- # The event id for the exception.
91
+ # The event ID for the exception.
92
92
  #
93
93
  # @param execution
94
94
  # The child workflow execution that raised the exception.
@@ -112,7 +112,7 @@ module AWS
112
112
 
113
113
 
114
114
  # This exception is used by the framework internally to communicate activity failure. When an activity fails due to
115
- # an unhandled exception, it is wrapped in ActivityFailureException and reported to Amazon SWF. You need to deal
115
+ # an unhandled exception, it is wrapped in {ActivityFailureException} and reported to Amazon SWF. You need to deal
116
116
  # with this exception only if you use the activity worker extensibility points. Your application code will never
117
117
  # need to deal with this exception.
118
118
  #
@@ -139,12 +139,12 @@ module AWS
139
139
  # This exception is thrown if an activity was timed out by Amazon SWF. This could happen if the activity task could
140
140
  # not be assigned to the worker within the require time period or could not be completed by the worker in the
141
141
  # required time. You can set these timeouts on the activity using the @ActivityRegistrationOptions annotation or
142
- # using the ActivitySchedulingOptions parameter when calling the activity method.
142
+ # using the `ActivitySchedulingOptions` parameter when calling the activity method.
143
143
  #
144
144
  # @abstract An exception raised when the activity task has timed out.
145
145
  class ActivityTaskTimedOutException < ActivityFailureException
146
146
 
147
- # Creates a new ActivityTaskTimeoutException
147
+ # Creates a new `ActivityTaskTimeoutException`.
148
148
  def initialize(id, activity_id, reason, details)
149
149
  @id = id
150
150
  @activity_id = activity_id
@@ -159,14 +159,14 @@ module AWS
159
159
  end
160
160
 
161
161
  # Unhandled exceptions in activities are reported back to the workflow implementation by throwing an
162
- # `ActivityTaskFailedException`. The original exception can be retrieved from the reason attribute of this
162
+ # `ActivityTaskFailedException`. The original exception can be retrieved from the `reason` attribute of this
163
163
  # exception. The exception also provides information in the `details` attribute that is useful for debugging
164
164
  # purposes, such as the unique activity identifier in the history.
165
165
  #
166
166
  # @abstract An exception raised when the activity task has failed.
167
167
  class ActivityTaskFailedException < ActivityFailureException
168
168
  attr_accessor :cause, :details
169
- # Creates a new ActivityTaskFailedException
169
+ # Creates a new `ActivityTaskFailedException`.
170
170
  def initialize(id, activity_id, reason, details)
171
171
  @id = id
172
172
  @activity_id = activity_id
@@ -19,6 +19,7 @@ require 'logger'
19
19
  module AWS
20
20
  module Flow
21
21
 
22
+ # @api private
22
23
  class LogMock
23
24
  attr_accessor :log_level
24
25
  def initialize()
@@ -39,6 +40,7 @@ module AWS
39
40
  end
40
41
  class RejectedExecutionException < Exception; end
41
42
 
43
+ # @api private
42
44
  class ForkingExecutor
43
45
 
44
46
  class << self
@@ -47,12 +49,12 @@ module AWS
47
49
  attr_accessor :max_workers, :pids, :is_shutdown
48
50
 
49
51
  def initialize(options = {})
50
- @log = options[:logger]
51
- @log ||= Logger.new("#{Dir.tmpdir}/forking_log")
52
+ unless @log = options[:logger]
53
+ @log = Logger.new("#{Dir.tmpdir}/forking_log")
54
+ @log.level = options[:log_level] || Logger::ERROR
55
+ @log.info("LOG INITIALIZED")
56
+ end
52
57
  @semaphore = Mutex.new
53
- log_level = options[:log_level] || 4
54
- @log.level = Logger::DEBUG
55
- @log.info("LOG INITIALIZED")
56
58
  @max_workers = options[:max_workers] || 1
57
59
  @pids = []
58
60
  @is_shutdown = false
@@ -114,6 +116,7 @@ module AWS
114
116
  end
115
117
  end
116
118
 
119
+ # @api private
117
120
  def block_on_max_workers
118
121
  @log.debug "block_on_max_workers workers=#{@pids.size}, max_workers=#{@max_workers}"
119
122
  if @pids.size >= @max_workers
@@ -127,18 +130,19 @@ module AWS
127
130
 
128
131
  private
129
132
 
130
- # Remove all child processes from @pids list that have finished
131
- # Block for at least one child to finish if block argument is set to true
133
+ # Removes all child processes from @pids list that have finished.
134
+ # Block for at least one child to finish if block argument is set to `true`.
135
+ # @api private
132
136
  def remove_completed_pids(block=false)
133
137
  loop do
134
138
  # waitpid2 throws an Errno::ECHILD if there are no child processes,
135
- # so we don't even call it if there aren't any pids to wait on
139
+ # so we don't even call it if there aren't any pids to wait on.
136
140
  break if @pids.empty?
137
- # non-blocking wait - only returns a non-null pid
138
- # if the child process has exited
141
+ # Non-blocking wait only returns a non-null pid
142
+ # if the child process has exited.
139
143
  pid, status = Process.waitpid2(-1, block ? 0 : Process::WNOHANG)
140
144
  @log.debug "#{pid}"
141
- # no more children have finished
145
+ # No more children have finished.
142
146
  break unless pid
143
147
 
144
148
  if status.success?
@@ -15,30 +15,61 @@
15
15
 
16
16
  module AWS
17
17
  module Flow
18
+
19
+ # Constants used by the AWS Flow Framework for Ruby.
20
+ #
21
+ # @!attribute exponential_retry_maximum_retry_interval_seconds
22
+ # The maximum exponential retry interval in seconds.
23
+ #
24
+ # Use the value `-1` (the default) to set *no maximum*.
25
+ #
26
+ # @!attribute exponential_retry_retry_expiration_seconds
27
+ # The maximum time that can pass, in seconds, before the exponential retry
28
+ # attempt is considered to be a failure.
29
+ #
30
+ # Use the value -1 (the default) to set *no maximum*.
31
+ #
32
+ # @!attribute exponential_retry_backoff_coefficient
33
+ #
34
+ # The coefficient used to determine how much to back off the interval
35
+ # timing for an exponential retry scenario. The default value, `2.0`,
36
+ # causes each retry attempt to wait twice as long as the previous attempt.
37
+ #
38
+ # @!attribute exponential_retry_maximum_attempts
39
+ # The maximum number of attempts to make for an exponential retry of a
40
+ # failed task. The default value is `Float::INFINITY`, which indicates
41
+ # that there should be *no* limit to the number of retry attempts.
42
+ #
43
+ # @!attribute exponential_retry_function
44
+ # The default exponential retry function.
45
+ #
46
+ # @!attribute default_data_converter
47
+ # The DataConverter used to interpret results from Amazon SWF. By
48
+ # default, this is {YAMLDataConverter}.
49
+ #
50
+ # @!attribute exponential_retry_exceptions_to_include
51
+ # A list of the exception types to include for initiating retry attempts.
52
+ # By default, all exceptions are included (the default value is
53
+ # `Exception`, which is the base class for all exceptions.)
54
+ #
55
+ # @!attribute exponential_retry_exceptions_to_exclude
56
+ # A list of the exception types to exclude from initiating retry attempts.
57
+ # By default, no exceptions are excluded; this is an empty list.
58
+ #
59
+ # @!attribute jitter_function
60
+ # The function that is used to determine how long to wait for the next
61
+ # retry attempt when *should_jitter* is set to `true`.
62
+ #
63
+ # @!attribute should_jitter
64
+ # Indicates whether there should be any randomness built in to the timing of
65
+ # the retry attempt. The default value is `true`.
66
+ #
18
67
  class FlowConstants
68
+
19
69
  class << self
20
70
  attr_reader :exponential_retry_maximum_retry_interval_seconds, :exponential_retry_retry_expiration_seconds, :exponential_retry_backoff_coefficient, :exponential_retry_maximum_attempts, :exponential_retry_function, :default_data_converter, :exponential_retry_exceptions_to_include, :exponential_retry_exceptions_to_exclude, :jitter_function, :should_jitter, :exponential_retry_initial_retry_interval
21
- # # The maximum exponential retry interval, in seconds. Use the value -1 (the default) to set <i>no maximum</i>.
22
- # attr_reader :exponential_retry_maximum_retry_interval_seconds
23
-
24
- # # The maximum time that can pass, in seconds, before the exponential retry attempt is considered a failure. Use
25
- # # the value -1 (the default) to set <i>no maximum</i>.
26
- # attr_reader :exponential_retry_retry_expiration_seconds
27
-
28
- # # The coefficient used to determine how much to back off the interval timing for an exponential retry scenario.
29
- # # The default value, 2.0, causes each attempt to wait twice as long as the previous attempt.
30
- # attr_reader :exponential_retry_backoff_coefficient
31
-
32
- # # The maximum number of attempts to make for an exponential retry of a failed task. The default value is
33
- # # Float::INFINITY.
34
- # attr_reader :exponential_retry_maximum_attempts
35
-
36
- # # The default exponential retry function.
37
- # attr_reader :exponential_retry_function
38
-
39
- # The DataConverter for instances of this class.
40
- attr_reader :default_data_converter
41
71
  end
72
+
42
73
  INFINITY = -1
43
74
  @exponential_retry_maximum_attempts = Float::INFINITY
44
75
  @exponential_retry_maximum_retry_interval_seconds = -1
@@ -70,8 +101,9 @@ module AWS
70
101
  end
71
102
 
72
103
  @jitter_function = lambda do |seed, max_value|
73
- random = Random.new(seed.to_i)
74
- random.rand(max_value)
104
+ raise ArgumentError.new("max_value should be greater than 0") unless max_value > 0
105
+ random = Random.new(seed.to_i)
106
+ random.rand(max_value)
75
107
  end
76
108
 
77
109
  @default_data_converter = YAMLDataConverter.new