Description
Bug Report
Current Behavior
jsonArrpop fails when popping from an empty array
Stack trace
{"name":"testStarted","attributes":{"name":"org.infinispan.server.resp.JsonCommandsTest#testJSONARRPOPRedis\\[authz\\\u003dfalse\\]()"}}{"name":"testFailed","attributes":{"name":"org.infinispan.server.resp.JsonCommandsTest#testJSONARRPOPRedis\\[authz\\\u003dfalse\\]()","message":"Cannot invoke "java.nio.ByteBuffer.remaining()" because "bytes" is null","trace":"java.lang.NullPointerException: Cannot invoke "java.nio.ByteBuffer.remaining()" because "bytes" is null
at io.lettuce.core.output.JsonValueListOutput.set(JsonValueListOutput.java:42)
at io.lettuce.core.protocol.RedisStateMachine.safeSet(RedisStateMachine.java:814)
at io.lettuce.core.protocol.RedisStateMachine.handleNull(RedisStateMachine.java:421)
at io.lettuce.core.protocol.RedisStateMachine$State$Type.handle(RedisStateMachine.java:210)
at io.lettuce.core.protocol.RedisStateMachine.doDecode(RedisStateMachine.java:363)
at io.lettuce.core.protocol.RedisStateMachine.decode(RedisStateMachine.java:324)
at io.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:857)
at io.lettuce.core.protocol.CommandHandler.decode0(CommandHandler.java:808)
at io.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:782)
at io.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:674)
at io.lettuce.core.protocol.CommandHandler.channelRead(CommandHandler.java:614)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1407)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:918)
at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:799)
at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:501)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:399)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:994)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:840)
","duration":"73"}}
Input Code
Input Code
@Test
public void testJSONARRPOPRedis() {
RedisCommands<String,String> redis = RedisClient.create("redis://localhost:6379").connect().sync();
JsonPath jp = new JsonPath("$");
JsonValue jv = defaultJsonParser.createJsonValue("""
["one"]
""");
String key = k();
redis.jsonSet(key, jp, jv);
List<JsonValue> result = redis.jsonArrpop(key);
assertThat(result.toString()).isEqualTo("[\"one\"]");
result = redis.jsonArrpop(key, jp, 0);
assertThat(result.get(0).isNull()).isTrue();
}
Expected behavior/code
as per documentation popping from an empt array should return null (JsonValue null node?)
Environment
- Lettuce version(s): 6.5.4.RELEASE
- Redis version: [e.g. 4.0.9]
127.0.0.1:6379> info
Server
redis_version:7.4.2