Connection chooseConnection()

in gremlin-client/src/main/java/org/apache/tinkerpop/gremlin/driver/EndpointClientCollection.java [96:147]


    Connection chooseConnection(RequestMessage msg, ChooseEndpointStrategy strategy) throws TimeoutException {

        UUID traceId = msg.getRequestId();

        long startMillis = System.currentTimeMillis();

        EndpointClient endpointClient = strategy.choose(this);
        String address = endpointClient.endpoint().getAddress();

        if (!endpointClient.isAvailable()) {
            logger.debug("No connections available for {}", address);
            submitMetrics(() -> connectionMetrics.unavailable(address, startMillis));
            return null;
        }

        try {

            Connection connection = endpointClient.client().chooseConnection(msg);

            if (connection.isClosing()) {
                logger.debug("Connection is closing: {}", address);
                submitMetrics(() -> connectionMetrics.closing(address, startMillis));
                return null;
            }

            if (connection.isDead()) {
                logger.debug("Connection is dead: {}", address);
                submitMetrics(() -> connectionMetrics.dead(address, startMillis));
                return null;
            }

            submitMetrics(() -> {
                try {
                    connectionMetrics.succeeded(address, startMillis);
                    requestMetrics.registerAddressForTraceId(traceId, address);
                } catch (Exception e) {
                    logger.error("Error while submitting metrics", e);
                }
            });

            return connection;

        } catch (NullPointerException e) {
            logger.debug("NullPointerException: {}", address, e);
            submitMetrics(() -> connectionMetrics.npe(address, startMillis));
            return null;
        } catch (NoHostAvailableException e) {
            logger.debug("No connection available: {}", address, e);
            submitMetrics(() -> connectionMetrics.nha(address, startMillis));
            return null;
        }
    }