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