You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tinkerpop.apache.org by "stephen mallette (JIRA)" <ji...@apache.org> on 2019/01/23 15:24:00 UTC
[jira] [Assigned] (TINKERPOP-2139) Errors during request
serialization in WebSocketGremlinRequestEncoder/NioGremlinRequestEncoder
are not reported to the client
[ https://issues.apache.org/jira/browse/TINKERPOP-2139?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
stephen mallette reassigned TINKERPOP-2139:
-------------------------------------------
Assignee: stephen mallette
> Errors during request serialization in WebSocketGremlinRequestEncoder/NioGremlinRequestEncoder are not reported to the client
> -----------------------------------------------------------------------------------------------------------------------------
>
> Key: TINKERPOP-2139
> URL: https://issues.apache.org/jira/browse/TINKERPOP-2139
> Project: TinkerPop
> Issue Type: Bug
> Components: driver
> Affects Versions: 3.4.1
> Reporter: Eduard Tudenhoefner
> Assignee: stephen mallette
> Priority: Major
>
> Running something like *client.submit(TinkerFactory.createModern().traversal().addV("x").property("c", Color.RED))* will fail with the below error rather than reporting what the actual error was:
> {code:java}
> io.netty.handler.codec.EncoderException: WebSocketGremlinRequestEncoder must produce at least one message.> is a io.netty.handler.codec.EncoderException
> {code}
> This seems to be because *WebSocketGremlinRequestEncoder#encode(..)* just logs the error, but doesn't report it back to the client.
> Throwing an exception in *encode()* reports it correctly back to the client, but the session will be closed.
> Putting the below test method into *GremlinDriverIntegrateTest* reproduces the issue:
> {code:java}
> @Test
> public void shouldReportErrorWhenRequestCantBeSerialized() throws ExecutionException, InterruptedException {
> final Cluster cluster = TestClientFactory.build().serializer(Serializers.GRAPHSON_V3D0).create();
> final Client client = cluster.connect().alias("g");
> try {
> final ResultSet results = client.submit(TinkerFactory.createModern().traversal().addV("x").property("c", Color.RED));
> results.all().get();
> fail("Should have thrown exception over bad serialization");
> } catch (Exception ex) {
> final Throwable inner = ExceptionUtils.getRootCause(ex);
> assertThat(inner, instanceOf(ResponseException.class));
> assertEquals(ResponseStatusCode.SERVER_ERROR_SERIALIZATION, ((ResponseException) inner).getResponseStatusCode());
> assertTrue(ex.getMessage().contains("An error occurred during serialization of this request"));
> assertTrue(ex.getMessage().contains("Serializer for type java.awt.Color not found"));
> }
> // should not die completely just because we had a bad serialization error. that kind of stuff happens
> // from time to time, especially in the console if you're just exploring.
> assertEquals(2, client.submit("1+1").all().get().get(0).getInt());
> cluster.close();
> }{code}
> Tested with *3.4.1* but it most likely fails with other versions as well.
> This is the diff I had tested it with:
> {code:java}
> @@ -58,7 +61,9 @@ public final class WebSocketGremlinRequestEncoder extends MessageToMessageEncode
> objects.add(new TextWebSocketFrame(textSerializer.serializeRequestAsString(requestMessage)));
> }
> } catch (Exception ex) {
> - logger.warn(String.format("An error occurred during serialization of this request [%s] - it could not be sent to the server.", requestMessage), ex);
> + String errorMsg = String.format("An error occurred during serialization of this request [%s] - it could not be sent to the server - Reason: %s", requestMessage, ex);
> + logger.warn(errorMsg, ex);
> + throw new ResponseException(ResponseStatusCode.SERVER_ERROR_SERIALIZATION, errorMsg);
> }
> {code}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)