From e37f2f08eee0175514c59a56ce6e1a1fdcb16e89 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Mon, 10 Aug 2020 11:43:57 +0200 Subject: [PATCH] DATAREDIS-1190 - Cluster rename now correctly overwrites existing keys. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rename(…) behavior in cluster-mode is now aligned with standalone Redis behavior that overwrites the target key if it already exists and the renamed key uses a different slot. Previously, the underlying restore command was called without the replace option which caused BUSYKEY failures. Original Pull Request: #555 --- .../connection/jedis/JedisClusterKeyCommands.java | 2 +- .../lettuce/LettuceClusterKeyCommands.java | 2 +- .../redis/connection/ClusterConnectionTests.java | 3 +++ .../jedis/JedisClusterConnectionTests.java | 12 ++++++++++++ .../lettuce/LettuceClusterConnectionTests.java | 12 ++++++++++++ 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/redis/connection/jedis/JedisClusterKeyCommands.java b/src/main/java/org/springframework/data/redis/connection/jedis/JedisClusterKeyCommands.java index 9b2eb704e..11405f851 100644 --- a/src/main/java/org/springframework/data/redis/connection/jedis/JedisClusterKeyCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/jedis/JedisClusterKeyCommands.java @@ -270,7 +270,7 @@ class JedisClusterKeyCommands implements RedisKeyCommands { if (value != null && value.length > 0) { - restore(targetKey, 0, value); + restore(targetKey, 0, value, true); del(sourceKey); } } diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClusterKeyCommands.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClusterKeyCommands.java index fd1758c82..0d10e4d68 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClusterKeyCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClusterKeyCommands.java @@ -118,7 +118,7 @@ class LettuceClusterKeyCommands extends LettuceKeyCommands { if (value != null && value.length > 0) { - restore(targetKey, 0, value); + restore(targetKey, 0, value, true); del(sourceKey); } } diff --git a/src/test/java/org/springframework/data/redis/connection/ClusterConnectionTests.java b/src/test/java/org/springframework/data/redis/connection/ClusterConnectionTests.java index d14ba43fe..54e4aaef3 100644 --- a/src/test/java/org/springframework/data/redis/connection/ClusterConnectionTests.java +++ b/src/test/java/org/springframework/data/redis/connection/ClusterConnectionTests.java @@ -413,6 +413,9 @@ public interface ClusterConnectionTests { // DATAREDIS-315 void rename(); + // DATAREDIS-1190 + void renameShouldOverwriteTargetKey(); + // DATAREDIS-315 void renameNXWhenOnSameSlot(); diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionTests.java index 6c5203bcf..7dbddc466 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionTests.java @@ -1421,6 +1421,18 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { assertThat(nativeConnection.get(KEY_2_BYTES)).isEqualTo(VALUE_1_BYTES); } + @Test // DATAREDIS-1190 + public void renameShouldOverwriteTargetKey() { + + nativeConnection.set(KEY_1_BYTES, VALUE_1_BYTES); + nativeConnection.set(KEY_2_BYTES, VALUE_2_BYTES); + + clusterConnection.rename(KEY_1_BYTES, KEY_2_BYTES); + + assertThat(nativeConnection.exists(KEY_1_BYTES)).isFalse(); + assertThat(nativeConnection.get(KEY_2_BYTES)).isEqualTo(VALUE_1_BYTES); + } + @Test // DATAREDIS-315 public void renameNXWhenOnSameSlot() { diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnectionTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnectionTests.java index b00a45e61..46d278569 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnectionTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnectionTests.java @@ -1437,6 +1437,18 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { assertThat(nativeConnection.get(KEY_2)).isEqualTo(VALUE_1); } + @Test // DATAREDIS-1190 + public void renameShouldOverwriteTargetKey() { + + nativeConnection.set(KEY_1, VALUE_1); + nativeConnection.set(KEY_2, VALUE_2); + + clusterConnection.rename(KEY_1_BYTES, KEY_2_BYTES); + + assertThat(nativeConnection.exists(KEY_1)).isEqualTo(0L); + assertThat(nativeConnection.get(KEY_2)).isEqualTo(VALUE_1); + } + @Test // DATAREDIS-315 public void renameNXWhenOnSameSlot() {