I'm trying to set a unique requestId on a gremlin query as outlined in the Neptune best practise.
But when I do so, I get a null pointer exception on code that works fine without it.
I'm using the 3.4.2 Gremlin client driver, Java 11, and the unit test is executing against a test container running tinkerpop/gremlin-server:3.4.1
Here's my code:
GraphTraversalSource g = factory.getReadOnlyTraversal();
return g.with(Tokens.REQUEST_ID, UUID.randomUUID()).V(group.getId()).
out("discussing").
project("id", "topic", "comments").
by(T.id).
by("topic").
by(__.in("commenting_on").order(Scope.local).
project("id", "text", "timestamp", "user").
by(T.id).by("text").by("timestamp").
by(__.in("is_commenting").valueMap(true)).fold()
)
.toStream()
.map(discussionBuilder::from)
.collect(Collectors.toSet());
and here's the stack trace:
java.util.concurrent.CompletionException: java.lang.NullPointerException
at java.base/java.util.concurrent.CompletableFuture.reportJoin(CompletableFuture.java:412)
at java.base/java.util.concurrent.CompletableFuture.join(CompletableFuture.java:2044)
at org.apache.tinkerpop.gremlin.driver.ResultSet.one(ResultSet.java:119)
at org.apache.tinkerpop.gremlin.driver.ResultSet$1.hasNext(ResultSet.java:171)
at org.apache.tinkerpop.gremlin.driver.ResultSet$1.next(ResultSet.java:178)
at org.apache.tinkerpop.gremlin.driver.ResultSet$1.next(ResultSet.java:165)
at org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteTraversal$TraverserIterator.next(DriverRemoteTraversal.java:140)
at org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteTraversal$TraverserIterator.next(DriverRemoteTraversal.java:125)
at org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteTraversal.nextTraverser(DriverRemoteTraversal.java:106)
at org.apache.tinkerpop.gremlin.process.remote.traversal.step.map.RemoteStep.processNextStart(RemoteStep.java:80)
at org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep.next(AbstractStep.java:128)
at org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep.next(AbstractStep.java:38)
at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.next(DefaultTraversal.java:204)
at org.apache.tinkerpop.gremlin.process.traversal.Traversal.forEachRemaining(Traversal.java:265)
at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
at com.yooblr.yooblrweb.domain.discussions.repositories.GremlinDiscussionsRepositoryImpl.getDiscussions(GremlinDiscussionsRepositoryImpl.java:54)
at com.yooblr.yooblrweb.domain.discussions.repositories.GremlinDiscussionsRepositoryImplTest.whenGettingDiscussions(GremlinDiscussionsRepositoryImplTest.java:70)
at com.yooblr.yooblrweb.domain.discussions.repositories.GremlinDiscussionsRepositoryImplTest.multiple(GremlinDiscussionsRepositoryImplTest.java:38)
...
Caused by: java.lang.NullPointerException
at java.base/java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:936)
at org.apache.tinkerpop.gremlin.driver.Handler$GremlinResponseHandler.channelRead0(Handler.java:221)
at org.apache.tinkerpop.gremlin.driver.Handler$GremlinResponseHandler.channelRead0(Handler.java:198)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
at org.apache.tinkerpop.gremlin.driver.Handler$GremlinSaslAuthenticationHandler.channelRead0(Handler.java:124)
at org.apache.tinkerpop.gremlin.driver.Handler$GremlinSaslAuthenticationHandler.channelRead0(Handler.java:68)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
at org.apache.tinkerpop.gremlin.driver.handler.WebSocketClientHandler.channelRead0(WebSocketClientHandler.java:89)
...
Same issue happens when I try to set a query timeout:
return g.with(Tokens.ARGS_SCRIPT_EVAL_TIMEOUT, 500L).V(group.getId()).
This functionality was introduced in Apache TinkerPop version 3.4.2. You need both the client and the server to be at the 3.4.2 level (or higher) in order for this to work. Amazon Neptune currently supports Apache TinkerPop at the 3.4.1 level. Once 3.4.2 is supported everything should work. Sorry for any confusion the documentation may have caused.