Search code examples
gremlintinkerpoptinkerpop3gremlin-serveramazon-neptune

null pointer when trying to set unique request id on gremlin query using `with`


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()).

Solution

  • 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.