in gremlin-client/src/main/java/org/apache/tinkerpop/gremlin/driver/GremlinClient.java [136:195]
protected Connection chooseConnection(RequestMessage msg) throws TimeoutException, ConnectionException {
long start = System.currentTimeMillis();
logger.debug("Choosing connection");
Connection connection = null;
while (connection == null) {
EndpointClientCollection currentEndpointClientCollection = endpointClientCollection.get();
while (currentEndpointClientCollection.isEmpty()) {
if (connectionAttemptManager.maxWaitTimeExceeded(start)) {
if (currentEndpointClientCollection.hasRejectedEndpoints()) {
throw new EndpointsUnavailableException(currentEndpointClientCollection.rejectionReasons());
} else {
throw new TimeoutException("Timed-out waiting for connection");
}
}
if (connectionAttemptManager.eagerRefreshWaitTimeExceeded(start)) {
connectionAttemptManager.triggerEagerRefresh(new EagerRefreshContext());
}
try {
Thread.sleep(acquireConnectionConfig.acquireConnectionBackoffMillis());
currentEndpointClientCollection = endpointClientCollection.get();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
connection = currentEndpointClientCollection.chooseConnection(
msg,
ec -> ec.get((int) (index.getAndIncrement() % ec.size())));
if (connection == null) {
if (connectionAttemptManager.maxWaitTimeExceeded(start)) {
throw new TimeoutException("Timed-out waiting for connection");
}
if (connectionAttemptManager.eagerRefreshWaitTimeExceeded(start)) {
connectionAttemptManager.triggerEagerRefresh(new EagerRefreshContext());
}
try {
Thread.sleep(acquireConnectionConfig.acquireConnectionBackoffMillis());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
logger.debug("Connection: {} [{} ms]", connection.getConnectionInfo(), System.currentTimeMillis() - start);
return connection;
}