JanusGraph 0.6.0 Binary Driver failing on serialization
We have fully integrated our backend with JS:0.6 as recommended, including DB connection using new driver: GraphBinaryMessageSerializerV1. All seams o work as before, except: GraphTraversal<Vertex, ? extends Property<Object>> p = g.V(12345).properties("myproperty"); if (p.hasNext()) {...}
12:02:47.609 [https-jsse-nio-127.0.0.1-8443-exec-8] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] [175] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.util.concurrent.CompletionException: org.apache.tinkerpop.gremlin.driver.exception.ResponseException: Error during serialization: java.lang.IllegalStateException] with root cause org.apache.tinkerpop.gremlin.driver.exception.ResponseException: Error during serialization: java.lang.IllegalStateException at org.apache.tinkerpop.gremlin.driver.Handler$GremlinResponseHandler.channelRead0(Handler.java:245) at org.apache.tinkerpop.gremlin.driver.Handler$GremlinResponseHandler.channelRead0(Handler.java:200) at io.shaded.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99) /.../
Above was, and still is fine on p.hasNext() with previously used GryoMessageSerializerV3d0 driver. Workaround we have is to use: GraphTraversal<Vertex, ? extends Property<Object>> p = g.V(12345).values("myproperty");
if (p.hasNext()) {...} // now is ok
Why above is failing, is the question.... Regards, Chris
|
|
hadoopmarc@...
Hi Chris,
Thanks for reporting. I could confirm the exception you got by using the console and server files from the distribution. I got the right results, though, when I changed the contents of conf/remote-graph-binary.yaml to: hosts: [localhost] port: 8182 serializer: { className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry], serializeResultToString: true }} in this way, it matches the configs of gremlin-server in conf/gremlin-server/gremin-server.yaml I will post a ticket for it. Best wishes, Marc |
|
hadoopmarc@...
|
|
Thank you Marc, I was able to reproduce your sample by console: :remote connect tinkerpop.server conf/remote.yaml session # it is GryoMessageSerializerV3d0 - no problem here, but must have serializeResultToString: true :remote connect tinkerpop.server conf/remote-graph-binary.yaml session :> g.V().properties("some") ==> Server error - Error during serialization: java.lang.IllegalStateException. :> g.V().properties("some").hasNext() => true, it is actually working in this context, where server testing the results, not the client after serialization. It is fine when "remote-graph-binary.yaml" configuration is equipped with serializeResultToString: true.
That hint should indicate that our server is different that the driver we use in java to remote access, but with more debugging I cannot say where is it... We run JanusGraph services through "bin/gremlin-server-websoc.sh", that suppose to run new Binary Driver with gremlin-server-websoc.yaml (+serializeResultToString: true). Then we getting remote access from Java by connection with MessageSerializer<?> serializer = new GraphBinaryMessageSerializerV1(typeSerializerRegistry); To be sure, we have true for serializeResultToString in the configuration, we even modified that on fly: final Map<String, Object> cfg = new HashMap<>(); cfg.put("serializeResultToString",true); serializer.configure(cfg, null); With serializeResultToString(true) we have the same exception IllegalStageException as initially described, with (false) it is faling everywhere, on simple command like: GraphTraversal<Vertex, Vertex> t = g.V().hasLabel(label).has(property, value); if (t.hasNext()) { // java.lang.ClassCastException: java.lang.String cannot be cast to org.apache.tinkerpop.gremlin.process.remote.traversal.RemoteTraverser so for serializeResultToString(true), all is fine, except "gv().properties()",... somehow we have good driver config for remote access. Regards, Chris
|
|
hadoopmarc@...
Hi Chris,
Hard to interpret your report. It maybe worthwhile to try the documented way of remote connection with traversal.withRemote(...) or Cluster.open(...): https://tinkerpop.apache.org/docs/current/reference/#gremlin-java-connecting There should be no need to instantiate serializer objects yourself. Best wishes, Marc |
|