From 088006169e134ebc6c9541080853f7f25d27358e Mon Sep 17 00:00:00 2001 From: mika Date: Mon, 8 Mar 2021 10:12:01 +0800 Subject: [PATCH 1/5] fix: ClientConnectionsEntry reconnect error Signed-off-by: mika --- .../balancer/LoadBalancerManager.java | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) 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 0b400ce64..08d69e0df 100644 --- a/redisson/src/main/java/org/redisson/connection/balancer/LoadBalancerManager.java +++ b/redisson/src/main/java/org/redisson/connection/balancer/LoadBalancerManager.java @@ -20,6 +20,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.BiConsumer; import org.redisson.api.NodeType; @@ -148,9 +149,33 @@ public class LoadBalancerManager { } }; listener.setCounter(2); - BiConsumer initCallBack = (r, ex) -> { - if (ex == null) { - listener.decCounter(); + BiConsumer initCallBack = new BiConsumer() { + private AtomicBoolean initConnError = new AtomicBoolean(false); + @Override + public void accept(Void r, Throwable ex) { + synchronized (this) { + if (ex == null) { + listener.decCounter(); + } else { + if (!initConnError.compareAndSet(false, true)) { + return; + } + for (RedisConnection connection : entry.getAllConnections()) { + if (!connection.isClosed()) { + connection.closeAsync(); + } + } + entry.getAllConnections().clear(); + + for (RedisConnection connection : entry.getAllSubscribeConnections()) { + if (!connection.isClosed()) { + connection.closeAsync(); + } + } + entry.getAllSubscribeConnections().clear(); + entry.setInitialized(false); + } + } } }; entry.resetFirstFail(); From 3619e434dff880dbe0dfce12f29593b2e017e104 Mon Sep 17 00:00:00 2001 From: mika Date: Mon, 8 Mar 2021 19:03:24 +0800 Subject: [PATCH 2/5] refactor Signed-off-by: xujie --- .../connection/ClientConnectionsEntry.java | 18 +++++++++++ .../balancer/LoadBalancerManager.java | 30 +++++-------------- .../connection/pool/ConnectionPool.java | 18 ++--------- 3 files changed, 29 insertions(+), 37 deletions(-) diff --git a/redisson/src/main/java/org/redisson/connection/ClientConnectionsEntry.java b/redisson/src/main/java/org/redisson/connection/ClientConnectionsEntry.java index 8f73953cb..ebe249ddc 100644 --- a/redisson/src/main/java/org/redisson/connection/ClientConnectionsEntry.java +++ b/redisson/src/main/java/org/redisson/connection/ClientConnectionsEntry.java @@ -259,6 +259,24 @@ public class ClientConnectionsEntry { freeSubscribeConnectionsCounter.release(); } + public void closeAllConnections() { + synchronized (this) { + for (RedisConnection connection : this.getAllConnections()) { + if (!connection.isClosed()) { + connection.closeAsync(); + } + } + this.getAllConnections().clear(); + + for (RedisConnection connection : this.getAllSubscribeConnections()) { + if (!connection.isClosed()) { + connection.closeAsync(); + } + } + this.getAllSubscribeConnections().clear(); + } + } + @Override public String toString() { return "[freeSubscribeConnectionsAmount=" + freeSubscribeConnections.size() 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 08d69e0df..64d5baf77 100644 --- a/redisson/src/main/java/org/redisson/connection/balancer/LoadBalancerManager.java +++ b/redisson/src/main/java/org/redisson/connection/balancer/LoadBalancerManager.java @@ -153,28 +153,14 @@ public class LoadBalancerManager { private AtomicBoolean initConnError = new AtomicBoolean(false); @Override public void accept(Void r, Throwable ex) { - synchronized (this) { - if (ex == null) { - listener.decCounter(); - } else { - if (!initConnError.compareAndSet(false, true)) { - return; - } - for (RedisConnection connection : entry.getAllConnections()) { - if (!connection.isClosed()) { - connection.closeAsync(); - } - } - entry.getAllConnections().clear(); - - for (RedisConnection connection : entry.getAllSubscribeConnections()) { - if (!connection.isClosed()) { - connection.closeAsync(); - } - } - entry.getAllSubscribeConnections().clear(); - entry.setInitialized(false); + if (ex == null) { + listener.decCounter(); + } else { + if (!initConnError.compareAndSet(false, true)) { + return; } + entry.closeAllConnections(); + entry.setInitialized(false); } } }; @@ -187,7 +173,7 @@ public class LoadBalancerManager { } return false; } - + public ClientConnectionsEntry freeze(RedisURI address, FreezeReason freezeReason) { ClientConnectionsEntry connectionEntry = getEntry(address); return freeze(connectionEntry, freezeReason); diff --git a/redisson/src/main/java/org/redisson/connection/pool/ConnectionPool.java b/redisson/src/main/java/org/redisson/connection/pool/ConnectionPool.java index f20950110..f5445ab14 100644 --- a/redisson/src/main/java/org/redisson/connection/pool/ConnectionPool.java +++ b/redisson/src/main/java/org/redisson/connection/pool/ConnectionPool.java @@ -131,21 +131,9 @@ abstract class ConnectionPool { if (initPromise.isDone()) { return; } - - for (RedisConnection connection : entry.getAllConnections()) { - if (!connection.isClosed()) { - connection.closeAsync(); - } - } - entry.getAllConnections().clear(); - - for (RedisConnection connection : entry.getAllSubscribeConnections()) { - if (!connection.isClosed()) { - connection.closeAsync(); - } - } - entry.getAllSubscribeConnections().clear(); - + + entry.closeAllConnections(); + int totalInitializedConnections = minimumIdleSize - initializedConnections.get(); String errorMsg; if (totalInitializedConnections == 0) { From 74b41c2ce6a0784dac9b50315dcc8c30dbf0a225 Mon Sep 17 00:00:00 2001 From: xujie Date: Mon, 8 Mar 2021 19:56:14 +0800 Subject: [PATCH 3/5] fix: repeat close and remove connection Signed-off-by: xujie --- .../connection/ClientConnectionsEntry.java | 18 ------------------ .../balancer/LoadBalancerManager.java | 1 - .../connection/pool/ConnectionPool.java | 14 +++++++++++++- 3 files changed, 13 insertions(+), 20 deletions(-) diff --git a/redisson/src/main/java/org/redisson/connection/ClientConnectionsEntry.java b/redisson/src/main/java/org/redisson/connection/ClientConnectionsEntry.java index ebe249ddc..8f73953cb 100644 --- a/redisson/src/main/java/org/redisson/connection/ClientConnectionsEntry.java +++ b/redisson/src/main/java/org/redisson/connection/ClientConnectionsEntry.java @@ -259,24 +259,6 @@ public class ClientConnectionsEntry { freeSubscribeConnectionsCounter.release(); } - public void closeAllConnections() { - synchronized (this) { - for (RedisConnection connection : this.getAllConnections()) { - if (!connection.isClosed()) { - connection.closeAsync(); - } - } - this.getAllConnections().clear(); - - for (RedisConnection connection : this.getAllSubscribeConnections()) { - if (!connection.isClosed()) { - connection.closeAsync(); - } - } - this.getAllSubscribeConnections().clear(); - } - } - @Override public String toString() { return "[freeSubscribeConnectionsAmount=" + freeSubscribeConnections.size() 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 64d5baf77..5069a0d72 100644 --- a/redisson/src/main/java/org/redisson/connection/balancer/LoadBalancerManager.java +++ b/redisson/src/main/java/org/redisson/connection/balancer/LoadBalancerManager.java @@ -159,7 +159,6 @@ public class LoadBalancerManager { if (!initConnError.compareAndSet(false, true)) { return; } - entry.closeAllConnections(); entry.setInitialized(false); } } diff --git a/redisson/src/main/java/org/redisson/connection/pool/ConnectionPool.java b/redisson/src/main/java/org/redisson/connection/pool/ConnectionPool.java index f5445ab14..7e1df96cf 100644 --- a/redisson/src/main/java/org/redisson/connection/pool/ConnectionPool.java +++ b/redisson/src/main/java/org/redisson/connection/pool/ConnectionPool.java @@ -132,7 +132,19 @@ abstract class ConnectionPool { return; } - entry.closeAllConnections(); + for (RedisConnection connection : entry.getAllConnections()) { + if (!connection.isClosed()) { + connection.closeAsync(); + } + } + entry.getAllConnections().clear(); + + for (RedisConnection connection : entry.getAllSubscribeConnections()) { + if (!connection.isClosed()) { + connection.closeAsync(); + } + } + entry.getAllSubscribeConnections().clear(); int totalInitializedConnections = minimumIdleSize - initializedConnections.get(); String errorMsg; From 68c271941fff6f9859bc00fc847eedce02ea7a9f Mon Sep 17 00:00:00 2001 From: xujie Date: Tue, 9 Mar 2021 09:00:47 +0800 Subject: [PATCH 4/5] refactor: remove some empty lines Signed-off-by: xujie --- .../main/java/org/redisson/connection/pool/ConnectionPool.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/redisson/src/main/java/org/redisson/connection/pool/ConnectionPool.java b/redisson/src/main/java/org/redisson/connection/pool/ConnectionPool.java index 7e1df96cf..839cacb2e 100644 --- a/redisson/src/main/java/org/redisson/connection/pool/ConnectionPool.java +++ b/redisson/src/main/java/org/redisson/connection/pool/ConnectionPool.java @@ -131,21 +131,18 @@ abstract class ConnectionPool { if (initPromise.isDone()) { return; } - for (RedisConnection connection : entry.getAllConnections()) { if (!connection.isClosed()) { connection.closeAsync(); } } entry.getAllConnections().clear(); - for (RedisConnection connection : entry.getAllSubscribeConnections()) { if (!connection.isClosed()) { connection.closeAsync(); } } entry.getAllSubscribeConnections().clear(); - int totalInitializedConnections = minimumIdleSize - initializedConnections.get(); String errorMsg; if (totalInitializedConnections == 0) { From 14d1bcde24319262782d0672c6dc50a4d2f4b8ef Mon Sep 17 00:00:00 2001 From: xujie Date: Tue, 9 Mar 2021 15:00:02 +0800 Subject: [PATCH 5/5] refactor: rollback change Signed-off-by: xujie --- .../main/java/org/redisson/connection/pool/ConnectionPool.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/redisson/src/main/java/org/redisson/connection/pool/ConnectionPool.java b/redisson/src/main/java/org/redisson/connection/pool/ConnectionPool.java index 839cacb2e..f20950110 100644 --- a/redisson/src/main/java/org/redisson/connection/pool/ConnectionPool.java +++ b/redisson/src/main/java/org/redisson/connection/pool/ConnectionPool.java @@ -131,18 +131,21 @@ abstract class ConnectionPool { if (initPromise.isDone()) { return; } + for (RedisConnection connection : entry.getAllConnections()) { if (!connection.isClosed()) { connection.closeAsync(); } } entry.getAllConnections().clear(); + for (RedisConnection connection : entry.getAllSubscribeConnections()) { if (!connection.isClosed()) { connection.closeAsync(); } } entry.getAllSubscribeConnections().clear(); + int totalInitializedConnections = minimumIdleSize - initializedConnections.get(); String errorMsg; if (totalInitializedConnections == 0) {