public Promise acquire()

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);
    }