[
https://issues.apache.org/jira/browse/TINKERPOP-2839?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17649456#comment-17649456
]
Ken Hu commented on TINKERPOP-2839:
-----------------------------------
This behavior can be demonstrated if you run the following tests against the
SimpleSocketServer.
{code:java}
@Test
public void shouldContinueRunningIfServerGoesDownTemporarily() throws
InterruptedException, ExecutionException, TimeoutException {
final Cluster cluster =
Cluster.build("localhost").port(SimpleSocketServer.PORT)
.minConnectionPoolSize(1)
.maxConnectionPoolSize(2)
.maxWaitForConnection(60000) // large value needed because server
will go down in the middle of this test
.connectionSetupTimeoutMillis(100)
.minInProcessPerConnection(0)
.maxInProcessPerConnection(2)
.minSimultaneousUsagePerConnection(0)
.maxSimultaneousUsagePerConnection(2)
.reconnectInterval(10)
.serializer(Serializers.GRAPHSON_V2D0)
.create();
final Client.ClusteredClient client = cluster.connect();
ScheduledExecutorService scheduledPool =
Executors.newScheduledThreadPool(1);
scheduledPool.schedule(() -> {
try {
server.stopSync();
server = new SimpleSocketServer();
server.start(new TestWSGremlinInitializer());
} catch (InterruptedException ignored) {
// Ignored.
}
}, 500, TimeUnit.MILLISECONDS);
List<CompletableFuture<ResultSet>> results = new
ArrayList<CompletableFuture<ResultSet>>();
for (int i = 0; i < 25; i++) {
results.add(client.submitAsync("1"));
Thread.sleep(100);
}
for (CompletableFuture<ResultSet> result : results) {
try {
assertNotNull(result.get(1000,
TimeUnit.MILLISECONDS).one().getVertex());
} catch (Exception e) {
assertTrue(e instanceof IOException); // Make sure errors were due
to server shutdown.
}
}
// Final check to make sure that the client is working.
assertNotNull(client.submit("1").one().getVertex());
cluster.close();
}
{code}
The submitAsync() function call will block as a connection won't be made since
the server goes down. This example demonstrates a different issue of having the
main thread wait in cases where there is nothing to signal it.
> Make borrowing a connection from a pool async
> ---------------------------------------------
>
> Key: TINKERPOP-2839
> URL: https://issues.apache.org/jira/browse/TINKERPOP-2839
> Project: TinkerPop
> Issue Type: Improvement
> Components: driver
> Affects Versions: 3.5.4
> Reporter: Stephen Mallette
> Priority: Minor
>
> TINKERPOP-2813 stopped fast {{NoHostAvaialbleException}} errors but the
> change made it more evident that {{submitAsync()}} was never as async as it
> should have been. Since {{ConnectionPool.borrowConnection()}} was synchronous
> you could still have a block, but it was then quickly hidden for future
> requests by the fast NHA that would follow a {{TimeoutException}} from that
> wait. It seems like borrowing a connection would have to be async if we
> wanted {{submitAsync()}} to be truly behave as its name implies.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)