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