Description
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:
@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(); } }
Attachments
Issue Links
- is duplicated by
-
TINKERPOP-2871 Borrowed count can be wildly incorrect
- Closed