function lc:getPeer()

in kong/kong/runloop/balancer/least_connections.lua [54:149]


function lc:getPeer(cacheOnly, handle, hashValue)
  if handle then
    
    handle.retryCount = handle.retryCount + 1

    
    handle.failedAddresses = handle.failedAddresses or setmetatable({}, {__mode = "k"})
    handle.failedAddresses[handle.address] = true
    
    releaseHandleAddress(handle)
  else
    
    handle = {
      retryCount = 0,
      binaryHeap = self.binaryHeap,
      release = releaseHandleAddress,
    }
  end

  local address, ip, port, host
  local balancer = self.balancer
  while true do
    if not balancer.healthy then
      
      
      
      ip, port, host = nil, balancers.errors.ERR_BALANCER_UNHEALTHY, nil
      break
    end


    
    do
      local reinsert
      repeat
        if address then
          
          
          reinsert = reinsert or {}
          reinsert[#reinsert + 1] = address
          self.binaryHeap:pop()
        end
        address = self.binaryHeap:peek()
      until address == nil or not (handle.failedAddresses or EMPTY)[address]

      if address == nil and handle.failedAddresses then
        
        
        
        handle.failedAddresses = nil
        address = reinsert[1]  
      end

      if reinsert then
        
        for i = 1, #reinsert do
          local addr = reinsert[i]
          insertAddr(self.binaryHeap, addr)
        end
        reinsert = nil 
      end
    end


    

    if address == nil then
      
      ip, port, host = nil, balancers.errors.ERR_NO_PEERS_AVAILABLE, nil
      break
    end

    ip, port, host = balancers.getAddressPeer(address, cacheOnly)
    if ip then
      
      handle.address = address
      updateConnectionCount(self.binaryHeap, address, 1)
      break
    end

    if port ~= balancers.errors.ERR_DNS_UPDATED then
      
      break
    end

    
    
  end

  if ip then
    return ip, port, host, handle
  else
    releaseHandleAddress(handle)
    return nil, port
  end
end