This is an automated email from the ASF dual-hosted git repository. ringles pushed a commit to branch GEODE-9375-Implement-ZRANGE-Radish-command in repository https://gitbox.apache.org/repos/asf/geode.git
commit 702a0e16feb22224c87d52db47313fadf5a77c66 Author: Ray Ingles <ring...@vmware.com> AuthorDate: Thu Jul 1 16:19:11 2021 -0400 Fix bug in NullRedisSet zadd, fix updated entries leaving fossils in tree --- .../executor/sortedset/AbstractZRangeIntegrationTest.java | 9 ++++++++- .../apache/geode/redis/internal/data/NullRedisSortedSet.java | 2 +- .../org/apache/geode/redis/internal/data/RedisSortedSet.java | 5 ++++- .../apache/geode/redis/internal/data/RedisSortedSetTest.java | 11 ++++++++++- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/geode-apis-compatible-with-redis/src/integrationTest/java/org/apache/geode/redis/internal/executor/sortedset/AbstractZRangeIntegrationTest.java b/geode-apis-compatible-with-redis/src/integrationTest/java/org/apache/geode/redis/internal/executor/sortedset/AbstractZRangeIntegrationTest.java index d808d16..bcdfa60 100755 --- a/geode-apis-compatible-with-redis/src/integrationTest/java/org/apache/geode/redis/internal/executor/sortedset/AbstractZRangeIntegrationTest.java +++ b/geode-apis-compatible-with-redis/src/integrationTest/java/org/apache/geode/redis/internal/executor/sortedset/AbstractZRangeIntegrationTest.java @@ -82,7 +82,7 @@ public abstract class AbstractZRangeIntegrationTest implements RedisIntegrationT } @Test - public void shouldReturnSyntaxError_givenWrongWithScoresFlag() { + public void shouldReturnSyntaxError_givenInvalidWithScoresFlag() { jedis.zadd(SORTED_SET_KEY, 1.0, "member"); assertThatThrownBy( () -> jedis.sendCommand(SORTED_SET_KEY, Protocol.Command.ZRANGE, SORTED_SET_KEY, "1", "2", @@ -91,6 +91,13 @@ public abstract class AbstractZRangeIntegrationTest implements RedisIntegrationT } @Test + public void shouldNotRetainOldEntries_whenEntryUpdated() { + jedis.zadd(SORTED_SET_KEY, 2.0, "mem4"); + assertThat(jedis.zcard(SORTED_SET_KEY)).isEqualTo(members.size()); + assertThat(jedis.zrange(SORTED_SET_KEY, 0, 100).size()).isEqualTo(members.size()); + } + + @Test public void shouldReturnEmptyList_GivenInvalidRanges() { assertThat(jedis.zrange(SORTED_SET_KEY, 5, 0)).isEmpty(); assertThat(jedis.zrange(SORTED_SET_KEY, 27, 30)).isEmpty(); diff --git a/geode-apis-compatible-with-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisSortedSet.java b/geode-apis-compatible-with-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisSortedSet.java index 8028076..d74c89b 100644 --- a/geode-apis-compatible-with-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisSortedSet.java +++ b/geode-apis-compatible-with-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisSortedSet.java @@ -42,7 +42,7 @@ class NullRedisSortedSet extends RedisSortedSet { if (options.isINCR()) { return null; } - return 0L; + return 0; } if (options.isINCR()) { diff --git a/geode-apis-compatible-with-redis/src/main/java/org/apache/geode/redis/internal/data/RedisSortedSet.java b/geode-apis-compatible-with-redis/src/main/java/org/apache/geode/redis/internal/data/RedisSortedSet.java index 4f236af..a624248 100644 --- a/geode-apis-compatible-with-redis/src/main/java/org/apache/geode/redis/internal/data/RedisSortedSet.java +++ b/geode-apis-compatible-with-redis/src/main/java/org/apache/geode/redis/internal/data/RedisSortedSet.java @@ -171,11 +171,13 @@ public class RedisSortedSet extends AbstractRedisData { byte[] oldScore = null; OrderedSetEntry newEntry = new OrderedSetEntry(memberToAdd, scoreToAdd); - scoreSet.add(newEntry); OrderedSetEntry orderedSetEntry = members.put(memberToAdd, newEntry); if (orderedSetEntry == null) { + scoreSet.add(newEntry); sizeInBytes += calculateSizeOfFieldValuePair(memberToAdd, scoreToAdd); } else { + scoreSet.remove(orderedSetEntry); + scoreSet.add(newEntry); oldScore = orderedSetEntry.getScoreBytes(); sizeInBytes += scoreToAdd.length - oldScore.length; } @@ -350,6 +352,7 @@ public class RedisSortedSet extends AbstractRedisData { byte[] oldValue = null; OrderedSetEntry orderedSetEntry = members.remove(member); if (orderedSetEntry != null) { + scoreSet.remove(orderedSetEntry); oldValue = orderedSetEntry.getScoreBytes(); sizeInBytes -= calculateSizeOfFieldValuePair(member, oldValue); } diff --git a/geode-apis-compatible-with-redis/src/test/java/org/apache/geode/redis/internal/data/RedisSortedSetTest.java b/geode-apis-compatible-with-redis/src/test/java/org/apache/geode/redis/internal/data/RedisSortedSetTest.java index 5537cbe..f59058f 100644 --- a/geode-apis-compatible-with-redis/src/test/java/org/apache/geode/redis/internal/data/RedisSortedSetTest.java +++ b/geode-apis-compatible-with-redis/src/test/java/org/apache/geode/redis/internal/data/RedisSortedSetTest.java @@ -322,7 +322,6 @@ public class RedisSortedSetTest { assertThat(rangeList).isEmpty(); } - @Test public void zrange_ShouldReturnSimpleRanges() { Collection<byte[]> rangeList = rangeSortedSet.zrange(0, 5, false); @@ -378,6 +377,16 @@ public class RedisSortedSetTest { "member6".getBytes(), "1.5".getBytes()); } + @Test + public void scoreSet_shouldNotRetainOldEntries_whenEntriesUpdated() { + Collection<byte[]> rangeList = rangeSortedSet.zrange(0, 100, false); + assertThat(rangeList).hasSize(12); + assertThat(rangeList).containsExactly("member1".getBytes(), "1.0".getBytes(), + "member2".getBytes(), "1.1".getBytes(), "member3".getBytes(), "1.2".getBytes(), + "member4".getBytes(), "1.3".getBytes(), "member5".getBytes(), "1.4".getBytes(), + "member6".getBytes(), "1.5".getBytes()); + } + private RedisSortedSet createRedisSortedSet(String... membersAndScores) { final List<byte[]> membersAndScoresList = Arrays .stream(membersAndScores)