Fixed - connections to disconnected Redis nodes aren't removed in sentinel and cluster mode. #2539

pull/2563/head
Nikita Koksharov 5 years ago
parent 603552df55
commit 7d4ee01171

@ -430,6 +430,7 @@ public class ClusterConnectionManager extends MasterSlaveConnectionManager {
for (RedisURI uri : failedSlaves) {
currentPart.addFailedSlaveAddress(uri);
if (entry.slaveDown(uri, FreezeReason.MANAGER)) {
disconnectNode(uri);
log.warn("slave: {} has down for slot ranges: {}", uri, currentPart.getSlotRanges());
}
}
@ -502,14 +503,16 @@ public class ClusterConnectionManager extends MasterSlaveConnectionManager {
if (!newMasterPart.getMasterAddress().equals(currentPart.getMasterAddress())) {
RedisURI newUri = newMasterPart.getMasterAddress();
RedisURI oldUri = currentPart.getMasterAddress();
RFuture<RedisClient> future = changeMaster(slot, newUri);
future.onComplete((res, e) -> {
if (e != null) {
currentPart.setMasterAddress(oldUri);
} else {
disconnectNode(oldUri);
}
});
currentPart.setMasterAddress(newUri);
}
}

@ -244,8 +244,22 @@ public class MasterSlaveConnectionManager implements ConnectionManager {
conn.closeAsync();
}
}
protected RFuture<RedisConnection> connectToNode(BaseMasterSlaveServersConfig<?> cfg, RedisURI addr, RedisClient client, String sslHostname) {
protected final void disconnectNode(RedisURI addr) {
RedisConnection conn = nodeConnections.remove(addr);
if (conn != null) {
conn.closeAsync();
}
}
protected final void disconnectNode(RedisClient client) {
RedisConnection conn = nodeConnections.remove(client);
if (conn != null) {
conn.closeAsync();
}
}
protected final RFuture<RedisConnection> connectToNode(BaseMasterSlaveServersConfig<?> cfg, RedisURI addr, RedisClient client, String sslHostname) {
final Object key;
if (client != null) {
key = client;

@ -474,6 +474,7 @@ public class SentinelConnectionManager extends MasterSlaveConnectionManager {
for (RedisURI uri : currentUris) {
RedisClient sentinel = SentinelConnectionManager.this.sentinels.remove(uri);
if (sentinel != null) {
disconnectNode(sentinel);
sentinel.shutdownAsync();
log.warn("sentinel: {} has down", uri);
}

Loading…
Cancel
Save