Divij Vaidya created TINKERPOP-2486:
---------------------------------------
Summary: Client does not load balance requests across available
connections
Key: TINKERPOP-2486
URL: https://issues.apache.org/jira/browse/TINKERPOP-2486
Project: TinkerPop
Issue Type: Bug
Components: driver
Affects Versions: 3.4.8, 3.4.9
Reporter: Divij Vaidya
The client does not load balance requests across connections in a threadpool
which cause a request failing with timeout even when a connection is available.
To verify this, the following test fails:
{code:java}
@Test
public void shouldBalanceConcurrentRequestsAcrossConnections() throws
InterruptedException {
final int connPoolSize = 16;
final Cluster cluster = TestClientFactory.build()
.minConnectionPoolSize(connPoolSize)
.maxConnectionPoolSize(connPoolSize)
.create();
final Client.ClusteredClient client = cluster.connect();
client.init();
try {
final RequestMessage.Builder request =
client.buildMessage(RequestMessage.build(Tokens.OPS_EVAL))
.add(Tokens.ARGS_GREMLIN, "Thread.sleep(5000)");
final Callable<Connection> sendQueryCallable = () ->
client.chooseConnection(request.create());
final List<Callable<Connection>> listOfTasks = new ArrayList<>();
for (int i=0; i<connPoolSize; i++) {
listOfTasks.add(sendQueryCallable);
}
Set<String> channels = new HashSet<>();
final List<Future<Connection>> executorSubmitFutures =
executorServiceForTesting.invokeAll(listOfTasks);
executorSubmitFutures.parallelStream().map(fut -> {
try {
return fut.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return null;
}).forEach(conn -> channels.add(conn.getChannelId()));
System.out.println(channels.size());
} finally {
cluster.close();
}
}
{code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)