From e53b53640bc0e2c407f553151414cb1fcb414755 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Thu, 18 Jun 2020 08:35:25 +0300 Subject: [PATCH] Feature - getConfig, setConfig methods added to RedisNode interface. #2843 --- .../org/redisson/api/redisnode/RedisNode.java | 22 ++++++++++++++++++ .../api/redisnode/RedisNodeAsync.java | 23 +++++++++++++++++++ .../client/protocol/RedisCommands.java | 1 + .../decoder/ObjectMapReplayDecoder.java | 8 +++---- .../decoder/StreamObjectMapReplayDecoder.java | 2 +- .../org/redisson/redisnode/RedisNode.java | 20 ++++++++++++++++ .../redisson/redisnode/SentinelRedisNode.java | 21 +++++++++++++++++ .../org/redisson/RedissonRedisNodesTest.java | 8 +++++++ 8 files changed, 100 insertions(+), 5 deletions(-) diff --git a/redisson/src/main/java/org/redisson/api/redisnode/RedisNode.java b/redisson/src/main/java/org/redisson/api/redisnode/RedisNode.java index 9f425facc..60792f7b7 100644 --- a/redisson/src/main/java/org/redisson/api/redisnode/RedisNode.java +++ b/redisson/src/main/java/org/redisson/api/redisnode/RedisNode.java @@ -62,6 +62,28 @@ public interface RedisNode { enum InfoSection {ALL, DEFAULT, SERVER, CLIENTS, MEMORY, PERSISTENCE, STATS, REPLICATION, CPU, COMMANDSTATS, CLUSTER, KEYSPACE} + /** + * Returns information about Redis node. + * + * @param section - section of information + * @return information + */ Map info(RedisNode.InfoSection section); + /** + * Get value of Redis configuration parameter. + * + * @param parameter - name of parameter + * @return value of parameter + */ + Map getConfig(String parameter); + + /** + * Set value of Redis configuration parameter. + * + * @param parameter - name of parameter + * @param value - value of parameter + */ + void setConfig(String parameter, String value); + } diff --git a/redisson/src/main/java/org/redisson/api/redisnode/RedisNodeAsync.java b/redisson/src/main/java/org/redisson/api/redisnode/RedisNodeAsync.java index c68010a58..103364203 100644 --- a/redisson/src/main/java/org/redisson/api/redisnode/RedisNodeAsync.java +++ b/redisson/src/main/java/org/redisson/api/redisnode/RedisNodeAsync.java @@ -53,6 +53,29 @@ public interface RedisNodeAsync { */ RFuture pingAsync(long timeout, TimeUnit timeUnit); + /** + * Returns information about Redis node. + * + * @param section - section of information + * @return information + */ RFuture> infoAsync(RedisNode.InfoSection section); + /** + * Get value of Redis configuration parameter. + * + * @param parameter - name of parameter + * @return value of parameter + */ + RFuture> getConfigAsync(String parameter); + + /** + * Set value of Redis configuration parameter. + * + * @param parameter - name of parameter + * @param value - value of parameter + * @return void + */ + RFuture setConfigAsync(String parameter, String value); + } diff --git a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java index b949c665c..8fd860437 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java +++ b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java @@ -439,6 +439,7 @@ public interface RedisCommands { RedisStrictCommand CLUSTER_MEET = new RedisStrictCommand("CLUSTER", "MEET"); RedisStrictCommand> CONFIG_GET = new RedisStrictCommand>("CONFIG", "GET", new StringListReplayDecoder()); + RedisStrictCommand> CONFIG_GET_MAP = new RedisStrictCommand<>("CONFIG", "GET", new ObjectMapReplayDecoder()); RedisStrictCommand CONFIG_SET = new RedisStrictCommand("CONFIG", "SET", new VoidReplayConvertor()); RedisStrictCommand CONFIG_RESETSTAT = new RedisStrictCommand("CONFIG", "RESETSTAT", new VoidReplayConvertor()); RedisStrictCommand> CLIENT_LIST = new RedisStrictCommand>("CLIENT", "LIST", new StringToListConvertor()); diff --git a/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectMapReplayDecoder.java b/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectMapReplayDecoder.java index 1579918ae..0a20111cf 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectMapReplayDecoder.java +++ b/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectMapReplayDecoder.java @@ -27,14 +27,14 @@ import org.redisson.client.protocol.Decoder; * @author Nikita Koksharov * */ -public class ObjectMapReplayDecoder implements MultiDecoder> { +public class ObjectMapReplayDecoder implements MultiDecoder> { @Override - public Map decode(List parts, State state) { - Map result = new LinkedHashMap(parts.size()/2); + public Map decode(List parts, State state) { + Map result = new LinkedHashMap<>(parts.size()/2); for (int i = 0; i < parts.size(); i++) { if (i % 2 != 0) { - result.put(parts.get(i-1), parts.get(i)); + result.put((K) parts.get(i-1), (V) parts.get(i)); } } return result; diff --git a/redisson/src/main/java/org/redisson/client/protocol/decoder/StreamObjectMapReplayDecoder.java b/redisson/src/main/java/org/redisson/client/protocol/decoder/StreamObjectMapReplayDecoder.java index 3cc632498..9c82973bd 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/decoder/StreamObjectMapReplayDecoder.java +++ b/redisson/src/main/java/org/redisson/client/protocol/decoder/StreamObjectMapReplayDecoder.java @@ -28,7 +28,7 @@ import org.redisson.client.protocol.Decoder; * @author Nikita Koksharov * */ -public class StreamObjectMapReplayDecoder extends ObjectMapReplayDecoder { +public class StreamObjectMapReplayDecoder extends ObjectMapReplayDecoder { private Decoder codec; diff --git a/redisson/src/main/java/org/redisson/redisnode/RedisNode.java b/redisson/src/main/java/org/redisson/redisnode/RedisNode.java index 92df6469c..77221fdf7 100644 --- a/redisson/src/main/java/org/redisson/redisnode/RedisNode.java +++ b/redisson/src/main/java/org/redisson/redisnode/RedisNode.java @@ -317,4 +317,24 @@ public class RedisNode implements RedisClusterMaster, RedisClusterSlave, RedisMa throw new IllegalStateException(); } + @Override + public Map getConfig(String parameter) { + return commandExecutor.get(getConfigAsync(parameter)); + } + + @Override + public void setConfig(String parameter, String value) { + commandExecutor.get(setConfigAsync(parameter, value)); + } + + @Override + public RFuture> getConfigAsync(String parameter) { + return commandExecutor.readAsync(client, StringCodec.INSTANCE, RedisCommands.CONFIG_GET_MAP, parameter); + } + + @Override + public RFuture setConfigAsync(String parameter, String value) { + return commandExecutor.writeAsync(client, StringCodec.INSTANCE, RedisCommands.CONFIG_SET, parameter, value); + } + } diff --git a/redisson/src/main/java/org/redisson/redisnode/SentinelRedisNode.java b/redisson/src/main/java/org/redisson/redisnode/SentinelRedisNode.java index e5d52ef20..14573c9bb 100644 --- a/redisson/src/main/java/org/redisson/redisnode/SentinelRedisNode.java +++ b/redisson/src/main/java/org/redisson/redisnode/SentinelRedisNode.java @@ -247,4 +247,25 @@ public class SentinelRedisNode implements RedisSentinel, RedisSentinelAsync { public RFuture failoverAsync(String masterName) { return executeAsync(null, null, -1, RedisCommands.SENTINEL_FAILOVER, masterName); } + + @Override + public Map getConfig(String parameter) { + return getConfigAsync(parameter).syncUninterruptibly().getNow(); + } + + @Override + public void setConfig(String parameter, String value) { + setConfigAsync(parameter, value).syncUninterruptibly().getNow(); + } + + @Override + public RFuture> getConfigAsync(String parameter) { + return executeAsync(null, StringCodec.INSTANCE, -1, RedisCommands.CONFIG_GET_MAP, parameter); + } + + @Override + public RFuture setConfigAsync(String parameter, String value) { + return executeAsync(null, StringCodec.INSTANCE, -1, RedisCommands.CONFIG_SET, parameter, value); + } + } diff --git a/redisson/src/test/java/org/redisson/RedissonRedisNodesTest.java b/redisson/src/test/java/org/redisson/RedissonRedisNodesTest.java index 1bfed7d62..5aa704b41 100644 --- a/redisson/src/test/java/org/redisson/RedissonRedisNodesTest.java +++ b/redisson/src/test/java/org/redisson/RedissonRedisNodesTest.java @@ -83,6 +83,14 @@ public class RedissonRedisNodesTest extends BaseTest { assertThat(time.getMicroseconds()).isGreaterThan(10000); } + @Test + public void testConfig() { + RedisSingle nodes = redisson.getRedisNodes(RedisNodes.SINGLE); + assertThat(nodes.getInstance().getConfig("appendonly").get("appendonly")).isEqualTo("no"); + nodes.getInstance().setConfig("appendonly", "yes"); + assertThat(nodes.getInstance().getConfig("appendonly").get("appendonly")).isEqualTo("yes"); + } + @Test public void testSentinelFailover() throws IOException, InterruptedException { RedisRunner.RedisProcess master = new RedisRunner()