class GCSLock::Utils
Public Class Methods
backoff(min_backoff:, max_backoff:, timeout: nil) { || ... }
click to toggle source
# File lib/gcslock/utils.rb, line 4 def backoff(min_backoff:, max_backoff:, timeout: nil) backoff = min_backoff now = Time.now end_time = now + timeout unless timeout.nil? loop do return true if yield break if !timeout.nil? && now + backoff >= end_time sleep(backoff) backoff_opts = [max_backoff, backoff * 2] unless timeout.nil? now = Time.now diff = end_time - now backoff_opts.push(diff) if diff > 0 end backoff = backoff_opts.min end raise LockTimeoutError, "Backoff timed out" end