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