diff --git a/redisson/src/main/java/org/redisson/client/RedisClient.java b/redisson/src/main/java/org/redisson/client/RedisClient.java index 0c436d71e..2ad317b44 100644 --- a/redisson/src/main/java/org/redisson/client/RedisClient.java +++ b/redisson/src/main/java/org/redisson/client/RedisClient.java @@ -159,6 +159,8 @@ public final class RedisClient { public RedisConnection connect() { try { return connectAsync().syncUninterruptibly().getNow(); + } catch (RedisException e) { + throw e; } catch (Exception e) { throw new RedisConnectionException("Unable to connect to: " + uri, e); } @@ -259,6 +261,8 @@ public final class RedisClient { public RedisPubSubConnection connectPubSub() { try { return connectPubSubAsync().syncUninterruptibly().getNow(); + } catch (RedisException e) { + throw e; } catch (Exception e) { throw new RedisConnectionException("Unable to connect to: " + uri, e); } diff --git a/redisson/src/main/java/org/redisson/connection/SentinelConnectionManager.java b/redisson/src/main/java/org/redisson/connection/SentinelConnectionManager.java index 42a261bef..945d4c92b 100755 --- a/redisson/src/main/java/org/redisson/connection/SentinelConnectionManager.java +++ b/redisson/src/main/java/org/redisson/connection/SentinelConnectionManager.java @@ -84,17 +84,18 @@ public class SentinelConnectionManager extends MasterSlaveConnectionManager { this.natMapper = cfg.getNatMapper(); this.sentinelResolver = resolverGroup.getResolver(getGroup().next()); - - checkAuth(cfg); for (String address : cfg.getSentinelAddresses()) { RedisURI addr = new RedisURI(address); + scheme = addr.getScheme(); addr = applyNatMap(addr); if (NetUtil.createByteArrayFromIpAddressString(addr.getHost()) == null && !addr.getHost().equals("localhost")) { sentinelHosts.add(addr); } } + checkAuth(cfg); + Throwable lastException = null; for (String address : cfg.getSentinelAddresses()) { RedisURI addr = new RedisURI(address); @@ -202,22 +203,24 @@ public class SentinelConnectionManager extends MasterSlaveConnectionManager { } private void checkAuth(SentinelServersConfig cfg) { - boolean connected = false; - + if (cfg.getPassword() == null) { + return; + } + for (String address : cfg.getSentinelAddresses()) { RedisURI addr = new RedisURI(address); - scheme = addr.getScheme(); addr = applyNatMap(addr); + RedisClient client = createClient(NodeType.SENTINEL, addr, this.config.getConnectTimeout(), this.config.getTimeout(), null); try { RedisConnection c = client.connect(); - connected = true; - try { + if (config.getPingConnectionInterval() == 0) { c.sync(RedisCommands.PING); - } catch (RedisAuthRequiredException e) { - usePassword = true; } - break; + return; + } catch (RedisAuthRequiredException e) { + usePassword = true; + return; } catch (RedisConnectionException e) { log.warn("Can't connect to sentinel server. {}", e.getMessage()); } catch (Exception e) { @@ -227,14 +230,12 @@ public class SentinelConnectionManager extends MasterSlaveConnectionManager { } } - if (!connected) { - stopThreads(); - StringBuilder list = new StringBuilder(); - for (String address : cfg.getSentinelAddresses()) { - list.append(address).append(", "); - } - throw new RedisConnectionException("Unable to connect to Redis sentinel servers: " + list); + stopThreads(); + StringBuilder list = new StringBuilder(); + for (String address : cfg.getSentinelAddresses()) { + list.append(address).append(", "); } + throw new RedisConnectionException("Unable to connect to Redis sentinel servers: " + list); } @Override diff --git a/redisson/src/test/java/org/redisson/RedissonTest.java b/redisson/src/test/java/org/redisson/RedissonTest.java index d3333137c..344efb5cb 100644 --- a/redisson/src/test/java/org/redisson/RedissonTest.java +++ b/redisson/src/test/java/org/redisson/RedissonTest.java @@ -789,6 +789,78 @@ public class RedissonTest { Assert.assertTrue(r.isShutdown()); } + @Test + public void testSentinelStartupWithPassword() throws Exception { + RedisRunner.RedisProcess master = new RedisRunner() + .nosave() + .randomDir() + .requirepass("123") + .run(); + RedisRunner.RedisProcess slave1 = new RedisRunner() + .port(6380) + .nosave() + .randomDir() + .slaveof("127.0.0.1", 6379) + .requirepass("123") + .masterauth("123") + .run(); + RedisRunner.RedisProcess slave2 = new RedisRunner() + .port(6381) + .nosave() + .randomDir() + .slaveof("127.0.0.1", 6379) + .requirepass("123") + .masterauth("123") + .run(); + RedisRunner.RedisProcess sentinel1 = new RedisRunner() + .nosave() + .randomDir() + .port(26379) + .sentinel() + .sentinelMonitor("myMaster", "127.0.0.1", 6379, 2) + .sentinelAuthPass("myMaster", "123") + .requirepass("123") + .run(); + RedisRunner.RedisProcess sentinel2 = new RedisRunner() + .nosave() + .randomDir() + .port(26380) + .sentinel() + .sentinelMonitor("myMaster", "127.0.0.1", 6379, 2) + .sentinelAuthPass("myMaster", "123") + .requirepass("123") + .run(); + RedisRunner.RedisProcess sentinel3 = new RedisRunner() + .nosave() + .randomDir() + .port(26381) + .sentinel() + .sentinelMonitor("myMaster", "127.0.0.1", 6379, 2) + .sentinelAuthPass("myMaster", "123") + .requirepass("123") + .run(); + + Thread.sleep(5000); + + Config config = new Config(); + config.useSentinelServers() + .setLoadBalancer(new RandomLoadBalancer()) + .setPassword("123") + .addSentinelAddress(sentinel3.getRedisServerAddressAndPort()).setMasterName("myMaster"); + + long t = System.currentTimeMillis(); + RedissonClient redisson = Redisson.create(config); + assertThat(System.currentTimeMillis() - t).isLessThan(2000L); + redisson.shutdown(); + + sentinel1.stop(); + sentinel2.stop(); + sentinel3.stop(); + master.stop(); + slave1.stop(); + slave2.stop(); + } + @Test public void testSentinelStartup() throws Exception { RedisRunner.RedisProcess master = new RedisRunner()