From a36f9df3cc3c2202b9e678301aaf9e8ec14a76e8 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Wed, 12 Oct 2022 11:17:44 +0300 Subject: [PATCH] Fixed - continues "Unable to unfreeze entry" in sentinel mode. #4584 --- .../redisson/connection/MasterSlaveEntry.java | 35 ++++++++----------- .../connection/SentinelConnectionManager.java | 8 +++-- .../connection/pool/ConnectionPool.java | 10 +++--- 3 files changed, 26 insertions(+), 27 deletions(-) diff --git a/redisson/src/main/java/org/redisson/connection/MasterSlaveEntry.java b/redisson/src/main/java/org/redisson/connection/MasterSlaveEntry.java index 9093d7161..57f707e74 100644 --- a/redisson/src/main/java/org/redisson/connection/MasterSlaveEntry.java +++ b/redisson/src/main/java/org/redisson/connection/MasterSlaveEntry.java @@ -157,15 +157,6 @@ public class MasterSlaveEntry { }); } - public boolean slaveDown(ClientConnectionsEntry entry, FreezeReason freezeReason) { - ClientConnectionsEntry e = slaveBalancer.freeze(entry, freezeReason); - if (e == null) { - return false; - } - - return slaveDown(entry); - } - public boolean slaveDown(InetSocketAddress address, FreezeReason freezeReason) { ClientConnectionsEntry entry = slaveBalancer.freeze(address, freezeReason); if (entry == null) { @@ -184,15 +175,6 @@ public class MasterSlaveEntry { return slaveDownAsync(entry); } - public boolean slaveDown(RedisURI address, FreezeReason freezeReason) { - ClientConnectionsEntry entry = slaveBalancer.freeze(address, freezeReason); - if (entry == null) { - return false; - } - - return slaveDown(entry); - } - public CompletableFuture slaveDownAsync(RedisURI address, FreezeReason freezeReason) { ClientConnectionsEntry entry = slaveBalancer.freeze(address, freezeReason); if (entry == null) { @@ -208,7 +190,9 @@ public class MasterSlaveEntry { } // add master as slave if no more slaves available - if (!config.checkSkipSlavesInit() && slaveBalancer.getAvailableClients() == 0) { + if (!config.checkSkipSlavesInit() + && !masterEntry.getClient().getAddr().equals(entry.getClient().getAddr()) + && slaveBalancer.getAvailableClients() == 0) { if (slaveBalancer.unfreeze(masterEntry.getClient().getAddr(), FreezeReason.SYSTEM)) { log.info("master {} used as slave", masterEntry.getClient().getAddr()); } @@ -217,13 +201,24 @@ public class MasterSlaveEntry { return nodeDown(entry); } + public CompletableFuture slaveDownAsync(ClientConnectionsEntry entry, FreezeReason freezeReason) { + ClientConnectionsEntry e = slaveBalancer.freeze(entry, freezeReason); + if (e == null) { + return CompletableFuture.completedFuture(false); + } + + return slaveDownAsync(entry); + } + private CompletableFuture slaveDownAsync(ClientConnectionsEntry entry) { if (entry.isMasterForRead()) { return CompletableFuture.completedFuture(false); } // add master as slave if no more slaves available - if (!config.checkSkipSlavesInit() && slaveBalancer.getAvailableClients() == 0) { + if (!config.checkSkipSlavesInit() + && !masterEntry.getClient().getAddr().equals(entry.getClient().getAddr()) + && slaveBalancer.getAvailableClients() == 0) { CompletableFuture f = slaveBalancer.unfreezeAsync(masterEntry.getClient().getAddr(), FreezeReason.SYSTEM); return f.thenApply(value -> { if (value) { diff --git a/redisson/src/main/java/org/redisson/connection/SentinelConnectionManager.java b/redisson/src/main/java/org/redisson/connection/SentinelConnectionManager.java index 475f1acdb..679d16b71 100755 --- a/redisson/src/main/java/org/redisson/connection/SentinelConnectionManager.java +++ b/redisson/src/main/java/org/redisson/connection/SentinelConnectionManager.java @@ -615,9 +615,11 @@ public class SentinelConnectionManager extends MasterSlaveConnectionManager { log.warn("slave: {} is down", uri); } else { MasterSlaveEntry entry = getEntry(singleSlotRange.getStartSlot()); - if (entry.slaveDown(uri, FreezeReason.MANAGER)) { - log.warn("slave: {} is down", uri); - } + entry.slaveDownAsync(uri, FreezeReason.MANAGER).thenAccept(r -> { + if (r) { + log.warn("slave: {} is down", uri); + } + }); } } 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 fd2747667..9ddc2f740 100644 --- a/redisson/src/main/java/org/redisson/connection/pool/ConnectionPool.java +++ b/redisson/src/main/java/org/redisson/connection/pool/ConnectionPool.java @@ -339,12 +339,14 @@ abstract class ConnectionPool { } private void checkForReconnect(ClientConnectionsEntry entry, Throwable cause) { - if (masterSlaveEntry.slaveDown(entry, FreezeReason.RECONNECT)) { - log.error("slave " + entry.getClient().getAddr() + " has been disconnected after " + masterSlaveEntry.slaveDownAsync(entry, FreezeReason.RECONNECT).thenAccept(r -> { + if (r) { + log.error("slave " + entry.getClient().getAddr() + " has been disconnected after " + config.getFailedSlaveCheckInterval() + " ms interval since moment of the first failed connection", cause); - scheduleCheck(entry); + scheduleCheck(entry); } - } + }); + } private void scheduleCheck(ClientConnectionsEntry entry) {