From f13ff2b4b50df230ec597a884c48a217fefe941c Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Wed, 3 May 2023 09:58:23 +0300 Subject: [PATCH] Fixed - RMap.keySet() throws NPE if CompositeCodec used. #5006 --- redisson/src/main/java/org/redisson/RedissonMap.java | 9 ++++++--- .../src/main/java/org/redisson/RedissonMapCache.java | 10 ++++------ redisson/src/test/java/org/redisson/BaseMapTest.java | 10 +++++++++- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/redisson/src/main/java/org/redisson/RedissonMap.java b/redisson/src/main/java/org/redisson/RedissonMap.java index 189bfa190..d7dd4ef1d 100644 --- a/redisson/src/main/java/org/redisson/RedissonMap.java +++ b/redisson/src/main/java/org/redisson/RedissonMap.java @@ -27,7 +27,7 @@ import org.redisson.client.codec.StringCodec; import org.redisson.client.protocol.RedisCommand; import org.redisson.client.protocol.RedisCommands; import org.redisson.client.protocol.convertor.NumberConvertor; -import org.redisson.client.protocol.decoder.MapValueDecoder; +import org.redisson.client.protocol.decoder.*; import org.redisson.command.CommandAsyncExecutor; import org.redisson.command.CommandBatchService; import org.redisson.connection.decoder.MapGetAllDecoder; @@ -1484,14 +1484,17 @@ public class RedissonMap extends RedissonExpirable implements RMap { } public RFuture> scanKeyIteratorAsync(String name, RedisClient client, long startPos, String pattern, int count) { - List params = new ArrayList(); + List params = new ArrayList<>(); params.add(startPos); if (pattern != null) { params.add(pattern); } params.add(count); - return commandExecutor.evalReadAsync(client, name, codec, RedisCommands.EVAL_SCAN, + RedisCommand> evalScan = new RedisCommand>("EVAL", + new ListMultiDecoder2(new ListScanResultReplayDecoder(), new ObjectDecoder<>(codec.getMapKeyDecoder()))); + + return commandExecutor.evalReadAsync(client, name, codec, evalScan, "local result = {}; " + "local res; " + "if (#ARGV == 3) then " diff --git a/redisson/src/main/java/org/redisson/RedissonMapCache.java b/redisson/src/main/java/org/redisson/RedissonMapCache.java index 3ab716a4e..7b0fe2f15 100644 --- a/redisson/src/main/java/org/redisson/RedissonMapCache.java +++ b/redisson/src/main/java/org/redisson/RedissonMapCache.java @@ -1573,11 +1573,6 @@ public class RedissonMapCache extends RedissonMap implements RMapCac params.toArray()); } - private static final RedisCommand> KEY_SCAN = new RedisCommand>("EVAL", - new ListMultiDecoder2( - new MapCacheKeyScanResultDecoder(), - new ObjectListReplayDecoder<>())); - @Override public RFuture> scanKeyIteratorAsync(String name, RedisClient client, long startPos, String pattern, int count) { List params = new ArrayList<>(); @@ -1588,7 +1583,10 @@ public class RedissonMapCache extends RedissonMap implements RMapCac } params.add(count); - RFuture> future = commandExecutor.evalReadAsync(client, name, codec, KEY_SCAN, + RedisCommand> evalScan = new RedisCommand>("EVAL", + new ListMultiDecoder2(new MapCacheKeyScanResultDecoder(), new ObjectDecoder<>(codec.getMapKeyDecoder()))); + + RFuture> future = commandExecutor.evalReadAsync(client, name, codec, evalScan, "local result = {}; " + "local idleKeys = {}; " + "local res; " diff --git a/redisson/src/test/java/org/redisson/BaseMapTest.java b/redisson/src/test/java/org/redisson/BaseMapTest.java index 510412012..4ec80e5dd 100644 --- a/redisson/src/test/java/org/redisson/BaseMapTest.java +++ b/redisson/src/test/java/org/redisson/BaseMapTest.java @@ -878,7 +878,15 @@ public abstract class BaseMapTest extends BaseTest { assertThat(map.size()).isEqualTo(1); destroy(map); } - + + @Test + public void testKeySetByPatternCodec() { + RMap map = getMap("test", new CompositeCodec(StringCodec.INSTANCE, JsonJacksonCodec.INSTANCE)); + map.put("1-1", "test1"); + Set set = map.keySet("1-*"); + assertThat(set).containsOnly("1-1"); + } + @Test public void testKeySetByPattern() { RMap map = getMap("simple", StringCodec.INSTANCE);