You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tinkerpop.apache.org by "Eduard Tudenhoefner (JIRA)" <ji...@apache.org> on 2019/01/23 14:11:00 UTC

[jira] [Created] (TINKERPOP-2139) Errors during request serialization in WebSocketGremlinRequestEncoder/NioGremlinRequestEncoder are not reported to the client

Eduard Tudenhoefner created TINKERPOP-2139:
----------------------------------------------

             Summary: 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


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)