From 715e4db0c538add15fd3bc0da278f7c97bb518ef Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Mon, 13 Dec 2021 12:50:01 +0300 Subject: [PATCH] Fixed - master node shouldn't be initialized as slave in single mode. #4011 --- .../cluster/ClusterConnectionManager.java | 7 +++++- .../MasterSlaveConnectionManager.java | 2 +- .../redisson/connection/MasterSlaveEntry.java | 24 +++++++------------ 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/redisson/src/main/java/org/redisson/cluster/ClusterConnectionManager.java b/redisson/src/main/java/org/redisson/cluster/ClusterConnectionManager.java index c193ceaae..06d73aab7 100644 --- a/redisson/src/main/java/org/redisson/cluster/ClusterConnectionManager.java +++ b/redisson/src/main/java/org/redisson/cluster/ClusterConnectionManager.java @@ -311,7 +311,12 @@ public class ClusterConnectionManager extends MasterSlaveConnectionManager { } if (!config.checkSkipSlavesInit()) { - List> fs = entry.initSlaveBalancer(partition.getFailedSlaveAddresses(), masterClient, configEndpointHostName); + List> fs = entry.initSlaveBalancer(partition.getFailedSlaveAddresses(), configEndpointHostName); + if (fs.isEmpty()) { + result.trySuccess(null); + return; + } + AtomicInteger counter = new AtomicInteger(fs.size()); AtomicInteger errorCounter = new AtomicInteger(fs.size()); for (RFuture future : fs) { diff --git a/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java b/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java index 67232cffd..73653a8c2 100644 --- a/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java +++ b/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java @@ -337,7 +337,7 @@ public class MasterSlaveConnectionManager implements ConnectionManager { masterFuture.syncUninterruptibly(); if (!config.checkSkipSlavesInit()) { - List> fs = masterSlaveEntry.initSlaveBalancer(getDisconnectedNodes(), masterFuture.getNow()); + List> fs = masterSlaveEntry.initSlaveBalancer(getDisconnectedNodes()); for (RFuture future : fs) { future.syncUninterruptibly(); } diff --git a/redisson/src/main/java/org/redisson/connection/MasterSlaveEntry.java b/redisson/src/main/java/org/redisson/connection/MasterSlaveEntry.java index 810b5bed7..fa8f41898 100644 --- a/redisson/src/main/java/org/redisson/connection/MasterSlaveEntry.java +++ b/redisson/src/main/java/org/redisson/connection/MasterSlaveEntry.java @@ -79,21 +79,15 @@ public class MasterSlaveEntry { return config; } - public List> initSlaveBalancer(Collection disconnectedNodes, RedisClient master) { - return initSlaveBalancer(disconnectedNodes, master, null); + public List> initSlaveBalancer(Collection disconnectedNodes) { + return initSlaveBalancer(disconnectedNodes, null); } - public List> initSlaveBalancer(Collection disconnectedNodes, RedisClient master, String slaveSSLHostname) { - boolean freezeMasterAsSlave = !config.getSlaveAddresses().isEmpty() - && !config.checkSkipSlavesInit() - && disconnectedNodes.size() < config.getSlaveAddresses().size(); - - List> result = new LinkedList>(); - RFuture f = addSlave(master.getAddr(), master.getConfig().getAddress(), freezeMasterAsSlave, NodeType.MASTER, master.getConfig().getSslHostname()); - result.add(f); + public List> initSlaveBalancer(Collection disconnectedNodes, String slaveSSLHostname) { + List> result = new ArrayList<>(config.getSlaveAddresses().size()); for (String address : config.getSlaveAddresses()) { RedisURI uri = new RedisURI(address); - f = addSlave(uri, disconnectedNodes.contains(uri), NodeType.SLAVE, slaveSSLHostname); + RFuture f = addSlave(uri, disconnectedNodes.contains(uri), NodeType.SLAVE, slaveSSLHostname); result.add(f); } return result; @@ -139,7 +133,7 @@ public class MasterSlaveEntry { List> futures = new ArrayList<>(); if (!config.checkSkipSlavesInit() && !slaveBalancer.contains(client.getAddr())) { RFuture masterAsSlaveFuture = addSlave(client.getAddr(), client.getConfig().getAddress(), - false, NodeType.MASTER, client.getConfig().getSslHostname()); + true, NodeType.MASTER, client.getConfig().getSslHostname()); futures.add(masterAsSlaveFuture.toCompletableFuture()); } @@ -477,10 +471,10 @@ public class MasterSlaveEntry { // freeze in slaveBalancer slaveDown(oldMaster.getClient().getAddr(), FreezeReason.MANAGER); - // more than one slave available, so master can be removed from slaves + // check if at least one slave is available, use master as slave if false if (!config.checkSkipSlavesInit() - && slaveBalancer.getAvailableClients() > 1) { - slaveDown(newMasterClient.getAddr(), FreezeReason.SYSTEM); + && slaveBalancer.getAvailableClients() == 0) { + slaveUp(newMasterClient.getAddr(), FreezeReason.SYSTEM); } oldMaster.shutdownAsync(); log.info("master {} has changed to {}", oldMaster.getClient().getAddr(), masterEntry.getClient().getAddr());