From 1709d195236be43a0d84e9b2673a473cf72f98de 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 2bd95a549..b0d21c3e3 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 @@ -269,7 +269,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 f7e78c80c..8d9aa216a 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 @@ -1412,6 +1412,18 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { assertThat(nativeConnection.get(KEY_2_BYTES), is(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), is(false)); + assertThat(nativeConnection.get(KEY_2_BYTES), is(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 b044dd1da..907001170 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 @@ -1430,6 +1430,18 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { assertThat(nativeConnection.get(KEY_2), is(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), is(0L)); + assertThat(nativeConnection.get(KEY_2), is(VALUE_1)); + } + @Test // DATAREDIS-315 public void renameNXWhenOnSameSlot() {