This is an automated email from the ASF dual-hosted git repository. jensdeppe pushed a commit to branch feature/redis-lists-interview in repository https://gitbox.apache.org/repos/asf/geode.git
commit bd96ca2d5f60946279c63690b6892c08ae7ca713 Author: Jens Deppe <[email protected]> AuthorDate: Tue Jan 25 06:47:22 2022 -0800 Initial commit --- .../list/RedisListNativeRedisAcceptanceTest.java} | 30 +++++++--- .../list/AbstractRedisListIntegrationTest.java | 46 +++++++++++++++ .../executor/list/RedisListIntegrationTest.java} | 22 ++++--- .../geode/redis/internal/GeodeRedisService.java | 2 + .../redis/internal/commands/RedisCommandType.java | 9 +++ .../commands/executor/list/LLenExecutor.java | 38 ++++++++++++ .../commands/executor/list/LPopExecutor.java | 43 ++++++++++++++ .../commands/executor/list/LPushExecutor.java | 42 +++++++++++++ .../internal/data/NullRedisDataStructures.java | 1 + ...RedisDataStructures.java => NullRedisList.java} | 18 ++++-- .../geode/redis/internal/data/RedisDataType.java | 2 + .../geode/redis/internal/data/RedisList.java | 68 ++++++++++++++++++++++ .../internal/netty/ExecutionHandlerContext.java | 11 +++- .../serialization/DataSerializableFixedID.java | 1 + 14 files changed, 311 insertions(+), 22 deletions(-) diff --git a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisDataStructures.java b/geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/list/RedisListNativeRedisAcceptanceTest.java similarity index 61% copy from geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisDataStructures.java copy to geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/list/RedisListNativeRedisAcceptanceTest.java index e0e750e..9de54ea 100644 --- a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisDataStructures.java +++ b/geode-for-redis/src/acceptanceTest/java/org/apache/geode/redis/internal/commands/executor/list/RedisListNativeRedisAcceptanceTest.java @@ -12,12 +12,26 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.apache.geode.redis.internal.data; - -public class NullRedisDataStructures { - public static final NullRedisString NULL_REDIS_STRING = new NullRedisString(); - public static final NullRedisSet NULL_REDIS_SET = new NullRedisSet(); - public static final NullRedisSortedSet NULL_REDIS_SORTED_SET = new NullRedisSortedSet(); - public static final NullRedisHash NULL_REDIS_HASH = new NullRedisHash(); - public static final NullRedisData NULL_REDIS_DATA = new NullRedisData(); +package org.apache.geode.redis.internal.commands.executor.list; + + +import org.junit.ClassRule; + +import org.apache.geode.redis.NativeRedisClusterTestRule; + +public class RedisListNativeRedisAcceptanceTest extends AbstractRedisListIntegrationTest { + + @ClassRule + public static NativeRedisClusterTestRule redis = new NativeRedisClusterTestRule(); + + @Override + public int getPort() { + return redis.getExposedPorts().get(0); + } + + @Override + public void flushAll() { + redis.flushAll(); + } + } diff --git a/geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/AbstractRedisListIntegrationTest.java b/geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/AbstractRedisListIntegrationTest.java new file mode 100644 index 0000000..446016f --- /dev/null +++ b/geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/AbstractRedisListIntegrationTest.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.apache.geode.redis.internal.commands.executor.list; + +import static org.apache.geode.test.dunit.rules.RedisClusterStartupRule.BIND_ADDRESS; +import static org.apache.geode.test.dunit.rules.RedisClusterStartupRule.REDIS_CLIENT_TIMEOUT; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import redis.clients.jedis.HostAndPort; +import redis.clients.jedis.JedisCluster; + +import org.apache.geode.redis.RedisIntegrationTest; + +public abstract class AbstractRedisListIntegrationTest implements RedisIntegrationTest { + private JedisCluster jedis; + + @Before + public void setUp() { + jedis = new JedisCluster(new HostAndPort(BIND_ADDRESS, getPort()), REDIS_CLIENT_TIMEOUT); + } + + @After + public void tearDown() { + flushAll(); + jedis.close(); + } + + @Test + public void firstTest() { + } + +} diff --git a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisDataStructures.java b/geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/RedisListIntegrationTest.java similarity index 62% copy from geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisDataStructures.java copy to geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/RedisListIntegrationTest.java index e0e750e..4eb8188 100644 --- a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisDataStructures.java +++ b/geode-for-redis/src/integrationTest/java/org/apache/geode/redis/internal/commands/executor/list/RedisListIntegrationTest.java @@ -12,12 +12,20 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ -package org.apache.geode.redis.internal.data; +package org.apache.geode.redis.internal.commands.executor.list; -public class NullRedisDataStructures { - public static final NullRedisString NULL_REDIS_STRING = new NullRedisString(); - public static final NullRedisSet NULL_REDIS_SET = new NullRedisSet(); - public static final NullRedisSortedSet NULL_REDIS_SORTED_SET = new NullRedisSortedSet(); - public static final NullRedisHash NULL_REDIS_HASH = new NullRedisHash(); - public static final NullRedisData NULL_REDIS_DATA = new NullRedisData(); + +import org.junit.ClassRule; + +import org.apache.geode.redis.GeodeRedisServerRule; + +public class RedisListIntegrationTest extends AbstractRedisListIntegrationTest { + + @ClassRule + public static GeodeRedisServerRule server = new GeodeRedisServerRule(); + + @Override + public int getPort() { + return server.getPort(); + } } diff --git a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/GeodeRedisService.java b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/GeodeRedisService.java index 1573ffe..6a72f37 100644 --- a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/GeodeRedisService.java +++ b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/GeodeRedisService.java @@ -31,6 +31,7 @@ import org.apache.geode.management.internal.beans.CacheServiceMBeanBase; import org.apache.geode.redis.internal.data.NullRedisData; import org.apache.geode.redis.internal.data.RedisHash; import org.apache.geode.redis.internal.data.RedisKey; +import org.apache.geode.redis.internal.data.RedisList; import org.apache.geode.redis.internal.data.RedisSet; import org.apache.geode.redis.internal.data.RedisSortedSet; import org.apache.geode.redis.internal.data.RedisString; @@ -60,6 +61,7 @@ public class GeodeRedisService implements CacheService, ResourceEventsListener, registrar.register(DataSerializableFixedID.REDIS_KEY, RedisKey.class); registrar.register(DataSerializableFixedID.PUBLISH_REQUEST, Publisher.PublishRequest.class); + registrar.register(DataSerializableFixedID.REDIS_LIST_ID, RedisList.class); registrar.register(DataSerializableFixedID.REDIS_SET_ID, RedisSet.class); registrar.register(DataSerializableFixedID.REDIS_STRING_ID, RedisString.class); registrar.register(DataSerializableFixedID.REDIS_HASH_ID, RedisHash.class); diff --git a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/RedisCommandType.java b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/RedisCommandType.java index 03a9d8e..1ef570f 100755 --- a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/RedisCommandType.java +++ b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/RedisCommandType.java @@ -75,6 +75,9 @@ import org.apache.geode.redis.internal.commands.executor.key.RestoreExecutor; import org.apache.geode.redis.internal.commands.executor.key.ScanExecutor; import org.apache.geode.redis.internal.commands.executor.key.TTLExecutor; import org.apache.geode.redis.internal.commands.executor.key.TypeExecutor; +import org.apache.geode.redis.internal.commands.executor.list.LLenExecutor; +import org.apache.geode.redis.internal.commands.executor.list.LPopExecutor; +import org.apache.geode.redis.internal.commands.executor.list.LPushExecutor; import org.apache.geode.redis.internal.commands.executor.pubsub.PsubscribeExecutor; import org.apache.geode.redis.internal.commands.executor.pubsub.PubSubExecutor; import org.apache.geode.redis.internal.commands.executor.pubsub.PublishExecutor; @@ -293,6 +296,12 @@ public enum RedisCommandType { ZUNIONSTORE(new ZUnionStoreExecutor(), SUPPORTED, new Parameter().min(4).flags(WRITE, DENYOOM, MOVABLEKEYS)), + /************** Lists *****************/ + + LLEN(new LLenExecutor(), SUPPORTED, new Parameter().exact(2).flags(READONLY, FAST)), + LPOP(new LPopExecutor(), SUPPORTED, new Parameter().min(2).flags(WRITE, FAST)), + LPUSH(new LPushExecutor(), SUPPORTED, new Parameter().min(3).flags(WRITE, DENYOOM, FAST)), + /************* Server *****************/ COMMAND(new COMMANDCommandExecutor(), SUPPORTED, new Parameter().min(1).firstKey(0).flags(RANDOM, LOADING, STALE)), diff --git a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/list/LLenExecutor.java b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/list/LLenExecutor.java new file mode 100644 index 0000000..c4b6353 --- /dev/null +++ b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/list/LLenExecutor.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.apache.geode.redis.internal.commands.executor.list; + + +import org.apache.geode.cache.Region; +import org.apache.geode.redis.internal.commands.Command; +import org.apache.geode.redis.internal.commands.executor.CommandExecutor; +import org.apache.geode.redis.internal.commands.executor.RedisResponse; +import org.apache.geode.redis.internal.data.RedisData; +import org.apache.geode.redis.internal.data.RedisKey; +import org.apache.geode.redis.internal.netty.ExecutionHandlerContext; + +public class LLenExecutor implements CommandExecutor { + + @Override + public RedisResponse executeCommand(Command command, ExecutionHandlerContext context) { + Region<RedisKey, RedisData> region = context.getRegion(); + RedisKey key = command.getKey(); + + int result = context.listLockedExecute(key, true, + list -> list.llen()); + + return RedisResponse.integer(result); + } +} diff --git a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/list/LPopExecutor.java b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/list/LPopExecutor.java new file mode 100644 index 0000000..d7bcd51 --- /dev/null +++ b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/list/LPopExecutor.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.apache.geode.redis.internal.commands.executor.list; + + + +import org.apache.geode.cache.Region; +import org.apache.geode.redis.internal.commands.Command; +import org.apache.geode.redis.internal.commands.executor.CommandExecutor; +import org.apache.geode.redis.internal.commands.executor.RedisResponse; +import org.apache.geode.redis.internal.commands.parameters.RedisParametersMismatchException; +import org.apache.geode.redis.internal.data.RedisData; +import org.apache.geode.redis.internal.data.RedisKey; +import org.apache.geode.redis.internal.netty.ExecutionHandlerContext; + +public class LPopExecutor implements CommandExecutor { + + @Override + public RedisResponse executeCommand(Command command, ExecutionHandlerContext context) { + Region<RedisKey, RedisData> region = context.getRegion(); + RedisKey key = command.getKey(); + // TODO: Size check needed until we implement 'count' arg (Redis 6.2+) + if (command.getProcessedCommand().size() > 2) { + throw new RedisParametersMismatchException(command.wrongNumberOfArgumentsErrorMessage()); + } + byte[] popped = context.listLockedExecute(key, false, + list -> list.lpop(region, key)); + + return RedisResponse.bulkString(popped); + } +} diff --git a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/list/LPushExecutor.java b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/list/LPushExecutor.java new file mode 100644 index 0000000..2b6973e --- /dev/null +++ b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/commands/executor/list/LPushExecutor.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.apache.geode.redis.internal.commands.executor.list; + +import java.util.List; + +import org.apache.geode.cache.Region; +import org.apache.geode.redis.internal.commands.Command; +import org.apache.geode.redis.internal.commands.executor.CommandExecutor; +import org.apache.geode.redis.internal.commands.executor.RedisResponse; +import org.apache.geode.redis.internal.data.RedisData; +import org.apache.geode.redis.internal.data.RedisKey; +import org.apache.geode.redis.internal.netty.ExecutionHandlerContext; + +public class LPushExecutor implements CommandExecutor { + + @Override + public RedisResponse executeCommand(Command command, ExecutionHandlerContext context) { + List<byte[]> commandElements = command.getProcessedCommand(); + Region<RedisKey, RedisData> region = context.getRegion(); + RedisKey key = command.getKey(); + + List<byte[]> elementsToAdd = commandElements.subList(2, commandElements.size()); + + long entriesAdded = context.listLockedExecute(key, false, + list -> list.lpush(elementsToAdd, region, key)); + + return RedisResponse.integer(entriesAdded); + } +} diff --git a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisDataStructures.java b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisDataStructures.java index e0e750e..5f16975 100644 --- a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisDataStructures.java +++ b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisDataStructures.java @@ -20,4 +20,5 @@ public class NullRedisDataStructures { public static final NullRedisSortedSet NULL_REDIS_SORTED_SET = new NullRedisSortedSet(); public static final NullRedisHash NULL_REDIS_HASH = new NullRedisHash(); public static final NullRedisData NULL_REDIS_DATA = new NullRedisData(); + public static final NullRedisList NULL_REDIS_LIST = new NullRedisList(); } diff --git a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisDataStructures.java b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisList.java similarity index 65% copy from geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisDataStructures.java copy to geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisList.java index e0e750e..4104cbc 100644 --- a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisDataStructures.java +++ b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisList.java @@ -12,12 +12,18 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ + package org.apache.geode.redis.internal.data; -public class NullRedisDataStructures { - public static final NullRedisString NULL_REDIS_STRING = new NullRedisString(); - public static final NullRedisSet NULL_REDIS_SET = new NullRedisSet(); - public static final NullRedisSortedSet NULL_REDIS_SORTED_SET = new NullRedisSortedSet(); - public static final NullRedisHash NULL_REDIS_HASH = new NullRedisHash(); - public static final NullRedisData NULL_REDIS_DATA = new NullRedisData(); +class NullRedisList extends RedisList { + + NullRedisList() { + super(); + } + + @Override + public boolean isNull() { + return true; + } + } diff --git a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisDataType.java b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisDataType.java index e44eafe..dfb26c6 100755 --- a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisDataType.java +++ b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisDataType.java @@ -18,6 +18,7 @@ package org.apache.geode.redis.internal.data; import static org.apache.geode.redis.internal.data.NullRedisDataStructures.NULL_REDIS_DATA; import static org.apache.geode.redis.internal.data.NullRedisDataStructures.NULL_REDIS_HASH; +import static org.apache.geode.redis.internal.data.NullRedisDataStructures.NULL_REDIS_LIST; import static org.apache.geode.redis.internal.data.NullRedisDataStructures.NULL_REDIS_SET; import static org.apache.geode.redis.internal.data.NullRedisDataStructures.NULL_REDIS_SORTED_SET; import static org.apache.geode.redis.internal.data.NullRedisDataStructures.NULL_REDIS_STRING; @@ -28,6 +29,7 @@ public enum RedisDataType { REDIS_STRING("string", NULL_REDIS_STRING), REDIS_HASH("hash", NULL_REDIS_HASH), REDIS_SET("set", NULL_REDIS_SET), + REDIS_LIST("list", NULL_REDIS_LIST), REDIS_SORTED_SET("sortedset", NULL_REDIS_SORTED_SET); private final String toStringValue; diff --git a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisList.java b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisList.java new file mode 100644 index 0000000..11f2902 --- /dev/null +++ b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/data/RedisList.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package org.apache.geode.redis.internal.data; + +import static org.apache.geode.redis.internal.data.RedisDataType.REDIS_LIST; + +import java.util.List; + +import org.apache.geode.cache.Region; +import org.apache.geode.internal.serialization.DataSerializableFixedID; +import org.apache.geode.internal.serialization.KnownVersion; + +public class RedisList extends AbstractRedisData { + + public RedisList() { + } + + public long lpush(List<byte[]> elementsToAdd, Region<RedisKey, RedisData> region, RedisKey key) { + return 0; + } + + public byte[] lpop(Region<RedisKey, RedisData> region, RedisKey key) { + return null; + } + + public int llen() { + return 0; + } + + @Override + public int getDSFID() { + return DataSerializableFixedID.REDIS_LIST_ID; + } + + @Override + public RedisDataType getType() { + return REDIS_LIST; + } + + @Override + public int getSizeInBytes() { + return 0; + } + + @Override + protected boolean removeFromRegion() { + return false; + } + + @Override + public KnownVersion[] getSerializationVersions() { + return new KnownVersion[0]; + } + +} diff --git a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/netty/ExecutionHandlerContext.java b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/netty/ExecutionHandlerContext.java index c375851..21c08ad 100644 --- a/geode-for-redis/src/main/java/org/apache/geode/redis/internal/netty/ExecutionHandlerContext.java +++ b/geode-for-redis/src/main/java/org/apache/geode/redis/internal/netty/ExecutionHandlerContext.java @@ -58,6 +58,7 @@ import org.apache.geode.redis.internal.data.RedisDataType; import org.apache.geode.redis.internal.data.RedisDataTypeMismatchException; import org.apache.geode.redis.internal.data.RedisHash; import org.apache.geode.redis.internal.data.RedisKey; +import org.apache.geode.redis.internal.data.RedisList; import org.apache.geode.redis.internal.data.RedisSet; import org.apache.geode.redis.internal.data.RedisSortedSet; import org.apache.geode.redis.internal.data.RedisString; @@ -486,17 +487,25 @@ public class ExecutionHandlerContext extends ChannelInboundHandlerAdapter { return getRegionProvider().getTypedRedisData(RedisDataType.REDIS_SORTED_SET, key, updateStats); } - public <R> R setLockedExecute(RedisKey key, boolean updateStats, FailableFunction<RedisSet, R> function) { return getRegionProvider().lockedExecute(key, () -> function.apply(getRedisSet(key, updateStats))); } + public <R> R listLockedExecute(RedisKey key, boolean updateStats, + FailableFunction<RedisList, R> function) { + return getRegionProvider().lockedExecute(key, + () -> function.apply(getRedisList(key, updateStats))); + } + public RedisSet getRedisSet(RedisKey key, boolean updateStats) { return getRegionProvider().getTypedRedisData(RedisDataType.REDIS_SET, key, updateStats); } + private RedisList getRedisList(RedisKey key, boolean updateStats) { + return getRegionProvider().getTypedRedisData(RedisDataType.REDIS_LIST, key, updateStats); + } public <R> R dataLockedExecute(RedisKey key, boolean updateStats, FailableFunction<RedisData, R> function) { diff --git a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/DataSerializableFixedID.java b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/DataSerializableFixedID.java index 73fbcad..d82763f 100644 --- a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/DataSerializableFixedID.java +++ b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/DataSerializableFixedID.java @@ -693,6 +693,7 @@ public interface DataSerializableFixedID extends SerializationVersions, BasicSer // 2190 unused short REDIS_MEMBER_INFO_ID = 2191; short REDIS_SORTED_SET_ID = 2192; + short REDIS_LIST_ID = 2193; // NOTE, codes > 65535 will take 4 bytes to serialize /**
