You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tinkerpop.apache.org by "Divij Vaidya (Jira)" <ji...@apache.org> on 2020/11/02 18:38:00 UTC

[jira] [Closed] (TINKERPOP-2437) gremlin-driver hangs if ResultSet.statusAttributes().get() is called when the request throws

     [ https://issues.apache.org/jira/browse/TINKERPOP-2437?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Divij Vaidya closed TINKERPOP-2437.
-----------------------------------
    Fix Version/s: 3.4.9
                   3.5.0
         Assignee: Divij Vaidya
       Resolution: Fixed

> gremlin-driver hangs if ResultSet.statusAttributes().get() is called when the request throws
> --------------------------------------------------------------------------------------------
>
>                 Key: TINKERPOP-2437
>                 URL: https://issues.apache.org/jira/browse/TINKERPOP-2437
>             Project: TinkerPop
>          Issue Type: Bug
>          Components: driver
>    Affects Versions: 3.4.8
>            Reporter: Oliver Towers
>            Assignee: Divij Vaidya
>            Priority: Minor
>             Fix For: 3.5.0, 3.4.9
>
>
> Issue is present in gremlin-driver when an error is thrown on the request.
> If ResultSet.statusAttributes() is blocked on before other calls are made ResultSet, then the calling thread will hang if an exception is thrown.
> If other ResultSet futures are are blocked on, then exception should be propagated correctly.
> h2. Repro:
> {code:java}
> ResultSet results = client.submit(queryWhichFails, params); Double requestCharge = (Double)results.statusAttributes().get().get("x-ms-request-charge");
> CompletableFuture<List<Result>> completableFutureResults = results.all();{code}
> h2. Cause:
> From the tinkerpop github source [ResultSet.java|https://github.com/apache/tinkerpop/blob/d1a3fa147d1f009ae57274827c9b59426dfc6e58/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/ResultSet.java] this is the statusAttributes method:
>  
> {code:java}
> public CompletableFuture<Map<String,Object>> statusAttributes() {
>     final CompletableFuture<Map<String,Object>> attrs = new CompletableFuture<>();
>     readCompleted.thenRun(() -> attrs.complete(null == resultQueue.getStatusAttributes() ? Collections.emptyMap() : resultQueue.getStatusAttributes()));
>     return attrs;
>  }{code}
>  
> This will ensure that the attrs CompleteableFuture returned by the method completes readCompleted finishes. However, it lacks handling for readCompleted.exceptionally(...), so in the case of readCompleted hitting an exception, the returned attrs CompletableFuture is never completed/closed, causing the caller thread to hang.
> h2. Workaround:
> Avoid blocking on ResutSet.statusAttributes() before ResultSet.all() or other methods which will materialize the results fully. 
> For example:
> {code:java}
> ResultSet results = client.submit(queryWhichFails, params);
> CompletableFuture<List<Result>> completableFutureResults = results.all();
> Double requestCharge = (Double)results.statusAttributes().get().get("x-ms-request-charge");
> {code}
> h2. Fix:
> Add readCompleted.exceptionally(...) callback for CompletableFuture returned by statusAttributes():
> {code:java}
> public CompletableFuture<Map<String,Object>> statusAttributes() {
>     final CompletableFuture<Map<String,Object>> attrs = new CompletableFuture<>();
>     readCompleted.thenRun(() -> attrs.complete(null == resultQueue.getStatusAttributes() ? Collections.emptyMap() : resultQueue.getStatusAttributes()));
>     readCompleted.exceptionally(t -> {
>         attrs.completeExceptionally(t);
>         return null;
>     });
>     return attrs;
>  }{code}
>  
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)