Fixed - getting error while connecting to sentinel using password. #3135

pull/3169/head
Nikita Koksharov 4 years ago
parent bffd61b26c
commit c558f06221

@ -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);
}

@ -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

@ -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()

Loading…
Cancel
Save