51 lines
1.2 KiB
Ruby
51 lines
1.2 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Gitlab
|
||
|
module Database
|
||
|
class ConnectionTimer
|
||
|
DEFAULT_INTERVAL = 3600
|
||
|
RANDOMIZATION_INTERVAL = 600
|
||
|
|
||
|
class << self
|
||
|
def configure
|
||
|
yield self
|
||
|
end
|
||
|
|
||
|
def starting_now
|
||
|
# add a small amount of randomization to the interval, so reconnects don't all occur at once
|
||
|
new(interval_with_randomization, current_clock_value)
|
||
|
end
|
||
|
|
||
|
attr_writer :interval
|
||
|
|
||
|
def interval
|
||
|
@interval ||= DEFAULT_INTERVAL
|
||
|
end
|
||
|
|
||
|
def interval_with_randomization
|
||
|
interval + rand(RANDOMIZATION_INTERVAL) if interval.positive?
|
||
|
end
|
||
|
|
||
|
def current_clock_value
|
||
|
Concurrent.monotonic_time
|
||
|
end
|
||
|
end
|
||
|
|
||
|
attr_reader :interval, :starting_clock_value
|
||
|
|
||
|
def initialize(interval, starting_clock_value)
|
||
|
@interval = interval
|
||
|
@starting_clock_value = starting_clock_value
|
||
|
end
|
||
|
|
||
|
def expired?
|
||
|
interval&.positive? && self.class.current_clock_value > (starting_clock_value + interval)
|
||
|
end
|
||
|
|
||
|
def reset!
|
||
|
@starting_clock_value = self.class.current_clock_value
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|