class OnlineMigrations::ExponentialLockRetrier

‘LockRetrier` implementation that uses exponential delay with jitter between tries and constant lock timeout for each try

@example

# This will attempt 30 retries starting with delay of 10ms between each unsuccessful try, increasing exponentially
# up to the maximum delay of 1 minute and 50ms set as lock timeout for each try:

config.retrier = OnlineMigrations::ConstantLockRetrier.new(attempts: 30,
    base_delay: 0.01.seconds, max_delay: 1.minute, lock_timeout: 0.05.seconds)

Attributes

attempts[R]

LockRetrier API implementation

@return [Integer] Number of retrying attempts @see LockRetrier#attempts

Public Class Methods

new(attempts:, base_delay:, max_delay:, lock_timeout:) click to toggle source

Create a new ExponentialLockRetrier instance

@param attempts [Integer] Maximum number of attempts @param base_delay [Numeric] Base sleep time to calculate total sleep time after unsuccessful lock attempt (in seconds) @param max_delay [Numeric] Maximum sleep time after unsuccessful lock attempt (in seconds) @param lock_timeout [Numeric] Database lock timeout value (in seconds)

Calls superclass method
# File lib/online_migrations/lock_retrier.rb, line 204
def initialize(attempts:, base_delay:, max_delay:, lock_timeout:)
  super()
  @attempts = attempts
  @base_delay = base_delay
  @max_delay = max_delay
  @lock_timeout = lock_timeout
end

Public Instance Methods

delay(attempt) click to toggle source

LockRetrier API implementation

@return [Numeric] Sleep time after unsuccessful lock attempt (in seconds) @see LockRetrier#delay @see aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/

# File lib/online_migrations/lock_retrier.rb, line 227
def delay(attempt)
  (rand * [@max_delay, @base_delay * (2**(attempt - 1))].min).ceil
end
lock_timeout(_attempt) click to toggle source

LockRetrier API implementation

@return [Numeric] Database lock timeout value (in seconds) @see LockRetrier#lock_timeout

# File lib/online_migrations/lock_retrier.rb, line 217
def lock_timeout(_attempt)
  @lock_timeout
end