From 4f699963ffd1f65ab4bc7581c0bc5e436b20037f Mon Sep 17 00:00:00 2001 From: M Sazzadul Hoque <7600764+sazzad16@users.noreply.github.com> Date: Mon, 3 Feb 2025 00:34:08 +0600 Subject: [PATCH 1/6] Support INFO command in UnifiedJedis --- .../redis/clients/jedis/UnifiedJedis.java | 15 +++++++ .../executors/ClusterCommandExecutor.java | 19 +++++++++ .../jedis/executors/CommandExecutor.java | 5 +++ .../jedis/util/JedisBroadcastReplies.java | 40 +++++++++++++++++++ .../pooled/PooledMiscellaneousTest.java | 16 ++++++++ 5 files changed, 95 insertions(+) create mode 100644 src/main/java/redis/clients/jedis/util/JedisBroadcastReplies.java diff --git a/src/main/java/redis/clients/jedis/UnifiedJedis.java b/src/main/java/redis/clients/jedis/UnifiedJedis.java index 4f2c97eac7..b4ae20801c 100644 --- a/src/main/java/redis/clients/jedis/UnifiedJedis.java +++ b/src/main/java/redis/clients/jedis/UnifiedJedis.java @@ -42,6 +42,7 @@ import redis.clients.jedis.search.schemafields.SchemaField; import redis.clients.jedis.timeseries.*; import redis.clients.jedis.util.IOUtils; +import redis.clients.jedis.util.JedisBroadcastReplies; import redis.clients.jedis.util.JedisURIHelper; import redis.clients.jedis.util.KeyValue; @@ -333,6 +334,10 @@ public void setBroadcastAndRoundRobinConfig(JedisBroadcastAndRoundRobinConfig co this.commandObjects.setBroadcastAndRoundRobinConfig(this.broadcastAndRoundRobinConfig); } + public final JedisBroadcastReplies broadcastCommandDifferingReplies(CommandObject commandObject) { + return executor.broadcastCommandDifferingReplies(commandObject); + } + public Cache getCache() { return cache; } @@ -353,6 +358,16 @@ public String configSet(String parameter, String value) { return checkAndBroadcastCommand(commandObjects.configSet(parameter, value)); } + public final JedisBroadcastReplies info() { + return executor.broadcastCommandDifferingReplies(new CommandObject( + new CommandArguments(Protocol.Command.INFO), BuilderFactory.STRING)); + } + + public final JedisBroadcastReplies info(String section) { + return executor.broadcastCommandDifferingReplies(new CommandObject( + new CommandArguments(Protocol.Command.INFO).add(section), BuilderFactory.STRING)); + } + // Key commands @Override public boolean exists(String key) { diff --git a/src/main/java/redis/clients/jedis/executors/ClusterCommandExecutor.java b/src/main/java/redis/clients/jedis/executors/ClusterCommandExecutor.java index e5049672b8..85bba16077 100644 --- a/src/main/java/redis/clients/jedis/executors/ClusterCommandExecutor.java +++ b/src/main/java/redis/clients/jedis/executors/ClusterCommandExecutor.java @@ -17,6 +17,7 @@ import redis.clients.jedis.exceptions.*; import redis.clients.jedis.providers.ClusterConnectionProvider; import redis.clients.jedis.util.IOUtils; +import redis.clients.jedis.util.JedisBroadcastReplies; public class ClusterCommandExecutor implements CommandExecutor { @@ -71,6 +72,24 @@ public final T broadcastCommand(CommandObject commandObject) { return reply; } + @Override + public final JedisBroadcastReplies broadcastCommandDifferingReplies(CommandObject commandObject) { + Map connectionMap = provider.getConnectionMap(); + + JedisBroadcastReplies bcastReplies = new JedisBroadcastReplies(connectionMap.size()); + for (Map.Entry entry : connectionMap.entrySet()) { + HostAndPort node = HostAndPort.from(entry.getKey()); + ConnectionPool pool = entry.getValue(); + try (Connection connection = pool.getResource()) { + Object aReply = execute(connection, commandObject); + bcastReplies.addReply(node, aReply); + } catch (Exception anError) { + bcastReplies.addReply(node, anError); + } + } + return bcastReplies; + } + @Override public final T executeCommand(CommandObject commandObject) { return doExecuteCommand(commandObject, false); diff --git a/src/main/java/redis/clients/jedis/executors/CommandExecutor.java b/src/main/java/redis/clients/jedis/executors/CommandExecutor.java index 85ec034b02..2d35c0d2fd 100644 --- a/src/main/java/redis/clients/jedis/executors/CommandExecutor.java +++ b/src/main/java/redis/clients/jedis/executors/CommandExecutor.java @@ -1,6 +1,7 @@ package redis.clients.jedis.executors; import redis.clients.jedis.CommandObject; +import redis.clients.jedis.util.JedisBroadcastReplies; public interface CommandExecutor extends AutoCloseable { @@ -9,4 +10,8 @@ public interface CommandExecutor extends AutoCloseable { default T broadcastCommand(CommandObject commandObject) { return executeCommand(commandObject); } + + default JedisBroadcastReplies broadcastCommandDifferingReplies(CommandObject commandObject) { + return JedisBroadcastReplies.singleton(executeCommand(commandObject)); + } } diff --git a/src/main/java/redis/clients/jedis/util/JedisBroadcastReplies.java b/src/main/java/redis/clients/jedis/util/JedisBroadcastReplies.java new file mode 100644 index 0000000000..c98c134bde --- /dev/null +++ b/src/main/java/redis/clients/jedis/util/JedisBroadcastReplies.java @@ -0,0 +1,40 @@ +package redis.clients.jedis.util; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * The collection of replies where a command is broadcasted to multiple nodes, but the replies are expected to differ + * even in ideal situation. + */ +public class JedisBroadcastReplies { + + private static final Object DUMMY_OBJECT = new Object(); + + private final Map replies; + + public JedisBroadcastReplies() { + this(new HashMap<>()); + } + + public JedisBroadcastReplies(int size) { + this(new HashMap<>(size)); + } + + private JedisBroadcastReplies(Map replies) { + this.replies = replies; + } + + public void addReply(Object node, Object reply) { + replies.put(node, reply); + } + + public Map getReplies() { + return Collections.unmodifiableMap(replies); + } + + public static JedisBroadcastReplies singleton(Object reply) { + return new JedisBroadcastReplies(Collections.singletonMap(DUMMY_OBJECT, reply)); + } +} diff --git a/src/test/java/redis/clients/jedis/commands/unified/pooled/PooledMiscellaneousTest.java b/src/test/java/redis/clients/jedis/commands/unified/pooled/PooledMiscellaneousTest.java index c1e3857bb6..326d1c3e3c 100644 --- a/src/test/java/redis/clients/jedis/commands/unified/pooled/PooledMiscellaneousTest.java +++ b/src/test/java/redis/clients/jedis/commands/unified/pooled/PooledMiscellaneousTest.java @@ -1,5 +1,6 @@ package redis.clients.jedis.commands.unified.pooled; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThrows; @@ -9,6 +10,7 @@ import java.util.List; import io.redis.test.annotations.SinceRedisVersion; +import org.hamcrest.Matchers; import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -23,6 +25,7 @@ import redis.clients.jedis.commands.unified.UnifiedJedisCommandsTestBase; import redis.clients.jedis.exceptions.JedisDataException; import redis.clients.jedis.util.EnabledOnCommandRule; +import redis.clients.jedis.util.JedisBroadcastReplies; import redis.clients.jedis.util.RedisVersionRule; @RunWith(Parameterized.class) @@ -164,4 +167,17 @@ public void broadcastWithError() { () -> jedis.functionDelete("xyz")); assertEquals("ERR Library not found", error.getMessage()); } + + @Test + public void broadcastDifferentReplies() { + JedisBroadcastReplies infoReplies = jedis.info(); + assertThat(infoReplies.getReplies(), Matchers.aMapWithSize(1)); + Object infoValue = infoReplies.getReplies().values().stream().findFirst().get(); + assertThat((String) infoValue, Matchers.notNullValue()); + + infoReplies = jedis.info("server"); + assertThat(infoReplies.getReplies(), Matchers.aMapWithSize(1)); + infoValue = infoReplies.getReplies().values().stream().findFirst().get(); + assertThat((String) infoValue, Matchers.notNullValue()); + } } From 0b9833d35eed698425585d2649bf48f6edc3a812 Mon Sep 17 00:00:00 2001 From: M Sazzadul Hoque <7600764+sazzad16@users.noreply.github.com> Date: Mon, 3 Feb 2025 01:02:12 +0600 Subject: [PATCH 2/6] test in cluster --- .../jedis/ClusterValuesCommandsTest.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/test/java/redis/clients/jedis/commands/jedis/ClusterValuesCommandsTest.java b/src/test/java/redis/clients/jedis/commands/jedis/ClusterValuesCommandsTest.java index 7168a186d1..9efd3ce9e4 100644 --- a/src/test/java/redis/clients/jedis/commands/jedis/ClusterValuesCommandsTest.java +++ b/src/test/java/redis/clients/jedis/commands/jedis/ClusterValuesCommandsTest.java @@ -1,5 +1,6 @@ package redis.clients.jedis.commands.jedis; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; @@ -10,6 +11,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.hamcrest.Matchers; import org.junit.Test; import redis.clients.jedis.BuilderFactory; @@ -23,6 +25,7 @@ import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; import redis.clients.jedis.resps.ScanResult; +import redis.clients.jedis.util.JedisBroadcastReplies; public class ClusterValuesCommandsTest extends ClusterJedisCommandsTestBase { @@ -128,6 +131,21 @@ public void pingBroadcast() { assertEquals("PONG", cluster.ping()); } + @Test + public void broadcastDifferentReplies() { + JedisBroadcastReplies infoReplies = cluster.info(); + assertThat(infoReplies.getReplies(), Matchers.aMapWithSize(3)); + infoReplies.getReplies().values().forEach(infoValue -> { + assertThat((String) infoValue, Matchers.notNullValue()); + }); + + infoReplies = cluster.info("server"); + assertThat(infoReplies.getReplies(), Matchers.aMapWithSize(3)); + infoReplies.getReplies().values().forEach(infoValue -> { + assertThat((String) infoValue, Matchers.notNullValue()); + }); + } + @Test public void flushAllBroadcast() { assertNull(cluster.get("foo")); From 94a65c9b2a20b003fbbcfb65162458dcd8a771e4 Mon Sep 17 00:00:00 2001 From: M Sazzadul Hoque <7600764+sazzad16@users.noreply.github.com> Date: Mon, 3 Feb 2025 01:39:09 +0600 Subject: [PATCH 3/6] Support INFO command in UnifiedJedis (simplified) --- .../redis/clients/jedis/CommandObjects.java | 10 +++++ .../redis/clients/jedis/JedisCluster.java | 10 +++++ .../redis/clients/jedis/UnifiedJedis.java | 15 ++----- .../executors/ClusterCommandExecutor.java | 19 --------- .../jedis/executors/CommandExecutor.java | 5 --- .../jedis/util/JedisBroadcastReplies.java | 40 ------------------- .../jedis/ClusterValuesCommandsTest.java | 18 +++------ .../pooled/PooledMiscellaneousTest.java | 17 +++----- 8 files changed, 35 insertions(+), 99 deletions(-) delete mode 100644 src/main/java/redis/clients/jedis/util/JedisBroadcastReplies.java diff --git a/src/main/java/redis/clients/jedis/CommandObjects.java b/src/main/java/redis/clients/jedis/CommandObjects.java index bc37045dc5..857b58682f 100644 --- a/src/main/java/redis/clients/jedis/CommandObjects.java +++ b/src/main/java/redis/clients/jedis/CommandObjects.java @@ -92,6 +92,16 @@ public final CommandObject configSet(String parameter, String value) { return new CommandObject<>(commandArguments(Command.CONFIG).add(Keyword.SET).add(parameter).add(value), BuilderFactory.STRING); } + private final CommandObject INFO_COMMAND_OBJECT = new CommandObject<>(commandArguments(Command.INFO), BuilderFactory.STRING); + + public final CommandObject info() { + return INFO_COMMAND_OBJECT; + } + + public final CommandObject info(String section) { + return new CommandObject<>(commandArguments(Command.INFO).add(section), BuilderFactory.STRING); + } + // Key commands public final CommandObject exists(String key) { return new CommandObject<>(commandArguments(Command.EXISTS).key(key), BuilderFactory.BOOLEAN); diff --git a/src/main/java/redis/clients/jedis/JedisCluster.java b/src/main/java/redis/clients/jedis/JedisCluster.java index d4c555230c..1a6cb323aa 100644 --- a/src/main/java/redis/clients/jedis/JedisCluster.java +++ b/src/main/java/redis/clients/jedis/JedisCluster.java @@ -353,6 +353,16 @@ public Connection getConnectionFromSlot(int slot) { } // commands + @Override + public String info() { + throw new UnsupportedOperationException("INFO command is not supported from JedisCluster."); + } + + @Override + public String info(String section) { + throw new UnsupportedOperationException("INFO command is not supported from JedisCluster."); + } + public long spublish(String channel, String message) { return executeCommand(commandObjects.spublish(channel, message)); } diff --git a/src/main/java/redis/clients/jedis/UnifiedJedis.java b/src/main/java/redis/clients/jedis/UnifiedJedis.java index b4ae20801c..719627acfa 100644 --- a/src/main/java/redis/clients/jedis/UnifiedJedis.java +++ b/src/main/java/redis/clients/jedis/UnifiedJedis.java @@ -42,7 +42,6 @@ import redis.clients.jedis.search.schemafields.SchemaField; import redis.clients.jedis.timeseries.*; import redis.clients.jedis.util.IOUtils; -import redis.clients.jedis.util.JedisBroadcastReplies; import redis.clients.jedis.util.JedisURIHelper; import redis.clients.jedis.util.KeyValue; @@ -334,10 +333,6 @@ public void setBroadcastAndRoundRobinConfig(JedisBroadcastAndRoundRobinConfig co this.commandObjects.setBroadcastAndRoundRobinConfig(this.broadcastAndRoundRobinConfig); } - public final JedisBroadcastReplies broadcastCommandDifferingReplies(CommandObject commandObject) { - return executor.broadcastCommandDifferingReplies(commandObject); - } - public Cache getCache() { return cache; } @@ -358,14 +353,12 @@ public String configSet(String parameter, String value) { return checkAndBroadcastCommand(commandObjects.configSet(parameter, value)); } - public final JedisBroadcastReplies info() { - return executor.broadcastCommandDifferingReplies(new CommandObject( - new CommandArguments(Protocol.Command.INFO), BuilderFactory.STRING)); + public String info() { + return executeCommand(commandObjects.info()); } - public final JedisBroadcastReplies info(String section) { - return executor.broadcastCommandDifferingReplies(new CommandObject( - new CommandArguments(Protocol.Command.INFO).add(section), BuilderFactory.STRING)); + public String info(String section) { + return executeCommand(commandObjects.info(section)); } // Key commands diff --git a/src/main/java/redis/clients/jedis/executors/ClusterCommandExecutor.java b/src/main/java/redis/clients/jedis/executors/ClusterCommandExecutor.java index 85bba16077..e5049672b8 100644 --- a/src/main/java/redis/clients/jedis/executors/ClusterCommandExecutor.java +++ b/src/main/java/redis/clients/jedis/executors/ClusterCommandExecutor.java @@ -17,7 +17,6 @@ import redis.clients.jedis.exceptions.*; import redis.clients.jedis.providers.ClusterConnectionProvider; import redis.clients.jedis.util.IOUtils; -import redis.clients.jedis.util.JedisBroadcastReplies; public class ClusterCommandExecutor implements CommandExecutor { @@ -72,24 +71,6 @@ public final T broadcastCommand(CommandObject commandObject) { return reply; } - @Override - public final JedisBroadcastReplies broadcastCommandDifferingReplies(CommandObject commandObject) { - Map connectionMap = provider.getConnectionMap(); - - JedisBroadcastReplies bcastReplies = new JedisBroadcastReplies(connectionMap.size()); - for (Map.Entry entry : connectionMap.entrySet()) { - HostAndPort node = HostAndPort.from(entry.getKey()); - ConnectionPool pool = entry.getValue(); - try (Connection connection = pool.getResource()) { - Object aReply = execute(connection, commandObject); - bcastReplies.addReply(node, aReply); - } catch (Exception anError) { - bcastReplies.addReply(node, anError); - } - } - return bcastReplies; - } - @Override public final T executeCommand(CommandObject commandObject) { return doExecuteCommand(commandObject, false); diff --git a/src/main/java/redis/clients/jedis/executors/CommandExecutor.java b/src/main/java/redis/clients/jedis/executors/CommandExecutor.java index 2d35c0d2fd..85ec034b02 100644 --- a/src/main/java/redis/clients/jedis/executors/CommandExecutor.java +++ b/src/main/java/redis/clients/jedis/executors/CommandExecutor.java @@ -1,7 +1,6 @@ package redis.clients.jedis.executors; import redis.clients.jedis.CommandObject; -import redis.clients.jedis.util.JedisBroadcastReplies; public interface CommandExecutor extends AutoCloseable { @@ -10,8 +9,4 @@ public interface CommandExecutor extends AutoCloseable { default T broadcastCommand(CommandObject commandObject) { return executeCommand(commandObject); } - - default JedisBroadcastReplies broadcastCommandDifferingReplies(CommandObject commandObject) { - return JedisBroadcastReplies.singleton(executeCommand(commandObject)); - } } diff --git a/src/main/java/redis/clients/jedis/util/JedisBroadcastReplies.java b/src/main/java/redis/clients/jedis/util/JedisBroadcastReplies.java deleted file mode 100644 index c98c134bde..0000000000 --- a/src/main/java/redis/clients/jedis/util/JedisBroadcastReplies.java +++ /dev/null @@ -1,40 +0,0 @@ -package redis.clients.jedis.util; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -/** - * The collection of replies where a command is broadcasted to multiple nodes, but the replies are expected to differ - * even in ideal situation. - */ -public class JedisBroadcastReplies { - - private static final Object DUMMY_OBJECT = new Object(); - - private final Map replies; - - public JedisBroadcastReplies() { - this(new HashMap<>()); - } - - public JedisBroadcastReplies(int size) { - this(new HashMap<>(size)); - } - - private JedisBroadcastReplies(Map replies) { - this.replies = replies; - } - - public void addReply(Object node, Object reply) { - replies.put(node, reply); - } - - public Map getReplies() { - return Collections.unmodifiableMap(replies); - } - - public static JedisBroadcastReplies singleton(Object reply) { - return new JedisBroadcastReplies(Collections.singletonMap(DUMMY_OBJECT, reply)); - } -} diff --git a/src/test/java/redis/clients/jedis/commands/jedis/ClusterValuesCommandsTest.java b/src/test/java/redis/clients/jedis/commands/jedis/ClusterValuesCommandsTest.java index 9efd3ce9e4..790c0556f6 100644 --- a/src/test/java/redis/clients/jedis/commands/jedis/ClusterValuesCommandsTest.java +++ b/src/test/java/redis/clients/jedis/commands/jedis/ClusterValuesCommandsTest.java @@ -3,6 +3,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThrows; import static org.junit.Assert.fail; import java.util.ArrayList; @@ -11,7 +12,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.hamcrest.Matchers; import org.junit.Test; import redis.clients.jedis.BuilderFactory; @@ -22,10 +22,10 @@ import redis.clients.jedis.Protocol; import redis.clients.jedis.ScanIteration; import redis.clients.jedis.args.GeoUnit; +import redis.clients.jedis.exceptions.JedisDataException; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; import redis.clients.jedis.resps.ScanResult; -import redis.clients.jedis.util.JedisBroadcastReplies; public class ClusterValuesCommandsTest extends ClusterJedisCommandsTestBase { @@ -132,18 +132,10 @@ public void pingBroadcast() { } @Test - public void broadcastDifferentReplies() { - JedisBroadcastReplies infoReplies = cluster.info(); - assertThat(infoReplies.getReplies(), Matchers.aMapWithSize(3)); - infoReplies.getReplies().values().forEach(infoValue -> { - assertThat((String) infoValue, Matchers.notNullValue()); - }); + public void info() { + assertThrows(JedisDataException.class, () -> cluster.info()); - infoReplies = cluster.info("server"); - assertThat(infoReplies.getReplies(), Matchers.aMapWithSize(3)); - infoReplies.getReplies().values().forEach(infoValue -> { - assertThat((String) infoValue, Matchers.notNullValue()); - }); + assertThrows(JedisDataException.class, () -> cluster.info("server")); } @Test diff --git a/src/test/java/redis/clients/jedis/commands/unified/pooled/PooledMiscellaneousTest.java b/src/test/java/redis/clients/jedis/commands/unified/pooled/PooledMiscellaneousTest.java index 326d1c3e3c..4a03a817a5 100644 --- a/src/test/java/redis/clients/jedis/commands/unified/pooled/PooledMiscellaneousTest.java +++ b/src/test/java/redis/clients/jedis/commands/unified/pooled/PooledMiscellaneousTest.java @@ -25,7 +25,6 @@ import redis.clients.jedis.commands.unified.UnifiedJedisCommandsTestBase; import redis.clients.jedis.exceptions.JedisDataException; import redis.clients.jedis.util.EnabledOnCommandRule; -import redis.clients.jedis.util.JedisBroadcastReplies; import redis.clients.jedis.util.RedisVersionRule; @RunWith(Parameterized.class) @@ -169,15 +168,11 @@ public void broadcastWithError() { } @Test - public void broadcastDifferentReplies() { - JedisBroadcastReplies infoReplies = jedis.info(); - assertThat(infoReplies.getReplies(), Matchers.aMapWithSize(1)); - Object infoValue = infoReplies.getReplies().values().stream().findFirst().get(); - assertThat((String) infoValue, Matchers.notNullValue()); - - infoReplies = jedis.info("server"); - assertThat(infoReplies.getReplies(), Matchers.aMapWithSize(1)); - infoValue = infoReplies.getReplies().values().stream().findFirst().get(); - assertThat((String) infoValue, Matchers.notNullValue()); + public void info() { + String info = jedis.info(); + assertThat(info, Matchers.notNullValue()); + + info = jedis.info("server"); + assertThat(info, Matchers.notNullValue()); } } From c3ff4ffdbf1d3c3a9cc4b30f3d7b708866bfe8ba Mon Sep 17 00:00:00 2001 From: M Sazzadul Hoque <7600764+sazzad16@users.noreply.github.com> Date: Mon, 3 Feb 2025 12:00:55 +0600 Subject: [PATCH 4/6] fix test --- .../jedis/commands/jedis/ClusterValuesCommandsTest.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/test/java/redis/clients/jedis/commands/jedis/ClusterValuesCommandsTest.java b/src/test/java/redis/clients/jedis/commands/jedis/ClusterValuesCommandsTest.java index 790c0556f6..58ad6089fe 100644 --- a/src/test/java/redis/clients/jedis/commands/jedis/ClusterValuesCommandsTest.java +++ b/src/test/java/redis/clients/jedis/commands/jedis/ClusterValuesCommandsTest.java @@ -1,6 +1,5 @@ package redis.clients.jedis.commands.jedis; -import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThrows; @@ -22,7 +21,6 @@ import redis.clients.jedis.Protocol; import redis.clients.jedis.ScanIteration; import redis.clients.jedis.args.GeoUnit; -import redis.clients.jedis.exceptions.JedisDataException; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; import redis.clients.jedis.resps.ScanResult; @@ -133,9 +131,9 @@ public void pingBroadcast() { @Test public void info() { - assertThrows(JedisDataException.class, () -> cluster.info()); + assertThrows(UnsupportedOperationException.class, () -> cluster.info()); - assertThrows(JedisDataException.class, () -> cluster.info("server")); + assertThrows(UnsupportedOperationException.class, () -> cluster.info("server")); } @Test From 3718e98976bc27c7ff0eac8111b5e144cdcd3d57 Mon Sep 17 00:00:00 2001 From: M Sazzadul Hoque <7600764+sazzad16@users.noreply.github.com> Date: Mon, 17 Feb 2025 21:56:50 +0600 Subject: [PATCH 5/6] Update after discussion --- src/main/java/redis/clients/jedis/JedisCluster.java | 10 ---------- .../commands/jedis/ClusterValuesCommandsTest.java | 9 ++++++--- .../unified/pooled/PooledMiscellaneousTest.java | 6 +++--- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/main/java/redis/clients/jedis/JedisCluster.java b/src/main/java/redis/clients/jedis/JedisCluster.java index 1a6cb323aa..d4c555230c 100644 --- a/src/main/java/redis/clients/jedis/JedisCluster.java +++ b/src/main/java/redis/clients/jedis/JedisCluster.java @@ -353,16 +353,6 @@ public Connection getConnectionFromSlot(int slot) { } // commands - @Override - public String info() { - throw new UnsupportedOperationException("INFO command is not supported from JedisCluster."); - } - - @Override - public String info(String section) { - throw new UnsupportedOperationException("INFO command is not supported from JedisCluster."); - } - public long spublish(String channel, String message) { return executeCommand(commandObjects.spublish(channel, message)); } diff --git a/src/test/java/redis/clients/jedis/commands/jedis/ClusterValuesCommandsTest.java b/src/test/java/redis/clients/jedis/commands/jedis/ClusterValuesCommandsTest.java index 58ad6089fe..743baa324c 100644 --- a/src/test/java/redis/clients/jedis/commands/jedis/ClusterValuesCommandsTest.java +++ b/src/test/java/redis/clients/jedis/commands/jedis/ClusterValuesCommandsTest.java @@ -1,8 +1,9 @@ package redis.clients.jedis.commands.jedis; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThrows; import static org.junit.Assert.fail; import java.util.ArrayList; @@ -131,9 +132,11 @@ public void pingBroadcast() { @Test public void info() { - assertThrows(UnsupportedOperationException.class, () -> cluster.info()); + String info = cluster.info(); + assertThat(info, notNullValue()); - assertThrows(UnsupportedOperationException.class, () -> cluster.info("server")); + info = cluster.info("server"); + assertThat(info, notNullValue()); } @Test diff --git a/src/test/java/redis/clients/jedis/commands/unified/pooled/PooledMiscellaneousTest.java b/src/test/java/redis/clients/jedis/commands/unified/pooled/PooledMiscellaneousTest.java index 4a03a817a5..ba5962bded 100644 --- a/src/test/java/redis/clients/jedis/commands/unified/pooled/PooledMiscellaneousTest.java +++ b/src/test/java/redis/clients/jedis/commands/unified/pooled/PooledMiscellaneousTest.java @@ -1,6 +1,7 @@ package redis.clients.jedis.commands.unified.pooled; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThrows; @@ -10,7 +11,6 @@ import java.util.List; import io.redis.test.annotations.SinceRedisVersion; -import org.hamcrest.Matchers; import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -170,9 +170,9 @@ public void broadcastWithError() { @Test public void info() { String info = jedis.info(); - assertThat(info, Matchers.notNullValue()); + assertThat(info, notNullValue()); info = jedis.info("server"); - assertThat(info, Matchers.notNullValue()); + assertThat(info, notNullValue()); } } From f59691189254ebde728a14bb18d21d7059bc0e75 Mon Sep 17 00:00:00 2001 From: M Sazzadul Hoque <7600764+sazzad16@users.noreply.github.com> Date: Mon, 17 Feb 2025 22:09:51 +0600 Subject: [PATCH 6/6] codestyle --- src/main/java/redis/clients/jedis/CommandObjects.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/redis/clients/jedis/CommandObjects.java b/src/main/java/redis/clients/jedis/CommandObjects.java index 857b58682f..6ab3e85db0 100644 --- a/src/main/java/redis/clients/jedis/CommandObjects.java +++ b/src/main/java/redis/clients/jedis/CommandObjects.java @@ -92,7 +92,8 @@ public final CommandObject configSet(String parameter, String value) { return new CommandObject<>(commandArguments(Command.CONFIG).add(Keyword.SET).add(parameter).add(value), BuilderFactory.STRING); } - private final CommandObject INFO_COMMAND_OBJECT = new CommandObject<>(commandArguments(Command.INFO), BuilderFactory.STRING); + private final CommandObject INFO_COMMAND_OBJECT = new CommandObject<>(commandArguments(Command.INFO), + BuilderFactory.STRING); public final CommandObject info() { return INFO_COMMAND_OBJECT;