files/gitlab-cookbooks/gitlab/libraries/helpers/pg_status_helper.rb (56 lines of code) (raw):
# This is a helper to establish the listening status of PostgreSQL
require_relative 'base_helper'
require_relative '../../../package/libraries/helpers/shell_out_helper'
class PgStatusHelper
include ShellOutHelper
attr_reader :maximum_service_checks
attr_reader :total_service_checks
attr_reader :service_check_interval
attr_reader :service_checks
def initialize(connection_info, node)
@conn = connection_info
@total_service_checks = 0
@maximum_service_checks = node['postgresql']['max_service_checks']
@service_check_interval = node['postgresql']['service_check_interval']
@service_checks = {}
@status_executable = "#{node['package']['install-dir']}/embedded/bin/pg_isready"
end
# Mutator Methods
def remaining_service_checks
@maximum_service_checks - @total_service_checks
end
def service_checks_exhausted?
remaining_service_checks < 1
end
# Check Methods
[
'accepting_connections?',
'rejecting_connections?',
'not_responding?',
'invalid_connection_parameters?'
].each.with_index do |method, index|
define_method method do
service_state == index
end
end
def ready?
@total_service_checks = 1
until accepting_connections?
warning = if invalid_connection_parameters?
"PostgreSQL is not receiving the correct connection parameters"
elsif service_checks_exhausted?
if not_responding?
"PostgreSQL did not respond before service checks were exhausted"
else
"Exhausted service checks and database is still not available"
end
end
raise warning unless warning.nil?
sleep(service_check_interval)
@total_service_checks += 1
end
true
end
def service_state
return @service_checks[@total_service_checks] if @service_checks.include?(@total_service_checks)
cmd = %W(#{@status_executable} -d #{@conn.dbname} -h #{@conn.dbhost} -p #{@conn.port} -U #{@conn.pguser})
@service_checks[@total_service_checks] = do_shell_out(cmd).exitstatus
end
end