2020-03-05 10:07:52 -05:00
|
|
|
# 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
|
2020-08-05 11:09:59 -04:00
|
|
|
interval + rand(RANDOMIZATION_INTERVAL) if interval > 0
|
2020-03-05 10:07:52 -05:00
|
|
|
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
|