From be9dc81fdb4bbb5d329bc18eb9b9aced051d1d86 Mon Sep 17 00:00:00 2001 From: Jens Deppe Date: Fri, 13 May 2022 10:01:42 -0700 Subject: [PATCH] BZPOPMAX returns minimum value when called with a Duration - Specifically, usage of the API `ZSetOperations.popMax(K key, Duration timeout)` will produce incorrect results. --- .../springframework/data/redis/core/ZSetOperations.java | 2 +- .../redis/core/DefaultZSetOperationsIntegrationTests.java | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/redis/core/ZSetOperations.java b/src/main/java/org/springframework/data/redis/core/ZSetOperations.java index 280d325506..eb678a0cd9 100644 --- a/src/main/java/org/springframework/data/redis/core/ZSetOperations.java +++ b/src/main/java/org/springframework/data/redis/core/ZSetOperations.java @@ -525,7 +525,7 @@ default TypedTuple popMax(K key, Duration timeout) { Assert.notNull(timeout, "Timeout must not be null"); Assert.isTrue(!timeout.isNegative(), "Timeout must not be negative"); - return popMin(key, TimeoutUtils.toSeconds(timeout), TimeUnit.SECONDS); + return popMax(key, TimeoutUtils.toSeconds(timeout), TimeUnit.SECONDS); } /** diff --git a/src/test/java/org/springframework/data/redis/core/DefaultZSetOperationsIntegrationTests.java b/src/test/java/org/springframework/data/redis/core/DefaultZSetOperationsIntegrationTests.java index ae9347c3b4..188884d31a 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultZSetOperationsIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultZSetOperationsIntegrationTests.java @@ -20,6 +20,7 @@ import static org.assertj.core.data.Offset.offset; import java.io.IOException; +import java.time.Duration; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -138,16 +139,19 @@ void testLexCountBounded() { void testPopMin() { K key = keyFactory.instance(); + V value0 = valueFactory.instance(); V value1 = valueFactory.instance(); V value2 = valueFactory.instance(); V value3 = valueFactory.instance(); V value4 = valueFactory.instance(); + zSetOps.add(key, value0, 0); zSetOps.add(key, value1, 1); zSetOps.add(key, value2, 2); zSetOps.add(key, value3, 3); zSetOps.add(key, value4, 4); + assertThat(zSetOps.popMin(key, Duration.ofSeconds(1))).isEqualTo(new DefaultTypedTuple<>(value0, 0d)); assertThat(zSetOps.popMin(key)).isEqualTo(new DefaultTypedTuple<>(value1, 1d)); assertThat(zSetOps.popMin(key, 2)).containsExactly(new DefaultTypedTuple<>(value2, 2d), new DefaultTypedTuple<>(value3, 3d)); @@ -163,12 +167,15 @@ void testPopMax() { V value2 = valueFactory.instance(); V value3 = valueFactory.instance(); V value4 = valueFactory.instance(); + V value5 = valueFactory.instance(); zSetOps.add(key, value1, 1); zSetOps.add(key, value2, 2); zSetOps.add(key, value3, 3); zSetOps.add(key, value4, 4); + zSetOps.add(key, value5, 5); + assertThat(zSetOps.popMax(key, Duration.ofSeconds(1))).isEqualTo(new DefaultTypedTuple<>(value5, 5d)); assertThat(zSetOps.popMax(key)).isEqualTo(new DefaultTypedTuple<>(value4, 4d)); assertThat(zSetOps.popMax(key, 2)).containsExactly(new DefaultTypedTuple<>(value3, 3d), new DefaultTypedTuple<>(value2, 2d));