From e280a23550eb9236eef7c3a91f8d689edcbb61d2 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 24 Mar 2014 13:32:50 +0100 Subject: [PATCH] DATAREDIS-269 - Add support for 'CLIENT SETNAME'. Setting client name is possible for 'jedis', 'lettuce' and 'srp'. Using 'jredis' throws 'UnspupportedOperationException'. Original Pull Request: #54 --- .../appendix/appendix-command-reference.xml | 2 +- .../DefaultStringRedisConnection.java | 18 +++++++++++++++++ .../redis/connection/RedisServerCommands.java | 6 ++++++ .../connection/StringRedisConnection.java | 9 +++++++++ .../connection/jedis/JedisConnection.java | 13 ++++++++++++ .../connection/jredis/JredisConnection.java | 5 +++++ .../connection/lettuce/LettuceConnection.java | 15 ++++++++++++++ .../redis/connection/srp/SrpConnection.java | 20 +++++++++++++++++++ .../AbstractConnectionIntegrationTests.java | 8 ++++++++ .../DefaultStringRedisConnectionTests.java | 10 ++++++++++ ...disConnectionPipelineIntegrationTests.java | 8 ++++++++ ...ConnectionTransactionIntegrationTests.java | 9 +++++++++ .../JRedisConnectionIntegrationTests.java | 9 +++++++++ 13 files changed, 131 insertions(+), 1 deletion(-) diff --git a/docs/src/reference/docbook/appendix/appendix-command-reference.xml b/docs/src/reference/docbook/appendix/appendix-command-reference.xml index f00bd788e..224230164 100644 --- a/docs/src/reference/docbook/appendix/appendix-command-reference.xml +++ b/docs/src/reference/docbook/appendix/appendix-command-reference.xml @@ -26,7 +26,7 @@ CLIENT GETNAME- CLIENT KILLX CLIENT LIST- - CLIENT SETNAME- + CLIENT SETNAMEX CONFIG GETX CONFIG RESETSTATX CONFIG REWRITE- diff --git a/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java b/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java index b4f0addc2..beeac1aa9 100644 --- a/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java @@ -2239,4 +2239,22 @@ public class DefaultStringRedisConnection implements StringRedisConnection { return convertedResults; } + /* + * (non-Javadoc) + * @see org.springframework.data.redis.connection.RedisServerCommands#setClientName(java.lang.String) + */ + @Override + public void setClientName(byte[] name) { + this.delegate.setClientName(name); + } + + /* + * (non-Javadoc) + * @see org.springframework.data.redis.connection.StringRedisConnection#setClientName(java.lang.String) + */ + @Override + public void setClientName(String name) { + setClientName(this.serializer.serialize(name)); + } + } diff --git a/src/main/java/org/springframework/data/redis/connection/RedisServerCommands.java b/src/main/java/org/springframework/data/redis/connection/RedisServerCommands.java index 3e34dffba..3219df9f4 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisServerCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisServerCommands.java @@ -171,4 +171,10 @@ public interface RedisServerCommands { */ void killClient(String host, int port); + /** + * Assign given name to current connection. + * + * @since 1.3 + */ + void setClientName(byte[] name); } diff --git a/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java b/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java index 20657682e..ae3d9684e 100644 --- a/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java @@ -292,4 +292,13 @@ public interface StringRedisConnection extends RedisConnection { T eval(String script, ReturnType returnType, int numKeys, String... keysAndArgs); T evalSha(String scriptSha1, ReturnType returnType, int numKeys, String... keysAndArgs); + + /** + * Assign given {@code name} to connection using registered {@link RedisSerializer} for name conversion. + * + * @param name + * @see #setClientName(byte[]) + * @sice 1.3 + */ + void setClientName(String name); } diff --git a/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java b/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java index 3af0cd6fa..56a4df482 100644 --- a/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java @@ -2828,6 +2828,19 @@ public class JedisConnection implements RedisConnection { } } + /* + * @see org.springframework.data.redis.connection.RedisServerCommands#setClientName(java.lang.String) + */ + @Override + public void setClientName(byte[] name) { + + if (isPipelined() || isQueueing()) { + throw new UnsupportedOperationException("'CLIENT SETNAME' is not suppored in transacton / pipeline mode."); + } + + jedis.clientSetname(name); + } + /** * Specifies if pipelined results should be converted to the expected data type. If false, results of * {@link #closePipeline()} and {@link #exec()} will be of the type returned by the Jedis driver diff --git a/src/main/java/org/springframework/data/redis/connection/jredis/JredisConnection.java b/src/main/java/org/springframework/data/redis/connection/jredis/JredisConnection.java index 26bfb5d8e..2e4656c33 100644 --- a/src/main/java/org/springframework/data/redis/connection/jredis/JredisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/jredis/JredisConnection.java @@ -1190,4 +1190,9 @@ public class JredisConnection implements RedisConnection { public void killClient(String host, int port) { throw new UnsupportedOperationException("The 'CLIENT KILL' command is not supported by the JRedis driver."); } + + @Override + public void setClientName(byte[] name) { + throw new UnsupportedOperationException("'CLIENT SETNAME' is not supported by the JRedis driver."); + } } diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java index 4b1ac6a65..96836323d 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java @@ -2920,6 +2920,21 @@ public class LettuceConnection implements RedisConnection { } } + @Override + public void setClientName(byte[] name) { + + if (isQueueing()) { + pipeline(new LettuceStatusResult(getAsyncConnection().clientSetname(name))); + return; + } + if (isQueueing()) { + transaction(new LettuceTxResult(getConnection().clientSetname(name))); + return; + } + + getAsyncConnection().clientSetname(name); + } + /** * Specifies if pipelined and transaction results should be converted to the expected data type. If false, results of * {@link #closePipeline()} and {@link #exec()} will be of the type returned by the Lettuce driver diff --git a/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java b/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java index 2849bbf99..bda3701ee 100644 --- a/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java @@ -2240,6 +2240,26 @@ public class SrpConnection implements RedisConnection { } } + /* + * (non-Javadoc) + * @see org.springframework.data.redis.connection.RedisServerCommands#setClientName(byte[]) + */ + @Override + public void setClientName(byte[] name) { + + try { + + if (isPipelined()) { + pipeline(new SrpStatusResult(pipeline.client_setname(name))); + return; + } + + this.client.client_setname(name); + } catch (Exception ex) { + throw convertSrpAccessException(ex); + } + } + private List closeTransaction() { List results = Collections.emptyList(); if (txTracker != null) { diff --git a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java index 6fd8135e5..9929e223a 100644 --- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java @@ -1884,6 +1884,14 @@ public abstract class AbstractConnectionIntegrationTests { assertThat(time > 0, equalTo(true)); } + /** + * @see DATAREDIS-269 + */ + @Test + public void clientSetNameWorksCorrectly() { + connection.setClientName("foo".getBytes()); + } + protected void verifyResults(List expected) { assertEquals(expected, getResults()); } diff --git a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java index 532a4dcb3..474de96ee 100644 --- a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java +++ b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java @@ -1710,6 +1710,16 @@ public class DefaultStringRedisConnectionTests { verify(nativeConnection, times(1)).shutdown(eq(ShutdownOption.NOSAVE)); } + /** + * @see DATAREDIS-269 + */ + @Test + public void settingClientNameShouldDelegateToNativeConnection() { + + connection.setClientName("foo"); + verify(nativeConnection, times(1)).setClientName(eq("foo".getBytes())); + } + protected List getResults() { return actual; } diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java index e18a18fe9..f6994aad1 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java @@ -246,4 +246,12 @@ public class JedisConnectionPipelineIntegrationTests extends AbstractConnectionP public void testZAddMultiple() { super.testZAddMultiple(); } + + /** + * @see DATAREDIS-269 + */ + @Test(expected = UnsupportedOperationException.class) + public void clientSetNameWorksCorrectly() { + super.clientSetNameWorksCorrectly(); + } } diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionTransactionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionTransactionIntegrationTests.java index fbbf8fe8e..a3435b7de 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionTransactionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionTransactionIntegrationTests.java @@ -191,4 +191,13 @@ public class JedisConnectionTransactionIntegrationTests extends AbstractConnecti public void testRestoreExistingKey() { super.testRestoreExistingKey(); } + + /** + * @see DATAREDIS-269 + */ + @Test(expected = UnsupportedOperationException.class) + public void clientSetNameWorksCorrectly() { + super.clientSetNameWorksCorrectly(); + } + } diff --git a/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java index 9725cfcda..ab30964d3 100644 --- a/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java @@ -809,4 +809,13 @@ public class JRedisConnectionIntegrationTests extends AbstractConnectionIntegrat public void testPsetEx() throws Exception { super.testPsetEx(); } + + /** + * @see DATAREDIS-269 + */ + @Override + @Test(expected = UnsupportedOperationException.class) + public void clientSetNameWorksCorrectly() { + super.clientSetNameWorksCorrectly(); + } }