class PG::Connection
def connect_to_hosts(*args)
def connect_to_hosts(*args) string = parse_connect_args(*args) PG::Connection.conninfo_parse(option_string).each_with_object({}){|h, o| o[h[:keyword].to_sym] = h[:val] if h[:val] } PG::Connection.conndefaults.each_with_object({}){|h, o| o[h[:keyword].to_sym] = h[:val] if h[:val] }.merge(iopts) = [] s[:hostaddr] addr is provided -> no need to resolve hostnames ddrs = iopts[:hostaddr].split(",", -1) = iopts[:host].split(",", -1) if iopts[:host] PG::ConnectionBad, "could not match #{ihosts.size} host names to #{ihostaddrs.size} hostaddr values" if ihosts && ihosts.size != ihostaddrs.size = iopts[:port].split(",", -1) = iports * ihostaddrs.size if iports.size == 1 PG::ConnectionBad, "could not match #{iports.size} port numbers to #{ihostaddrs.size} hosts" if iports.size != ihostaddrs.size to connect to each hostaddr with separate timeout ddrs.each_with_index do |ihostaddr, idx| = iopts.merge(hostaddr: ihostaddr, port: iports[idx]) [:host] = ihosts[idx] if ihosts onnect_internal(oopts, errors) n c if c opts[:host] && !iopts[:host].empty? lve DNS in Ruby to avoid blocking state while connecting, when it ... = iopts[:host].split(",", -1) = iopts[:port].split(",", -1) = iports * ihosts.size if iports.size == 1 PG::ConnectionBad, "could not match #{iports.size} port numbers to #{ihosts.size} hosts" if iports.size != ihosts.size .each_with_index do |mhost, idx| s host_is_named_pipe?(mhost) s = if Fiber.respond_to?(:scheduler) && iber.scheduler && UBY_VERSION < '3.1.' se a second thread to avoid blocking of the scheduler. TCPSocket.gethostbyname` isn't fiber aware before ruby-3.1. ead.new{ Addrinfo.getaddrinfo(mhost, nil, nil, :STREAM).map(&:ip_address) rescue [''] }.value rinfo.getaddrinfo(mhost, nil, nil, :STREAM).map(&:ip_address) rescue [''] y to connect to each host with separate timeout s.each do |addr| ts = iopts.merge(hostaddr: addr, host: mhost, port: iports[idx]) connect_internal(oopts, errors) urn c if c hostname to resolve (UnixSocket) s = iopts.merge(host: mhost, port: iports[idx]) connect_internal(oopts, errors) rn c if c ost given connect_internal(iopts) G::ConnectionBad, errors.join("\n")