From ca8c7f88a14148fc6f74520b6d7a2ca5330bb241 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Fri, 30 Nov 2018 15:30:24 +0300 Subject: [PATCH] Fixed - RoundRobinLoadBalancer doesn't distribute load equally if one of slave nodes was failed #1766 --- .../redisson/connection/pool/ConnectionPool.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 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 0ba1552b8..e8fb19737 100644 --- a/redisson/src/main/java/org/redisson/connection/pool/ConnectionPool.java +++ b/redisson/src/main/java/org/redisson/connection/pool/ConnectionPool.java @@ -16,6 +16,7 @@ package org.redisson.connection.pool; import java.net.InetSocketAddress; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -187,13 +188,16 @@ abstract class ConnectionPool { public RFuture get(RedisCommand command) { List entriesCopy = new LinkedList(entries); + for (Iterator iterator = entriesCopy.iterator(); iterator.hasNext();) { + ClientConnectionsEntry entry = iterator.next(); + if (!((!entry.isFreezed() || entry.isMasterForRead()) && + tryAcquireConnection(entry))) { + iterator.remove(); + } + } while (!entriesCopy.isEmpty()) { ClientConnectionsEntry entry = config.getLoadBalancer().getEntry(entriesCopy); - if ((!entry.isFreezed() || entry.isMasterForRead()) && - tryAcquireConnection(entry)) { - return acquireConnection(command, entry); - } - entriesCopy.remove(entry); + return acquireConnection(command, entry); } List failed = new LinkedList(); @@ -252,7 +256,7 @@ abstract class ConnectionPool { if (entry.getNodeType() == NodeType.SLAVE && entry.isFailed()) { checkForReconnect(entry, null); return false; - } + } return true; }