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
LockRetrier
API implementation
@return [Integer] Number of retrying attempts @see LockRetrier#attempts
Public Class Methods
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)
# 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
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
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