diff --git a/redisson/src/main/java/org/redisson/connection/SentinelConnectionManager.java b/redisson/src/main/java/org/redisson/connection/SentinelConnectionManager.java index bd3a16fce..470a597cf 100755 --- a/redisson/src/main/java/org/redisson/connection/SentinelConnectionManager.java +++ b/redisson/src/main/java/org/redisson/connection/SentinelConnectionManager.java @@ -103,61 +103,63 @@ public class SentinelConnectionManager extends MasterSlaveConnectionManager { continue; } - RedisURI master = connection.sync(masterHostCommand, cfg.getMasterName()); - if (master == null) { - throw new RedisConnectionException("Master node is undefined! SENTINEL GET-MASTER-ADDR-BY-NAME command returns empty result!"); - } - - InetSocketAddress masterHost = resolveIP(master.getHost(), String.valueOf(master.getPort())).join(); - RedisURI masterUri = toURI(masterHost); - if (!master.isIP()) { - uri2hostname.put(masterUri, master.getHost()); - } - this.config.setMasterAddress(masterUri.toString()); - currentMaster.set(masterUri); - log.info("master: {} added", masterHost); - - List<Map<String, String>> sentinelSlaves = connection.sync(StringCodec.INSTANCE, RedisCommands.SENTINEL_SLAVES, cfg.getMasterName()); - for (Map<String, String> map : sentinelSlaves) { - if (map.isEmpty()) { - continue; - } - - String host = map.get("ip"); - String port = map.get("port"); - String flags = map.getOrDefault("flags", ""); - String masterLinkStatus = map.getOrDefault("master-link-status", ""); - - InetSocketAddress slaveAddr = resolveIP(host, port).join(); - RedisURI uri = toURI(slaveAddr); - if (isHostname(host)) { - uri2hostname.put(uri, host); + List<CompletableFuture<Void>> connectionFutures = new LinkedList<>(); + if (currentMaster.get() == null) { + RedisURI master = connection.sync(masterHostCommand, cfg.getMasterName()); + if (master == null) { + throw new RedisConnectionException("Master node is undefined! SENTINEL GET-MASTER-ADDR-BY-NAME command returns empty result!"); } - log.debug("slave {} state: {}", slaveAddr, map); - - if (isSlaveDown(flags, masterLinkStatus)) { - log.warn("slave: {} is down", slaveAddr); - } else { - this.config.addSlaveAddress(uri.toString()); - log.info("slave: {} added", slaveAddr); + InetSocketAddress masterHost = resolveIP(master.getHost(), String.valueOf(master.getPort())).join(); + RedisURI masterUri = toURI(masterHost); + if (!master.isIP()) { + uri2hostname.put(masterUri, master.getHost()); } - } + this.config.setMasterAddress(masterUri.toString()); + currentMaster.set(masterUri); + log.info("master: {} added", masterHost); - List<CompletableFuture<Void>> connectionFutures = new LinkedList<>(); - if (cfg.isSentinelsDiscovery()) { - List<Map<String, String>> sentinelSentinels = connection.sync(StringCodec.INSTANCE, RedisCommands.SENTINEL_SENTINELS, cfg.getMasterName()); - for (Map<String, String> map : sentinelSentinels) { + List<Map<String, String>> sentinelSlaves = connection.sync(StringCodec.INSTANCE, RedisCommands.SENTINEL_SLAVES, cfg.getMasterName()); + for (Map<String, String> map : sentinelSlaves) { if (map.isEmpty()) { continue; } - String ip = map.get("ip"); + String host = map.get("ip"); String port = map.get("port"); + String flags = map.getOrDefault("flags", ""); + String masterLinkStatus = map.getOrDefault("master-link-status", ""); + + InetSocketAddress slaveAddr = resolveIP(host, port).join(); + RedisURI uri = toURI(slaveAddr); + if (isHostname(host)) { + uri2hostname.put(uri, host); + } - InetSocketAddress sentinelAddr = resolveIP(ip, port).join(); - CompletionStage<Void> future = registerSentinel(sentinelAddr); - connectionFutures.add(future.toCompletableFuture()); + log.debug("slave {} state: {}", slaveAddr, map); + + if (isSlaveDown(flags, masterLinkStatus)) { + log.warn("slave: {} is down", slaveAddr); + } else { + this.config.addSlaveAddress(uri.toString()); + log.info("slave: {} added", slaveAddr); + } + } + + if (cfg.isSentinelsDiscovery()) { + List<Map<String, String>> sentinelSentinels = connection.sync(StringCodec.INSTANCE, RedisCommands.SENTINEL_SENTINELS, cfg.getMasterName()); + for (Map<String, String> map : sentinelSentinels) { + if (map.isEmpty()) { + continue; + } + + String ip = map.get("ip"); + String port = map.get("port"); + + InetSocketAddress sentinelAddr = resolveIP(ip, port).join(); + CompletionStage<Void> future = registerSentinel(sentinelAddr); + connectionFutures.add(future.toCompletableFuture()); + } } } @@ -170,6 +172,7 @@ public class SentinelConnectionManager extends MasterSlaveConnectionManager { } catch (Exception e) { // skip } + break; } catch (RedisConnectionException e) { internalShutdown(); throw e;