From b7cfd1ff0fb3b32cc6445b72d8d2ee63aa624e6b Mon Sep 17 00:00:00 2001 From: xujie Date: Wed, 16 Dec 2020 16:34:16 +0800 Subject: [PATCH] fix: add initing status in entry, and set entry freezed status null when all connection inited Signed-off-by: xujie --- .../connection/ClientConnectionsEntry.java | 11 +++++++++++ .../balancer/LoadBalancerManager.java | 18 ++++++++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/redisson/src/main/java/org/redisson/connection/ClientConnectionsEntry.java b/redisson/src/main/java/org/redisson/connection/ClientConnectionsEntry.java index 85f1ede7c..36d84a68f 100644 --- a/redisson/src/main/java/org/redisson/connection/ClientConnectionsEntry.java +++ b/redisson/src/main/java/org/redisson/connection/ClientConnectionsEntry.java @@ -56,6 +56,8 @@ public class ClientConnectionsEntry { private final AtomicLong firstFailTime = new AtomicLong(0); + private volatile boolean initing = false; + public ClientConnectionsEntry(RedisClient client, int poolMinSize, int poolMaxSize, int subscribePoolMinSize, int subscribePoolMaxSize, ConnectionManager connectionManager, NodeType nodeType) { this.client = client; @@ -81,10 +83,19 @@ public class ClientConnectionsEntry { && connectionManager.getConfig().getReadMode() == ReadMode.MASTER_SLAVE && getNodeType() == NodeType.MASTER; } + + public boolean isIniting() { + return this.initing; + } + + public void setIniting(boolean isIniting) { + this.initing = isIniting; + } public void setNodeType(NodeType nodeType) { this.nodeType = nodeType; } + public NodeType getNodeType() { return nodeType; } diff --git a/redisson/src/main/java/org/redisson/connection/balancer/LoadBalancerManager.java b/redisson/src/main/java/org/redisson/connection/balancer/LoadBalancerManager.java index fe0fe64c0..2eff458fc 100644 --- a/redisson/src/main/java/org/redisson/connection/balancer/LoadBalancerManager.java +++ b/redisson/src/main/java/org/redisson/connection/balancer/LoadBalancerManager.java @@ -138,12 +138,18 @@ public class LoadBalancerManager { if (freezeReason != FreezeReason.RECONNECT || entry.getFreezeReason() == FreezeReason.RECONNECT) { - entry.resetFirstFail(); - entry.setFreezeReason(null); - - slaveConnectionPool.initConnections(entry); - pubSubConnectionPool.initConnections(entry); - return true; + if (!entry.isIniting()) { + entry.setIniting(true); + entry.resetFirstFail(); + slaveConnectionPool.initConnections(entry).onComplete((r, ex) -> { + entry.setIniting(false); + if (ex == null) { + entry.setFreezeReason(null); + } + }); + pubSubConnectionPool.initConnections(entry); + return true; + } } } return false;