[ 
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)

Reply via email to