From 3a8c75744808f5fa1d016fd9c19d0970260cbe39 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Fri, 14 Jun 2024 20:38:45 +0300 Subject: [PATCH] Fixed - Cluster failover handling #5857 --- .../java/org/redisson/cluster/ClusterConnectionManager.java | 4 +++- .../main/java/org/redisson/cluster/ClusterPartition.java | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/redisson/src/main/java/org/redisson/cluster/ClusterConnectionManager.java b/redisson/src/main/java/org/redisson/cluster/ClusterConnectionManager.java index 6691e4076..a148a79bd 100644 --- a/redisson/src/main/java/org/redisson/cluster/ClusterConnectionManager.java +++ b/redisson/src/main/java/org/redisson/cluster/ClusterConnectionManager.java @@ -36,6 +36,7 @@ import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReferenceArray; +import java.util.function.BinaryOperator; import java.util.function.Function; import java.util.stream.Collectors; @@ -983,7 +984,8 @@ public class ClusterConnectionManager extends MasterSlaveConnectionManager { } private Collection getLastPartitions() { - return new HashSet<>(lastUri2Partition.values()); + return lastUri2Partition.values().stream().collect(Collectors.toMap(e -> e.getNodeId(), Function.identity(), + BinaryOperator.maxBy(Comparator.comparing(e -> e.getTime())))).values(); } public int getSlot(MasterSlaveEntry entry) { diff --git a/redisson/src/main/java/org/redisson/cluster/ClusterPartition.java b/redisson/src/main/java/org/redisson/cluster/ClusterPartition.java index 8988b4e78..b81d0f1ad 100644 --- a/redisson/src/main/java/org/redisson/cluster/ClusterPartition.java +++ b/redisson/src/main/java/org/redisson/cluster/ClusterPartition.java @@ -45,6 +45,8 @@ public class ClusterPartition { private ClusterPartition parent; private int references; + + private long time = System.currentTimeMillis(); public ClusterPartition(String nodeId) { super(); @@ -150,6 +152,10 @@ public class ClusterPartition { return --references; } + public long getTime() { + return time; + } + @Override public int hashCode() { return Objects.hash(nodeId);