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 > 0
 | 
						|
        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
 |