in zuul-core/src/main/java/com/netflix/zuul/netty/connectionpool/DefaultClientChannelManager.java [280:334]
public Promise<PooledConnection> acquire(
EventLoop eventLoop,
@Nullable Object key,
CurrentPassport passport,
AtomicReference<DiscoveryResult> selectedServer,
AtomicReference<? super InetAddress> selectedHostAddr) {
if (shuttingDown) {
Promise<PooledConnection> promise = eventLoop.newPromise();
promise.setFailure(new IllegalStateException("ConnectionPool is shutting down now."));
return promise;
}
// Choose the next load-balanced server.
DiscoveryResult chosenServer = dynamicServerResolver.resolve(key);
// (argha-c): Always ensure the selected server is updated, since the call chain relies on this mutation.
selectedServer.set(chosenServer);
if (Objects.equals(chosenServer, DiscoveryResult.EMPTY)) {
Promise<PooledConnection> promise = eventLoop.newPromise();
promise.setFailure(
new OriginConnectException("No servers available", OutboundErrorType.NO_AVAILABLE_SERVERS));
return promise;
}
// Now get the connection-pool for this server.
IConnectionPool pool = perServerPools.computeIfAbsent(chosenServer, s -> {
SocketAddress finalServerAddr = pickAddress(chosenServer);
ClientChannelManager clientChannelMgr = this;
PooledConnectionFactory pcf = createPooledConnectionFactory(
chosenServer, clientChannelMgr, metrics.closeConnCounter(), metrics.closeWrtBusyConnCounter());
// Create a new pool for this server.
return createConnectionPool(
chosenServer,
finalServerAddr,
clientConnFactory,
pcf,
connPoolConfig,
clientConfig,
metrics.createNewConnCounter(),
metrics.createConnSucceededCounter(),
metrics.createConnFailedCounter(),
metrics.requestConnCounter(),
metrics.reuseConnCounter(),
metrics.connTakenFromPoolIsNotOpen(),
metrics.closeAbovePoolHighWaterMarkCounter(),
metrics.maxConnsPerHostExceededCounter(),
metrics.connEstablishTimer(),
metrics.connsInPool(),
metrics.connsInUse());
});
return pool.acquire(eventLoop, passport, selectedHostAddr);
}