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/10/08 21:27:00 UTC
[jira] [Commented] (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:comment-tabpanel&focusedCommentId=17210466#comment-17210466 ]
Divij Vaidya commented on TINKERPOP-2437:
-----------------------------------------
Thank you Oliver for catching the bug and suggesting the fix. Since you have figured out the bug anyways, would you like to contribute this yourself to OSS (I can help you get started if you need help)? If not, that is fine I well, I will make this code change.
> 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
> Priority: Minor
>
> 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)