From 045948eb212ec7fd3e0179b8abb31c7e47f987c8 Mon Sep 17 00:00:00 2001 From: ofekshenawa Date: Wed, 7 May 2025 18:03:01 +0300 Subject: [PATCH] fix: prevent routing reads to loading slave nodes --- osscluster.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/osscluster.go b/osscluster.go index c0278ed05..8055ef020 100644 --- a/osscluster.go +++ b/osscluster.go @@ -445,6 +445,14 @@ func (n *clusterNode) SetLastLatencyMeasurement(t time.Time) { } } +func (n *clusterNode) Loading() bool { + ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) + defer cancel() + + err := n.Client.Ping(ctx).Err() + return err != nil && isLoadingError(err) +} + //------------------------------------------------------------------------------ type clusterNodes struct { @@ -754,7 +762,8 @@ func (c *clusterState) slotSlaveNode(slot int) (*clusterNode, error) { case 1: return nodes[0], nil case 2: - if slave := nodes[1]; !slave.Failing() { + slave := nodes[1] + if !slave.Failing() && !slave.Loading() { return slave, nil } return nodes[0], nil @@ -763,7 +772,7 @@ func (c *clusterState) slotSlaveNode(slot int) (*clusterNode, error) { for i := 0; i < 10; i++ { n := rand.Intn(len(nodes)-1) + 1 slave = nodes[n] - if !slave.Failing() { + if !slave.Failing() && !slave.Loading() { return slave, nil } }