From c1a7fb84ca74d8d37ab04fbd62664e541fb23d32 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Thu, 21 Apr 2022 08:34:03 +0300 Subject: [PATCH] Fixed - MasterSlaveConnectionManager throws ClassCastException if host unknown #4246 --- .../main/java/org/redisson/client/RedisClient.java | 6 +++--- .../redisson/client/RedisConnectionException.java | 4 ++++ .../connection/MasterSlaveConnectionManager.java | 5 ++++- .../src/test/java/org/redisson/RedissonTest.java | 13 +++++++++++++ 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/redisson/src/main/java/org/redisson/client/RedisClient.java b/redisson/src/main/java/org/redisson/client/RedisClient.java index b03c92c8e..44e9f6b37 100644 --- a/redisson/src/main/java/org/redisson/client/RedisClient.java +++ b/redisson/src/main/java/org/redisson/client/RedisClient.java @@ -186,7 +186,7 @@ public final class RedisClient { Future resolveFuture = resolver.resolve(InetSocketAddress.createUnresolved(uri.getHost(), uri.getPort())); resolveFuture.addListener((FutureListener) future -> { if (!future.isSuccess()) { - promise.completeExceptionally(future.cause()); + promise.completeExceptionally(new RedisConnectionException(future.cause())); return; } @@ -207,7 +207,7 @@ public final class RedisClient { @Override public void operationComplete(final ChannelFuture future) throws Exception { if (bootstrap.config().group().isShuttingDown()) { - IllegalStateException cause = new IllegalStateException("RedisClient is shutdown"); + RedisConnectionException cause = new RedisConnectionException("RedisClient is shutdown"); r.completeExceptionally(cause); return; } @@ -264,7 +264,7 @@ public final class RedisClient { @Override public void operationComplete(final ChannelFuture future) throws Exception { if (bootstrap.config().group().isShuttingDown()) { - IllegalStateException cause = new IllegalStateException("RedisClient is shutdown"); + RedisConnectionException cause = new RedisConnectionException("RedisClient is shutdown"); r.completeExceptionally(cause); return; } diff --git a/redisson/src/main/java/org/redisson/client/RedisConnectionException.java b/redisson/src/main/java/org/redisson/client/RedisConnectionException.java index 6c5302b88..7f582ca58 100644 --- a/redisson/src/main/java/org/redisson/client/RedisConnectionException.java +++ b/redisson/src/main/java/org/redisson/client/RedisConnectionException.java @@ -24,6 +24,10 @@ public class RedisConnectionException extends RedisException { private static final long serialVersionUID = -4756928186967834601L; + public RedisConnectionException(Throwable cause) { + super(cause); + } + public RedisConnectionException(String msg) { super(msg); } diff --git a/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java b/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java index 89ccb4189..5f5d836df 100644 --- a/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java +++ b/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java @@ -339,7 +339,10 @@ public class MasterSlaveConnectionManager implements ConnectionManager { } catch (Exception e) { stopThreads(); if (e instanceof CompletionException) { - throw (RuntimeException) e.getCause(); + if (e.getCause() instanceof RuntimeException) { + throw (RuntimeException) e.getCause(); + } + throw new RedisConnectionException(e.getCause()); } throw e; } diff --git a/redisson/src/test/java/org/redisson/RedissonTest.java b/redisson/src/test/java/org/redisson/RedissonTest.java index 9e0fbb9ee..3d0ddf1d2 100644 --- a/redisson/src/test/java/org/redisson/RedissonTest.java +++ b/redisson/src/test/java/org/redisson/RedissonTest.java @@ -1140,6 +1140,19 @@ public class RedissonTest extends BaseTest { }); } + @Test + public void testMasterSlaveConnectionFail2() { + Assertions.assertThrows(RedisConnectionException.class, () -> { + Config config = new Config(); + config.useMasterSlaveServers() + .setMasterAddress("redis://gadfgdfgdsfg:1111") + .addSlaveAddress("redis://asdfasdfsdfaasdf:1111"); + Redisson.create(config); + + Thread.sleep(1500); + }); + } + @Test public void testSentinelConnectionFail() { Assertions.assertThrows(RedisConnectionException.class, () -> {